@koda-sl/baker-cli 0.571.0 → 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.
- package/README.md +6 -5
- package/dist/account-6RJ6ZI3B.js +82 -0
- package/dist/account-AIGNJ2RP.js +82 -0
- package/dist/account-E5LLPRZ6.js +139 -0
- package/dist/account-assets-J6SVHSXR.js +290 -0
- package/dist/account-level-FGE33OJT.js +612 -0
- package/dist/account-level-FGE33OJT.js.map +1 -0
- package/dist/account-reads-BNVCJ37E.js +220 -0
- package/dist/account-reads-BNVCJ37E.js.map +1 -0
- package/dist/account-users-MFH5CJIA.js +65 -0
- package/dist/account-users-MFH5CJIA.js.map +1 -0
- package/dist/account-writes-XNS4IKZV.js +68 -0
- package/dist/accounts-3ZWYGRVM.js +80 -0
- package/dist/accounts-5TLHSEZR.js +119 -0
- package/dist/accounts-BAZYYDFV.js +713 -0
- package/dist/accounts-L2HVNJUF.js +76 -0
- package/dist/accounts-NTBIRB52.js +115 -0
- package/dist/actions-N2FBJMT4.js +55 -0
- package/dist/active-entities-IJPRN45K.js +103 -0
- package/dist/activecampaign-U77COT2F.js +938 -0
- package/dist/activities-SS3SUWSS.js +75 -0
- package/dist/ad-group-writes-DTQSUNE2.js +172 -0
- package/dist/ad-groups-CX23GLVE.js +70 -0
- package/dist/ad-writes-HAAUOJCG.js +176 -0
- package/dist/add-ABPQTO2M.js +305 -0
- package/dist/add-BK6N7KWU.js +97 -0
- package/dist/add-ECN2FTMH.js +85 -0
- package/dist/add-FH7OVKFF.js +148 -0
- package/dist/add-KHY3H54G.js +81 -0
- package/dist/add-MZZLFU3M.js +513 -0
- package/dist/add-MZZLFU3M.js.map +1 -0
- package/dist/add-VDH2VCXR.js +107 -0
- package/dist/add-accounts-6JAOSCXK.js +91 -0
- package/dist/ads-BEMEXBDJ.js +128 -0
- package/dist/ads-GAU2XKNL.js +48 -0
- package/dist/ads-HZOXZ3FY.js +79 -0
- package/dist/ads-I5OBZ5VI.js +120 -0
- package/dist/adsets-PMQGA6TW.js +182 -0
- package/dist/advertisers-EOLL3VFQ.js +123 -0
- package/dist/advertisers-FNKY2PP4.js +125 -0
- package/dist/analytics-DOAUCF2Y.js +2437 -0
- package/dist/analytics-MR3T34KN.js +447 -0
- package/dist/animate-EKGVDSWM.js +480 -0
- package/dist/approved-WQL4Z4EB.js +73 -0
- package/dist/asset-writes-A5X2T6LQ.js +51 -0
- package/dist/assign-UMNHINRA.js +80 -0
- package/dist/audience-size-Q7DZ6TGM.js +76 -0
- package/dist/audience-writes-SNFFF2QR.js +328 -0
- package/dist/audience-writes-SNFFF2QR.js.map +1 -0
- package/dist/audiences-HBJGEGKL.js +106 -0
- package/dist/audiences-RDQZNGPI.js +280 -0
- package/dist/audiences-TA636UBN.js +85 -0
- package/dist/audit-H3F6FZNE.js +154 -0
- package/dist/audit-QMCK76AT.js +88 -0
- package/dist/autocomplete-DIBJ57VC.js +114 -0
- package/dist/avatars-UIXRGLPA.js +38 -0
- package/dist/bid-pricing-OMY2F2SB.js +103 -0
- package/dist/brand-WV6CAU3M.js +22 -0
- package/dist/brief-PNBP56X2.js +543 -0
- package/dist/brief-PNBP56X2.js.map +1 -0
- package/dist/businesses-56IUB5X4.js +54 -0
- package/dist/campaign-groups-PGJIQV4S.js +99 -0
- package/dist/campaign-writes-MAJ5FGXG.js +176 -0
- package/dist/campaign-writes-WL3YAEGJ.js +168 -0
- package/dist/campaigns-5L4ZTGF7.js +130 -0
- package/dist/campaigns-EK7EUKZD.js +113 -0
- package/dist/campaigns-HCJ3AIDK.js +78 -0
- package/dist/campaigns-NHACWGWS.js +111 -0
- package/dist/canvas-INL3J7HO.js +46 -0
- package/dist/capabilities-Y33EWDMJ.js +147 -0
- package/dist/cards-IWWKA5WH.js +85 -0
- package/dist/catalog-NSA2FUI2.js +66 -0
- package/dist/catalogs-QOE2V4QK.js +783 -0
- package/dist/catalogs-QOE2V4QK.js.map +1 -0
- package/dist/catalogs-SJMYID7N.js +130 -0
- package/dist/changes-2HOF2HSV.js +167 -0
- package/dist/chatgpt-J6MNVQVT.js +47 -0
- package/dist/chats-4HK6UYD2.js +584 -0
- package/dist/check-DJOIL56P.js +169 -0
- package/dist/check-DJOIL56P.js.map +1 -0
- package/dist/chunk-2B2JFTWI.js +296 -0
- package/dist/chunk-2HWX6AWY.js +2235 -0
- package/dist/chunk-2O5CCKV7.js +23 -0
- package/dist/chunk-2W6DMVGH.js +8954 -0
- package/dist/chunk-3BKESS5W.js +66 -0
- package/dist/chunk-3VBPJQ7L.js +288 -0
- package/dist/chunk-3X262BEG.js +19 -0
- package/dist/chunk-4CUBOXBS.js +99 -0
- package/dist/chunk-4CUBOXBS.js.map +1 -0
- package/dist/chunk-4CYB33V3.js +136 -0
- package/dist/chunk-4JB556VC.js +142 -0
- package/dist/chunk-4LZNCDHU.js +46 -0
- package/dist/chunk-4LZNCDHU.js.map +1 -0
- package/dist/chunk-4QYZJPSM.js +207 -0
- package/dist/chunk-4WLJYLRL.js +544 -0
- package/dist/chunk-55AX6DOP.js +86 -0
- package/dist/chunk-55AX6DOP.js.map +1 -0
- package/dist/chunk-56ZJO7TM.js +1320 -0
- package/dist/chunk-5LQGW5UF.js +138 -0
- package/dist/chunk-5U6OL4NN.js +709 -0
- package/dist/chunk-5U6OL4NN.js.map +1 -0
- package/dist/chunk-6IL7JFX5.js +203 -0
- package/dist/chunk-6LNCKT6S.js +35 -0
- package/dist/chunk-6LUDG5AB.js +476 -0
- package/dist/chunk-6OIKNJ7G.js +26 -0
- package/dist/chunk-6UQV5DOD.js +45 -0
- package/dist/chunk-6V4UAC5I.js +2523 -0
- package/dist/chunk-6V4UAC5I.js.map +1 -0
- package/dist/chunk-6WA7QSCN.js +46 -0
- package/dist/chunk-7CHPHER2.js +455 -0
- package/dist/chunk-7J7ASYIM.js +225 -0
- package/dist/chunk-7MMTIJO3.js +220 -0
- package/dist/chunk-7Y3LKR4P.js +5368 -0
- package/dist/chunk-AA3D7GZF.js +125 -0
- package/dist/chunk-AGL7EWP2.js +75 -0
- package/dist/chunk-AHVD6IEI.js +76 -0
- package/dist/chunk-ASJMLTMX.js +106 -0
- package/dist/chunk-AWENMEFC.js +297 -0
- package/dist/chunk-AYX7PB2L.js +1920 -0
- package/dist/chunk-BHZLKLK7.js +69 -0
- package/dist/chunk-BVER7I36.js +58 -0
- package/dist/chunk-C3RZNVLM.js +98 -0
- package/dist/chunk-CA5QBLIZ.js +114 -0
- package/dist/chunk-CKIENAAO.js +156 -0
- package/dist/chunk-CKIENAAO.js.map +1 -0
- package/dist/chunk-CONTVNSN.js +51 -0
- package/dist/chunk-CUTTTFAU.js +783 -0
- package/dist/chunk-D32EWSMB.js +150 -0
- package/dist/chunk-EE6NZ6NG.js +225 -0
- package/dist/chunk-EG6HMBCF.js +188 -0
- package/dist/chunk-EGZM35HT.js +3510 -0
- package/dist/chunk-ESSA3AWR.js +133 -0
- package/dist/chunk-ESSA3AWR.js.map +1 -0
- package/dist/chunk-F3CZFUXZ.js +3187 -0
- package/dist/chunk-F3CZFUXZ.js.map +1 -0
- package/dist/chunk-FHLAJYZE.js +225 -0
- package/dist/chunk-FSNQFZ2Z.js +718 -0
- package/dist/chunk-G67OBCXI.js +91 -0
- package/dist/chunk-GFYGVIT3.js +392 -0
- package/dist/chunk-GRNHQWSV.js +430 -0
- package/dist/chunk-GWQSZWHT.js +42 -0
- package/dist/chunk-HBXR26LB.js +1518 -0
- package/dist/chunk-HKKHOMEQ.js +180 -0
- package/dist/chunk-HKKHOMEQ.js.map +1 -0
- package/dist/chunk-HUO5MZ7S.js +962 -0
- package/dist/chunk-HVL22WUU.js +930 -0
- package/dist/chunk-IA5GLVRV.js +64 -0
- package/dist/chunk-IEPCI2EB.js +479 -0
- package/dist/chunk-IKSBLQTL.js +5471 -0
- package/dist/chunk-IMS53EQU.js +4277 -0
- package/dist/chunk-IMS53EQU.js.map +1 -0
- package/dist/chunk-IRLMIKI7.js +224 -0
- package/dist/chunk-IW4MX7OX.js +399 -0
- package/dist/chunk-J4WOF6WK.js +97 -0
- package/dist/chunk-J63TN3GR.js +89 -0
- package/dist/chunk-JESSFI7R.js +468 -0
- package/dist/chunk-K4QPBXV7.js +61 -0
- package/dist/chunk-K5VDDKKF.js +219 -0
- package/dist/chunk-KM5K47TW.js +152 -0
- package/dist/chunk-KPVZ2CZA.js +642 -0
- package/dist/chunk-KPVZ2CZA.js.map +1 -0
- package/dist/chunk-LGJIJVVH.js +131 -0
- package/dist/chunk-LHSSIUU4.js +604 -0
- package/dist/chunk-LQMPA4DY.js +685 -0
- package/dist/chunk-M3IXPK6U.js +344 -0
- package/dist/chunk-MJU5VKX2.js +91 -0
- package/dist/chunk-MRGU3NPN.js +163 -0
- package/dist/chunk-MSLFPL77.js +454 -0
- package/dist/chunk-MX5NQAK6.js +54 -0
- package/dist/chunk-MX5NQAK6.js.map +1 -0
- package/dist/chunk-NKCWJPMN.js +111 -0
- package/dist/chunk-NT7NCSEB.js +24026 -0
- package/dist/chunk-NT7NCSEB.js.map +1 -0
- package/dist/chunk-O5GZJ6YJ.js +1085 -0
- package/dist/chunk-O5GZJ6YJ.js.map +1 -0
- package/dist/chunk-OADMSHME.js +334 -0
- package/dist/chunk-OGWCLE4W.js +858 -0
- package/dist/chunk-OGWCLE4W.js.map +1 -0
- package/dist/chunk-ONGZKI5J.js +57 -0
- package/dist/chunk-OOZNTJP6.js +26 -0
- package/dist/chunk-OP3NHIFH.js +39 -0
- package/dist/chunk-OU4KWL6B.js +106 -0
- package/dist/chunk-OW3D63SI.js +91 -0
- package/dist/chunk-OW3D63SI.js.map +1 -0
- package/dist/chunk-PLIGHRIQ.js +312 -0
- package/dist/chunk-PLROJ3SX.js +73 -0
- package/dist/chunk-PSM3RI4B.js +167 -0
- package/dist/chunk-Q4O7ICAK.js +84 -0
- package/dist/chunk-Q6XM6ZDB.js +547 -0
- package/dist/chunk-QHRUCSRI.js +197 -0
- package/dist/chunk-QUDPMIW7.js +74 -0
- package/dist/chunk-QZ4YHQLW.js +63 -0
- package/dist/chunk-R2JGUOT6.js +64 -0
- package/dist/chunk-R5I4IHJ5.js +494 -0
- package/dist/chunk-R5NABIJ4.js +1919 -0
- package/dist/chunk-R5NABIJ4.js.map +1 -0
- package/dist/chunk-RJXO66C4.js +66 -0
- package/dist/chunk-RYNN6UUF.js +69 -0
- package/dist/chunk-S4V2GOKV.js +215 -0
- package/dist/chunk-S7D4GTYY.js +191 -0
- package/dist/chunk-SIKCVWM3.js +76 -0
- package/dist/chunk-T4RV7XOC.js +217 -0
- package/dist/chunk-TDUAGNSQ.js +52 -0
- package/dist/chunk-TZRWET3S.js +285 -0
- package/dist/chunk-U5V4CIIG.js +274 -0
- package/dist/chunk-U625CQ3Y.js +287 -0
- package/dist/chunk-UDEVIXKX.js +1254 -0
- package/dist/chunk-UNLFRXST.js +126 -0
- package/dist/chunk-UNLFRXST.js.map +1 -0
- package/dist/chunk-UUDWZIDC.js +246 -0
- package/dist/chunk-VAQBBNLD.js +98 -0
- package/dist/chunk-VCDFBFPT.js +97 -0
- package/dist/chunk-VF3W7CI7.js +325 -0
- package/dist/chunk-VHOOAQY4.js +169 -0
- package/dist/chunk-VK2VC6A2.js +25 -0
- package/dist/chunk-WWPRSJOS.js +94 -0
- package/dist/chunk-WZXMZFVB.js +238 -0
- package/dist/chunk-XKYFNMTB.js +343 -0
- package/dist/chunk-XL42ZEVH.js +170 -0
- package/dist/chunk-XPUQFPIU.js +831 -0
- package/dist/chunk-XQEHLDGP.js +1744 -0
- package/dist/chunk-XQWC223L.js +56 -0
- package/dist/chunk-XYDHBLZ2.js +103 -0
- package/dist/chunk-XZO6ONVI.js +115 -0
- package/dist/chunk-YFFQ3HY4.js +139 -0
- package/dist/chunk-YGUGL4ZL.js +76 -0
- package/dist/chunk-YOHGEF2N.js +7899 -0
- package/dist/chunk-YT3S2XFG.js +84 -0
- package/dist/chunk-ZPCZ4XDB.js +148 -0
- package/dist/cite-2ZJG3FBV.js +191 -0
- package/dist/claim-IGU5W4CT.js +200 -0
- package/dist/cli.js +48 -47
- package/dist/cli.js.map +1 -1
- package/dist/client-MSRCSDB7.js +19 -0
- package/dist/code-T7Z5JDQ2.js +76 -0
- package/dist/companies-HCSBVXCE.js +198 -0
- package/dist/company-SSMY4G2T.js +308 -0
- package/dist/complete-FQNRXUI5.js +84 -0
- package/dist/config-XRPKA5QR.js +88 -0
- package/dist/connect-VXEE3QBU.js +45 -0
- package/dist/content-2JFP747N.js +85 -0
- package/dist/conversation-KKJKZIX5.js +96 -0
- package/dist/conversion-report-G65UHQRO.js +127 -0
- package/dist/conversion-upload-command-Z7IOS6ZG.js +440 -0
- package/dist/conversion-upload-command-Z7IOS6ZG.js.map +1 -0
- package/dist/conversion-writes-333V4OVR.js +122 -0
- package/dist/conversions-7UHCNIAO.js +140 -0
- package/dist/conversions-L6775Q22.js +78 -0
- package/dist/copy-writes-G7GJ5RWS.js +171 -0
- package/dist/copy-writes-G7GJ5RWS.js.map +1 -0
- package/dist/countries-XJVDM635.js +82 -0
- package/dist/create-AXWJECPP.js +239 -0
- package/dist/create-B24XHUGZ.js +62 -0
- package/dist/create-HJKTD5FN.js +218 -0
- package/dist/create-V4NGP5KB.js +135 -0
- package/dist/creatives-HLWMABYL.js +55 -0
- package/dist/creatives-HLWMABYL.js.map +1 -0
- package/dist/creatives-OKFLX67Y.js +118 -0
- package/dist/creatives-WX6GQ37F.js +229 -0
- package/dist/credentials-4JFUH6FN.js +290 -0
- package/dist/critique-4SF44VFJ.js +420 -0
- package/dist/critique-4SF44VFJ.js.map +1 -0
- package/dist/critique-S3PDXLAZ.js +233 -0
- package/dist/critique-S3PDXLAZ.js.map +1 -0
- package/dist/crm-6MLYUEK7.js +323 -0
- package/dist/crm-PUQBWZKE.js +229 -0
- package/dist/crop-V5MSIY5F.js +113 -0
- package/dist/currency-SCSJ5FW2.js +88 -0
- package/dist/custom-conversions-GN4JDS5F.js +128 -0
- package/dist/customers-WXD2LTUC.js +65 -0
- package/dist/decide-PW2NRMRK.js +199 -0
- package/dist/delete-EAJN6ZHT.js +67 -0
- package/dist/delete-GDIFIYA2.js +69 -0
- package/dist/delete-JQG3ZWQX.js +57 -0
- package/dist/delete-L7CGJ23X.js +71 -0
- package/dist/delete-OQREQEGN.js +85 -0
- package/dist/delete-ZR3DVLWU.js +69 -0
- package/dist/demographics-LMRGNO7J.js +141 -0
- package/dist/describe-OHWLLBDE.js +97 -0
- package/dist/describe-YELOXWHY.js +97 -0
- package/dist/dimensions-CLLCVVRY.js +101 -0
- package/dist/discard-K2KIIFJQ.js +69 -0
- package/dist/discover-SQJLRS4G.js +93 -0
- package/dist/discover-UJMDGDQO.js +172 -0
- package/dist/domain-CJX5JSLS.js +101 -0
- package/dist/download-HFDBP6BO.js +172 -0
- package/dist/download-SZ5P3GLV.js +337 -0
- package/dist/draft-7QDE2Z3N.js +315 -0
- package/dist/draft-A7ZQPUFS.js +579 -0
- package/dist/draft-A7ZQPUFS.js.map +1 -0
- package/dist/draft-ILXHFWTT.js +134 -0
- package/dist/draft-NUFU5YME.js +374 -0
- package/dist/draft-QSTD3DH2.js +220 -0
- package/dist/draft-TV5IH5U4.js +260 -0
- package/dist/draft-WNMHUFAH.js +138 -0
- package/dist/draft-XJP3SCZ6.js +333 -0
- package/dist/draft-XJP3SCZ6.js.map +1 -0
- package/dist/engine/index.js +15 -15
- package/dist/env-3256G2OE.js +53 -0
- package/dist/experiment-5L5USMAL.js +1397 -0
- package/dist/experiments-CFBG5UOT.js +237 -0
- package/dist/experiments-CFBG5UOT.js.map +1 -0
- package/dist/export-YSOM4E3B.js +168 -0
- package/dist/extract-7FYXXEQZ.js +143 -0
- package/dist/facets-2FRELYRC.js +117 -0
- package/dist/favorites-LTG2F6W2.js +178 -0
- package/dist/feed-RSBWEI75.js +177 -0
- package/dist/feedback-LZSJR5KL.js +116 -0
- package/dist/feedback-LZSJR5KL.js.map +1 -0
- package/dist/feedback-PQUM7UBT.js +114 -0
- package/dist/feedback-record-4MVI4O3Q.js +270 -0
- package/dist/feedback-record-4MVI4O3Q.js.map +1 -0
- package/dist/fetch-3PWYTX4R.js +139 -0
- package/dist/fetch-FLQYW27W.js +204 -0
- package/dist/find-SHHDWCPM.js +144 -0
- package/dist/fit-4XCDLF7C.js +65 -0
- package/dist/flows-4ALWJVNF.js +340 -0
- package/dist/follow-N4TKU3UM.js +94 -0
- package/dist/follow-competitors-AHQ57BWS.js +112 -0
- package/dist/following-CEYH33DW.js +113 -0
- package/dist/fonts-CYJ5EFR4.js +40 -0
- package/dist/forecast-AH3AFVJ7.js +170 -0
- package/dist/forecast-AH3AFVJ7.js.map +1 -0
- package/dist/forecast-SG2VUBZD.js +121 -0
- package/dist/funding-X7M5WLDX.js +85 -0
- package/dist/funnel-F7DS7PUN.js +397 -0
- package/dist/ga4-QPBAKGSH.js +55 -0
- package/dist/generate-LVBI3VDD.js +263 -0
- package/dist/get-DMV7KG2F.js +92 -0
- package/dist/get-EA7AX4NW.js +59 -0
- package/dist/get-EOSJWMWT.js +38 -0
- package/dist/get-HVQHHDW6.js +74 -0
- package/dist/get-KQLCVQCK.js +56 -0
- package/dist/get-NAOMB6Q2.js +62 -0
- package/dist/get-XYJBQFIT.js +62 -0
- package/dist/get-XZ7XPXZE.js +82 -0
- package/dist/gif-XJ26IWAP.js +111 -0
- package/dist/google-ED4VGLSX.js +3301 -0
- package/dist/google-ED4VGLSX.js.map +1 -0
- package/dist/google-QOKWSPOA.js +163 -0
- package/dist/google-ads-B4FBPQ7O.js +198 -0
- package/dist/group-7EYM3PNJ.js +43 -0
- package/dist/group-GDTEICRY.js +43 -0
- package/dist/gsc-KVIAZMF4.js +30 -0
- package/dist/history-22YGILIT.js +69 -0
- package/dist/history-E3JGYADF.js +102 -0
- package/dist/history-HKCSYH5L.js +153 -0
- package/dist/hubspot-LEW2RP5D.js +814 -0
- package/dist/icon-JLVEYF34.js +138 -0
- package/dist/ideas-JAIU4GC4.js +45 -0
- package/dist/images-ZG6RRAEP.js +92 -0
- package/dist/improve-XSHWCMZS.js +86 -0
- package/dist/ingest-GTXBGUNQ.js +28 -0
- package/dist/ingest-SX7K6GNE.js +131 -0
- package/dist/insights-IVUUWSQL.js +132 -0
- package/dist/insights-PJPQB46E.js +658 -0
- package/dist/inspect-55BXSPJG.js +192 -0
- package/dist/inspiration-NBOKHPZ5.js +53 -0
- package/dist/instant-experiences-ARST4KWB.js +265 -0
- package/dist/instant-experiences-ARST4KWB.js.map +1 -0
- package/dist/intent-KSVTHFFE.js +95 -0
- package/dist/job-4VXDCYSG.js +202 -0
- package/dist/job-create-NZEZDOZT.js +109 -0
- package/dist/job-status-XI3ENS7D.js +74 -0
- package/dist/keep-UYNOC3JZ.js +78 -0
- package/dist/keyword-gap-7UVDSID5.js +130 -0
- package/dist/keyword-metrics-QFRXZRAQ.js +200 -0
- package/dist/keywords-for-site-Q4BCJ4PQ.js +131 -0
- package/dist/knowledge-LVE3J3AK.js +195 -0
- package/dist/landing-AJYM5GBY.js +28 -0
- package/dist/landings-SIN3MTUZ.js +151 -0
- package/dist/languages-AIASAINW.js +40 -0
- package/dist/languages-RDR6EBNJ.js +55 -0
- package/dist/launches-4TVHXAZT.js +19 -0
- package/dist/layerize-OLVGZRND.js +190 -0
- package/dist/lead-routes-ZOQDPCR3.js +733 -0
- package/dist/leads-M57K5EDK.js +542 -0
- package/dist/leads-M57K5EDK.js.map +1 -0
- package/dist/leads-YSDLFBHN.js +115 -0
- package/dist/learn-FDQZNIP3.js +207 -0
- package/dist/library-7CLWRDM3.js +212 -0
- package/dist/lighthouse-3ACQ3MVG.js +75 -0
- package/dist/line-item-writes-JARN73DV.js +211 -0
- package/dist/line-items-B5GLDAJ2.js +107 -0
- package/dist/link-YAZF34BZ.js +67 -0
- package/dist/linkedin-MLPAY7IL.js +1345 -0
- package/dist/linkedin-MLPAY7IL.js.map +1 -0
- package/dist/linkedin-person-XDH7Q3PB.js +139 -0
- package/dist/list-6NYRZXKQ.js +76 -0
- package/dist/list-6WISGNQ2.js +65 -0
- package/dist/list-6YBIWX44.js +50 -0
- package/dist/list-72JQGWNO.js +154 -0
- package/dist/list-FX7OG3OJ.js +67 -0
- package/dist/list-ITPBLMV3.js +51 -0
- package/dist/list-J43GOBOX.js +57 -0
- package/dist/list-K4Z3BOWI.js +93 -0
- package/dist/list-ONSYTCX2.js +306 -0
- package/dist/locations-UNSREUBX.js +69 -0
- package/dist/locations-XAC3GME3.js +40 -0
- package/dist/log-PPNNFETI.js +95 -0
- package/dist/logo-UNVIMA4B.js +19 -0
- package/dist/lookup-L5QG3BWH.js +23 -0
- package/dist/make-YWW7Q4T5.js +1368 -0
- package/dist/make-YWW7Q4T5.js.map +1 -0
- package/dist/map-QILMIKS7.js +445 -0
- package/dist/mcp-GOKFM4PF.js +729 -0
- package/dist/media-BN6B75NF.js +18 -0
- package/dist/media-YDDWV32Y.js +89 -0
- package/dist/media-sources-HABLVJE3.js +35 -0
- package/dist/members-B4UI6ISY.js +47 -0
- package/dist/meme-2MERLAVW.js +108 -0
- package/dist/meta-7FJQD44L.js +124 -0
- package/dist/metrics-SBKBEZJR.js +152 -0
- package/dist/models-ZBLBNNEH.js +155 -0
- package/dist/normalize-5WVEQJXD.js +806 -0
- package/dist/normalize-YPQBHWYS.js +144 -0
- package/dist/older-spellings-KGYXGRHU.js +70 -0
- package/dist/older-spellings-KGYXGRHU.js.map +1 -0
- package/dist/options-BV3TVUCK.js +125 -0
- package/dist/organization-4OTGNRHP.js +949 -0
- package/dist/output-FX4KJAO5.js +24 -0
- package/dist/page-5KWQ7PM3.js +105 -0
- package/dist/page-photos-AUTUSCVR.js +119 -0
- package/dist/page-photos-AUTUSCVR.js.map +1 -0
- package/dist/pages-HKTAGXH3.js +67 -0
- package/dist/performance-4MWQVTTA.js +5565 -0
- package/dist/performance-TKE7NQF6.js +27 -0
- package/dist/pinterest-UDX53CWY.js +105 -0
- package/dist/pixels-BSNCVT77.js +109 -0
- package/dist/pixels-TR2PAYWV.js +62 -0
- package/dist/plan-V57AATQ5.js +208 -0
- package/dist/posts-JHMXNHDV.js +36 -0
- package/dist/preview-VY7UH2SK.js +245 -0
- package/dist/preview-XUG4K4KV.js +101 -0
- package/dist/profile-PV3R3BEG.js +159 -0
- package/dist/promoted-tweet-writes-O3S5OKUZ.js +183 -0
- package/dist/promoted-tweets-4ZKSEC4I.js +119 -0
- package/dist/properties-U2XUD2M6.js +101 -0
- package/dist/publish-4RAYD7VI.js +350 -0
- package/dist/query-4C6UQN42.js +62 -0
- package/dist/query-7FWE7GLV.js +231 -0
- package/dist/query-7Y2Y6YFI.js +236 -0
- package/dist/questionnaire-3IPJXJT7.js +94 -0
- package/dist/read-WEQLEI7R.js +141 -0
- package/dist/reddit-2FWCB7XY.js +29 -0
- package/dist/refresh-SGDB4QOD.js +97 -0
- package/dist/refresh-WZBVPKWE.js +42 -0
- package/dist/release-YL3ZII3Z.js +63 -0
- package/dist/relevant-pages-PF3LLUED.js +99 -0
- package/dist/remove-52MSQXSW.js +49 -0
- package/dist/remove-EIV7LJUA.js +53 -0
- package/dist/reopen-CW27MUJH.js +66 -0
- package/dist/rerun-4WUZY4SO.js +98 -0
- package/dist/rerun-4WUZY4SO.js.map +1 -0
- package/dist/research-234BOCKM.js +265 -0
- package/dist/research-RABLL4HR.js +75 -0
- package/dist/reset-5KJDDVJL.js +57 -0
- package/dist/reset-REUL47CB.js +57 -0
- package/dist/resolve-WRDEHLYL.js +124 -0
- package/dist/retry-2A5HV4SN.js +63 -0
- package/dist/retry-FNT2XVH3.js +65 -0
- package/dist/retry-failed-ND7UXYTJ.js +45 -0
- package/dist/revenue-YQV2BRGA.js +92 -0
- package/dist/revenue-YQV2BRGA.js.map +1 -0
- package/dist/rule-writes-L7BRELYW.js +531 -0
- package/dist/rule-writes-L7BRELYW.js.map +1 -0
- package/dist/rules-2CUG2YG7.js +217 -0
- package/dist/rules-5DIOAOOO.js +55 -0
- package/dist/rules-5DIOAOOO.js.map +1 -0
- package/dist/run-RKLNKV2U.js +73 -0
- package/dist/run-YKGN3GQR.js +69 -0
- package/dist/scaffold-ad-SPU2HKHU.js +1514 -0
- package/dist/scaffold-ad-SPU2HKHU.js.map +1 -0
- package/dist/scaffold-static-ad-ENGGU26W.js +1013 -0
- package/dist/scaffold-static-ad-ENGGU26W.js.map +1 -0
- package/dist/scaffold-video-OZHIU3SZ.js +886 -0
- package/dist/scaffold-video-OZHIU3SZ.js.map +1 -0
- package/dist/schedule-774JCRVM.js +67 -0
- package/dist/schedule-PKKSZ5RX.js +64 -0
- package/dist/scheduled-agents-ZI3EWKAT.js +55 -0
- package/dist/schema-BXNL4LKR.js +135 -0
- package/dist/schema-GFMVUZL2.js +152 -0
- package/dist/scrape-KKLE4WAU.js +2209 -0
- package/dist/screenshot-K6XOER6Z.js +103 -0
- package/dist/search-43ULIJL3.js +91 -0
- package/dist/search-AXUNJUWY.js +51 -0
- package/dist/search-DLLJEYMB.js +26 -0
- package/dist/search-LWWTXBB2.js +92 -0
- package/dist/search-VU6GI3U3.js +228 -0
- package/dist/search-XO365KES.js +177 -0
- package/dist/search-copy-BHNLLCUV.js +168 -0
- package/dist/seeds-6ROVZBFB.js +101 -0
- package/dist/select-4KMA72MV.js +111 -0
- package/dist/select-4KMA72MV.js.map +1 -0
- package/dist/sends-P6OPCYH5.js +349 -0
- package/dist/sequences-DP4BHM3E.js +146 -0
- package/dist/set-prompt-AII24NMX.js +200 -0
- package/dist/set-prompt-AII24NMX.js.map +1 -0
- package/dist/setup-links-T5TJZA3E.js +144 -0
- package/dist/shared-24IPELBM.js +32 -0
- package/dist/shopify-OQEKI7HC.js +4009 -0
- package/dist/site-QRLBZPEV.js +180 -0
- package/dist/sitemaps-SWADO4SI.js +77 -0
- package/dist/sites-H3FYJQFO.js +97 -0
- package/dist/skills-OYO6Y3DQ.js +47 -0
- package/dist/sources-U2WRH6D7.js +457 -0
- package/dist/sources-Y2BKZVXA.js +30 -0
- package/dist/stale-KE4K36UE.js +91 -0
- package/dist/stale-KE4K36UE.js.map +1 -0
- package/dist/stats-TTJHXR3E.js +34 -0
- package/dist/status-4BSXND3I.js +65 -0
- package/dist/sticker-CRIAIO75.js +103 -0
- package/dist/stock-TOFKLWSR.js +212 -0
- package/dist/studies-VFNWS6ND.js +250 -0
- package/dist/studio-WD364TWB.js +49 -0
- package/dist/study-writes-R7XYH3VH.js +472 -0
- package/dist/study-writes-R7XYH3VH.js.map +1 -0
- package/dist/suggest-GX4IROQN.js +66 -0
- package/dist/sync-BU7HU3FS.js +55 -0
- package/dist/sync-GQL5JX4U.js +57 -0
- package/dist/sync-VNBBOVBU.js +279 -0
- package/dist/sync-definition-EOARPSBS.js +71 -0
- package/dist/tag-SQ5ROLTP.js +57 -0
- package/dist/tag-manager-7S7PVYIJ.js +43 -0
- package/dist/tags-2226Q3VK.js +23 -0
- package/dist/tags-7QIBFIBX.js +227 -0
- package/dist/tags-BNWKAV3H.js +23 -0
- package/dist/tags-HG5EBHSO.js +23 -0
- package/dist/tags-WTN4EBT5.js +26 -0
- package/dist/targeting-SSI2F7XM.js +763 -0
- package/dist/targeting-SSI2F7XM.js.map +1 -0
- package/dist/targeting-constants-6KZXMRNI.js +118 -0
- package/dist/targeting-criteria-QSCRW75G.js +113 -0
- package/dist/targets-3KT3DO6O.js +106 -0
- package/dist/terms-IRLEAMIY.js +102 -0
- package/dist/testimonials-35FTFNQ5.js +32 -0
- package/dist/themes-WTMD2RE2.js +96 -0
- package/dist/themes-WTMD2RE2.js.map +1 -0
- package/dist/top-companies-JAWMSK2Q.js +111 -0
- package/dist/transcript-OIYU7F4E.js +165 -0
- package/dist/translate-S7ZQXQJH.js +604 -0
- package/dist/translate-S7ZQXQJH.js.map +1 -0
- package/dist/triggers-7QRQFTVM.js +144 -0
- package/dist/tweets-7XVF7PJO.js +123 -0
- package/dist/unfollow-ZCP6D2SC.js +46 -0
- package/dist/unlink-PYCYTYVN.js +70 -0
- package/dist/unstage-2OUF6ELM.js +88 -0
- package/dist/unstage-YADONHH6.js +96 -0
- package/dist/update-DEBDSBDI.js +81 -0
- package/dist/update-IDUSNDOI.js +192 -0
- package/dist/update-NG3HUYZZ.js +101 -0
- package/dist/update-P5IT7AIN.js +155 -0
- package/dist/update-U6NU7OXI.js +66 -0
- package/dist/upload-4F2JICEH.js +137 -0
- package/dist/upload-SS64KHDS.js +155 -0
- package/dist/upscale-JNNXDN6X.js +109 -0
- package/dist/url-options-EDPKAPPP.js +131 -0
- package/dist/url-params-4G26OEOO.js +101 -0
- package/dist/use-TKFP6WVP.js +111 -0
- package/dist/validate-HER6GMOZ.js +136 -0
- package/dist/validate-HER6GMOZ.js.map +1 -0
- package/dist/variant-3VTKOQUR.js +338 -0
- package/dist/videos-EDTBHLOZ.js +146 -0
- package/dist/videos-JRNJH66J.js +41 -0
- package/dist/view-6HX3FYMS.js +133 -0
- package/dist/viewer-check-OBBBAYV5.js +83 -0
- package/dist/web-GPUEUIDT.js +173 -0
- package/dist/winners-MEC77MZ4.js +113 -0
- package/dist/winning-ads-2DECFON4.js +86 -0
- package/dist/write-commands-AU2NJ4MR.js +1525 -0
- package/dist/write-commands-AU2NJ4MR.js.map +1 -0
- package/dist/write-commands-D5M5A4YI.js +721 -0
- package/dist/write-commands-LQVERLAQ.js +206 -0
- package/dist/write-commands-Y6U4WABA.js +1170 -0
- package/dist/write-commands-Y6U4WABA.js.map +1 -0
- package/dist/x-4TM5RET4.js +47 -0
- package/package.json +1 -1
- package/dist/account-52WDLW4Z.js +0 -82
- package/dist/account-7KZ7MHMN.js +0 -82
- package/dist/account-NSBALYYS.js +0 -139
- package/dist/account-assets-EPEYTJFD.js +0 -290
- package/dist/account-level-VD4NLB2D.js +0 -611
- package/dist/account-level-VD4NLB2D.js.map +0 -1
- package/dist/account-reads-CQIJCPCH.js +0 -219
- package/dist/account-reads-CQIJCPCH.js.map +0 -1
- package/dist/account-users-NUI3ILRE.js +0 -64
- package/dist/account-users-NUI3ILRE.js.map +0 -1
- package/dist/account-writes-3BJSUM2V.js +0 -68
- package/dist/accounts-A47QUTTB.js +0 -76
- package/dist/accounts-E5TF2AFI.js +0 -115
- package/dist/accounts-FLKNFDIE.js +0 -713
- package/dist/accounts-I2ZLR76R.js +0 -80
- package/dist/accounts-ZV4IXOF5.js +0 -119
- package/dist/actions-IR47GVZ6.js +0 -55
- package/dist/active-entities-XRSJNBOV.js +0 -103
- package/dist/activecampaign-MNJYIWJL.js +0 -938
- package/dist/activities-ZDWREYR7.js +0 -75
- package/dist/ad-group-writes-KU4QMQZP.js +0 -172
- package/dist/ad-groups-NMW2G32A.js +0 -70
- package/dist/ad-writes-7NOFTOM4.js +0 -176
- package/dist/add-25YZMFSH.js +0 -85
- package/dist/add-4I25INAO.js +0 -107
- package/dist/add-7MAL7JRX.js +0 -81
- package/dist/add-D44VCDRU.js +0 -148
- package/dist/add-JO4ZPS23.js +0 -97
- package/dist/add-QMTD6EGI.js +0 -305
- package/dist/add-accounts-EKMSHAA4.js +0 -91
- package/dist/ads-4YZYNU66.js +0 -128
- package/dist/ads-DGL5SGP3.js +0 -120
- package/dist/ads-P4Z3MLKS.js +0 -79
- package/dist/ads-PWTQC6KV.js +0 -48
- package/dist/adsets-PSVCPCE3.js +0 -182
- package/dist/advertisers-7NAPI5ZU.js +0 -125
- package/dist/advertisers-LOIXTTGP.js +0 -123
- package/dist/analytics-6AHC3J4L.js +0 -447
- package/dist/analytics-NL2KGDLK.js +0 -2437
- package/dist/animate-VX7E7KJE.js +0 -480
- package/dist/approved-E4EZA5RT.js +0 -73
- package/dist/asset-writes-NDSHY5OT.js +0 -50
- package/dist/assign-NKHIHVGI.js +0 -80
- package/dist/audience-size-WEOM6XIL.js +0 -76
- package/dist/audience-writes-4KQXVGHO.js +0 -327
- package/dist/audience-writes-4KQXVGHO.js.map +0 -1
- package/dist/audiences-P3SPTAJT.js +0 -280
- package/dist/audiences-T5LMTT3B.js +0 -85
- package/dist/audiences-UHLVATR6.js +0 -106
- package/dist/audit-46DO2HV3.js +0 -88
- package/dist/audit-4RIBJ7BR.js +0 -154
- package/dist/autocomplete-FMTJDXTL.js +0 -114
- package/dist/avatars-LY5SFMWO.js +0 -38
- package/dist/bid-pricing-MQ7WLV5U.js +0 -103
- package/dist/brand-LR5IXW3W.js +0 -22
- package/dist/brief-4DSXIX3F.js +0 -543
- package/dist/brief-4DSXIX3F.js.map +0 -1
- package/dist/businesses-TRFYMZ4I.js +0 -54
- package/dist/campaign-groups-EZYLKMO2.js +0 -99
- package/dist/campaign-writes-P5XPFTRK.js +0 -176
- package/dist/campaign-writes-UMENYMKO.js +0 -168
- package/dist/campaigns-2MTON2IE.js +0 -130
- package/dist/campaigns-PP2DQMJE.js +0 -113
- package/dist/campaigns-SWZJVE2T.js +0 -78
- package/dist/campaigns-TAFDM242.js +0 -111
- package/dist/canvas-RKR3ZB4E.js +0 -46
- package/dist/capabilities-45RZ6E6W.js +0 -147
- package/dist/cards-CXKIVM4D.js +0 -85
- package/dist/catalog-TOHUVBEU.js +0 -66
- package/dist/catalogs-4DNLG4AM.js +0 -782
- package/dist/catalogs-4DNLG4AM.js.map +0 -1
- package/dist/catalogs-V7PTEJBO.js +0 -130
- package/dist/changes-5OW3UYMF.js +0 -167
- package/dist/chatgpt-JBMYNVJB.js +0 -47
- package/dist/chats-VOLBYA3R.js +0 -584
- package/dist/check-4DI73QX4.js +0 -107
- package/dist/check-4DI73QX4.js.map +0 -1
- package/dist/chunk-22RM3UOO.js +0 -63
- package/dist/chunk-2CC4CPDT.js +0 -225
- package/dist/chunk-2N7TB346.js +0 -5368
- package/dist/chunk-2Q7K4F4H.js +0 -7899
- package/dist/chunk-2TS2ITSG.js +0 -392
- package/dist/chunk-2YXTXSYG.js +0 -454
- package/dist/chunk-2Z6PFHD2.js +0 -91
- package/dist/chunk-3GXHML4V.js +0 -106
- package/dist/chunk-3QPG2D27.js +0 -125
- package/dist/chunk-3WN5GWX4.js +0 -94
- package/dist/chunk-47VWQ7FQ.js +0 -843
- package/dist/chunk-47VWQ7FQ.js.map +0 -1
- package/dist/chunk-4AO3LSYM.js +0 -73
- package/dist/chunk-4HFM5RCP.js +0 -217
- package/dist/chunk-4NZ47VXO.js +0 -137
- package/dist/chunk-4NZ47VXO.js.map +0 -1
- package/dist/chunk-4QFMRL6O.js +0 -455
- package/dist/chunk-5OC6VUDZ.js +0 -930
- package/dist/chunk-5QNW5PCM.js +0 -106
- package/dist/chunk-5VXEH72O.js +0 -249
- package/dist/chunk-5VXEH72O.js.map +0 -1
- package/dist/chunk-6AMN346B.js +0 -114
- package/dist/chunk-6EOWBGGW.js +0 -191
- package/dist/chunk-6MJKVNLL.js +0 -25
- package/dist/chunk-7NBQQOCU.js +0 -97
- package/dist/chunk-AQRBEPZL.js +0 -138
- package/dist/chunk-AZIXX73C.js +0 -64
- package/dist/chunk-B4BITHOD.js +0 -2235
- package/dist/chunk-B64KJW5C.js +0 -476
- package/dist/chunk-BFAPSFS7.js +0 -1518
- package/dist/chunk-BIBXZJZI.js +0 -97
- package/dist/chunk-BMMXYR7A.js +0 -238
- package/dist/chunk-BNEWJXKU.js +0 -638
- package/dist/chunk-BNEWJXKU.js.map +0 -1
- package/dist/chunk-BXTIG5JL.js +0 -66
- package/dist/chunk-C7KV5O5J.js +0 -274
- package/dist/chunk-CBVUO7SK.js +0 -1744
- package/dist/chunk-CDPX6WAL.js +0 -207
- package/dist/chunk-CF5I4Q5M.js +0 -69
- package/dist/chunk-COOJKEJE.js +0 -312
- package/dist/chunk-CTJWMZPL.js +0 -430
- package/dist/chunk-D5HD46VV.js +0 -163
- package/dist/chunk-DGHSXHZR.js +0 -136
- package/dist/chunk-DHF4FXWS.js +0 -58
- package/dist/chunk-DPOUS5DN.js +0 -287
- package/dist/chunk-EGICPBDY.js +0 -1920
- package/dist/chunk-EJ6EED6I.js +0 -69
- package/dist/chunk-EKOMZH2S.js +0 -685
- package/dist/chunk-ELC42LJJ.js +0 -8954
- package/dist/chunk-FLTAPEVY.js +0 -288
- package/dist/chunk-G4FU6VC5.js +0 -23
- package/dist/chunk-H25GY4U4.js +0 -139
- package/dist/chunk-H3RCEM6L.js +0 -61
- package/dist/chunk-H6ASYVQX.js +0 -544
- package/dist/chunk-H7LKYGLJ.js +0 -24026
- package/dist/chunk-H7LKYGLJ.js.map +0 -1
- package/dist/chunk-HM4NWA72.js +0 -5471
- package/dist/chunk-HPF3USL2.js +0 -52
- package/dist/chunk-I33FO2ON.js +0 -170
- package/dist/chunk-IAE24RKD.js +0 -604
- package/dist/chunk-IB6VWG32.js +0 -755
- package/dist/chunk-IB6VWG32.js.map +0 -1
- package/dist/chunk-IGCS3X4F.js +0 -150
- package/dist/chunk-IJ6WA2JW.js +0 -148
- package/dist/chunk-ITIUWJGQ.js +0 -131
- package/dist/chunk-IYDESWW4.js +0 -74
- package/dist/chunk-J4BJLHLQ.js +0 -3510
- package/dist/chunk-JAC6JVCI.js +0 -26
- package/dist/chunk-JAME5NBT.js +0 -42
- package/dist/chunk-JCDCIQMA.js +0 -479
- package/dist/chunk-JGK2FDZW.js +0 -1919
- package/dist/chunk-JGK2FDZW.js.map +0 -1
- package/dist/chunk-JSOOLOHP.js +0 -468
- package/dist/chunk-JT3UUBID.js +0 -142
- package/dist/chunk-KGJ6EIX3.js +0 -76
- package/dist/chunk-KUI74TNG.js +0 -169
- package/dist/chunk-L4QEMWNJ.js +0 -111
- package/dist/chunk-L7I47VGM.js +0 -46
- package/dist/chunk-LAOCXV6Z.js +0 -98
- package/dist/chunk-LJEJCIHR.js +0 -246
- package/dist/chunk-LQACNCAV.js +0 -334
- package/dist/chunk-M4KFO256.js +0 -188
- package/dist/chunk-MC5F2L64.js +0 -962
- package/dist/chunk-MCJ5I5LR.js +0 -3187
- package/dist/chunk-MCJ5I5LR.js.map +0 -1
- package/dist/chunk-MIHY534L.js +0 -39
- package/dist/chunk-MKG57P2E.js +0 -783
- package/dist/chunk-MKOI6QYM.js +0 -225
- package/dist/chunk-MPTNN35I.js +0 -325
- package/dist/chunk-MSIOGH67.js +0 -66
- package/dist/chunk-MTW2NDDD.js +0 -98
- package/dist/chunk-MZPS46OR.js +0 -76
- package/dist/chunk-NXNOXZGB.js +0 -2523
- package/dist/chunk-NXNOXZGB.js.map +0 -1
- package/dist/chunk-O2ECZKXP.js +0 -197
- package/dist/chunk-O5VSYBUA.js +0 -343
- package/dist/chunk-OJZKY5UM.js +0 -46
- package/dist/chunk-OJZKY5UM.js.map +0 -1
- package/dist/chunk-P4UCSXNA.js +0 -156
- package/dist/chunk-P4UCSXNA.js.map +0 -1
- package/dist/chunk-Q3G4ZI2U.js +0 -84
- package/dist/chunk-Q5XUFN2W.js +0 -35
- package/dist/chunk-Q736UFSD.js +0 -75
- package/dist/chunk-QLO4RNHU.js +0 -51
- package/dist/chunk-QSS34JWZ.js +0 -224
- package/dist/chunk-QVHZTCB5.js +0 -1254
- package/dist/chunk-QVQKCVP7.js +0 -85
- package/dist/chunk-QVQKCVP7.js.map +0 -1
- package/dist/chunk-RRKUXGAU.js +0 -26
- package/dist/chunk-RVIBHENP.js +0 -344
- package/dist/chunk-S5S54J2K.js +0 -56
- package/dist/chunk-SIRRBWQ2.js +0 -215
- package/dist/chunk-TEJOILEY.js +0 -203
- package/dist/chunk-TEQEZAJI.js +0 -1320
- package/dist/chunk-TLQY4QBW.js +0 -84
- package/dist/chunk-TNI7CN4L.js +0 -547
- package/dist/chunk-TPJ34LXX.js +0 -220
- package/dist/chunk-U6AWJIFP.js +0 -225
- package/dist/chunk-UK4XSLV2.js +0 -296
- package/dist/chunk-URGXEDFV.js +0 -76
- package/dist/chunk-V5ODOBBI.js +0 -399
- package/dist/chunk-V7EN5LFS.js +0 -115
- package/dist/chunk-VAURJ4QJ.js +0 -89
- package/dist/chunk-VAV5CCDD.js +0 -167
- package/dist/chunk-VWHUO3AP.js +0 -103
- package/dist/chunk-W3TZPHZO.js +0 -285
- package/dist/chunk-WTPID22G.js +0 -152
- package/dist/chunk-WZATC4O5.js +0 -297
- package/dist/chunk-X25XRSDP.js +0 -57
- package/dist/chunk-XA76OGSL.js +0 -718
- package/dist/chunk-XGG72YRO.js +0 -91
- package/dist/chunk-XHWHBGKX.js +0 -4277
- package/dist/chunk-XHWHBGKX.js.map +0 -1
- package/dist/chunk-XWAOECD2.js +0 -831
- package/dist/chunk-YAMKCMAS.js +0 -219
- package/dist/chunk-YDALLZNS.js +0 -494
- package/dist/chunk-YRWCXYWW.js +0 -178
- package/dist/chunk-YRWCXYWW.js.map +0 -1
- package/dist/chunk-Z3RGBLVJ.js +0 -64
- package/dist/chunk-Z5JWFNG4.js +0 -19
- package/dist/chunk-ZCGM7ZWM.js +0 -45
- package/dist/cite-WCAOCOO5.js +0 -191
- package/dist/claim-3UMAFZEM.js +0 -200
- package/dist/client-VCKP6WBR.js +0 -19
- package/dist/code-VXOTFGD2.js +0 -76
- package/dist/companies-RL5A26AT.js +0 -198
- package/dist/company-DJ44F5C6.js +0 -308
- package/dist/complete-PGNIP3LN.js +0 -84
- package/dist/config-UR45YCIN.js +0 -88
- package/dist/connect-ROARWN63.js +0 -45
- package/dist/content-EQQIKG5H.js +0 -85
- package/dist/conversation-GDFMJL7X.js +0 -96
- package/dist/conversion-report-2FREFML5.js +0 -127
- package/dist/conversion-upload-command-JAGV6GMG.js +0 -439
- package/dist/conversion-upload-command-JAGV6GMG.js.map +0 -1
- package/dist/conversion-writes-JZIJSQ7T.js +0 -122
- package/dist/conversions-2IFWDQKK.js +0 -140
- package/dist/conversions-Q5EBTEXA.js +0 -78
- package/dist/copy-writes-JVUX3YDL.js +0 -170
- package/dist/copy-writes-JVUX3YDL.js.map +0 -1
- package/dist/countries-GRCU4IGM.js +0 -82
- package/dist/create-B5DIYK5D.js +0 -218
- package/dist/create-BRCSXXFO.js +0 -239
- package/dist/create-PXAUL6FF.js +0 -62
- package/dist/create-R6CMATVY.js +0 -135
- package/dist/creatives-4EPM3RHG.js +0 -118
- package/dist/creatives-D6O6Z46U.js +0 -229
- package/dist/creatives-XNVWQWFF.js +0 -58
- package/dist/creatives-XNVWQWFF.js.map +0 -1
- package/dist/credentials-CLJO7WWY.js +0 -290
- package/dist/critique-MBMKW6SL.js +0 -1451
- package/dist/critique-MBMKW6SL.js.map +0 -1
- package/dist/critique-OUJDTVMI.js +0 -232
- package/dist/critique-OUJDTVMI.js.map +0 -1
- package/dist/crm-H5ITJ2RC.js +0 -229
- package/dist/crm-JJHYRABB.js +0 -323
- package/dist/crop-NE7YX4SS.js +0 -113
- package/dist/currency-EFDQYW5B.js +0 -88
- package/dist/custom-conversions-GQTU5E6X.js +0 -128
- package/dist/customers-C5YXAVXI.js +0 -65
- package/dist/decide-6Q5X3V3F.js +0 -199
- package/dist/delete-3GYCQK6B.js +0 -57
- package/dist/delete-EKKOEB3N.js +0 -69
- package/dist/delete-NBUDIGSD.js +0 -69
- package/dist/delete-QHDDR66K.js +0 -85
- package/dist/delete-SP66F7ZV.js +0 -71
- package/dist/delete-WZ3KVVX5.js +0 -67
- package/dist/demographics-O7AJW7DO.js +0 -141
- package/dist/describe-DJPIUEFE.js +0 -97
- package/dist/describe-MAGTSOW4.js +0 -97
- package/dist/dimensions-IC2H7V3H.js +0 -101
- package/dist/discard-RMVZAX2J.js +0 -69
- package/dist/discover-BPUUWRBP.js +0 -172
- package/dist/discover-PSL2NBJL.js +0 -93
- package/dist/domain-J3ZMBOHS.js +0 -101
- package/dist/download-EHDJXBAC.js +0 -337
- package/dist/download-ZVOGLTFB.js +0 -172
- package/dist/draft-27NMTARB.js +0 -134
- package/dist/draft-6PJD3MCW.js +0 -374
- package/dist/draft-GCOCG4PO.js +0 -315
- package/dist/draft-GSDDK6FO.js +0 -614
- package/dist/draft-GSDDK6FO.js.map +0 -1
- package/dist/draft-JESKGZ6O.js +0 -138
- package/dist/draft-MWYKIZC4.js +0 -260
- package/dist/draft-TPR3DH5N.js +0 -220
- package/dist/draft-ZPGGWU7E.js +0 -332
- package/dist/draft-ZPGGWU7E.js.map +0 -1
- package/dist/env-NZXNMWSD.js +0 -53
- package/dist/experiment-XAYSEYTU.js +0 -1397
- package/dist/experiments-MM4BYHRH.js +0 -236
- package/dist/experiments-MM4BYHRH.js.map +0 -1
- package/dist/export-W54UZ62P.js +0 -168
- package/dist/extract-JMY6YRPW.js +0 -143
- package/dist/facets-B5AZAU2C.js +0 -117
- package/dist/favorites-Y6CT6NSQ.js +0 -178
- package/dist/feed-35BRQPTH.js +0 -177
- package/dist/feedback-2EVDGTEN.js +0 -115
- package/dist/feedback-2EVDGTEN.js.map +0 -1
- package/dist/feedback-4MCMOMVN.js +0 -114
- package/dist/feedback-record-DL7UEU2H.js +0 -269
- package/dist/feedback-record-DL7UEU2H.js.map +0 -1
- package/dist/fetch-I6P72CDL.js +0 -139
- package/dist/fetch-JDNFK476.js +0 -204
- package/dist/find-SVGRA7IA.js +0 -144
- package/dist/fit-DKVH5BDW.js +0 -65
- package/dist/flows-LURTZICL.js +0 -340
- package/dist/follow-24QSDNAG.js +0 -94
- package/dist/follow-competitors-AG4E4XFA.js +0 -112
- package/dist/following-YGM6TBK3.js +0 -113
- package/dist/fonts-HUXFDDAE.js +0 -39
- package/dist/forecast-HMNQZFVL.js +0 -169
- package/dist/forecast-HMNQZFVL.js.map +0 -1
- package/dist/forecast-UHTW4Y7Q.js +0 -121
- package/dist/funding-WZNGXRLJ.js +0 -85
- package/dist/funnel-QM7WFFMD.js +0 -397
- package/dist/ga4-W3U5YTRT.js +0 -55
- package/dist/generate-KAWRRYTT.js +0 -263
- package/dist/get-237TYJZT.js +0 -82
- package/dist/get-3MTAVNTP.js +0 -56
- package/dist/get-5SPNAIUQ.js +0 -62
- package/dist/get-FWPR2YPC.js +0 -62
- package/dist/get-GEUSRD5Y.js +0 -59
- package/dist/get-JIZPYK3Z.js +0 -74
- package/dist/get-TS2ZJDCQ.js +0 -38
- package/dist/get-YWDZYEAC.js +0 -92
- package/dist/gif-NP6EDGEE.js +0 -111
- package/dist/google-3CAUWNWE.js +0 -3300
- package/dist/google-3CAUWNWE.js.map +0 -1
- package/dist/google-DTSLO3PT.js +0 -163
- package/dist/google-ads-RZOQQDQN.js +0 -198
- package/dist/group-3DT4UYSR.js +0 -43
- package/dist/group-OEKKCFXT.js +0 -43
- package/dist/gsc-4FEFPFPB.js +0 -30
- package/dist/history-H7S7XRBX.js +0 -153
- package/dist/history-XL52537O.js +0 -102
- package/dist/history-YQSYXBJH.js +0 -69
- package/dist/hubspot-2DSISSUI.js +0 -814
- package/dist/icon-43UJTGGE.js +0 -138
- package/dist/ideas-2XBFQJ56.js +0 -45
- package/dist/images-VFRQ32G5.js +0 -92
- package/dist/improve-IMXQN6OD.js +0 -86
- package/dist/ingest-4RPLN54K.js +0 -28
- package/dist/ingest-TPVH44VI.js +0 -131
- package/dist/insights-BR3456EI.js +0 -658
- package/dist/insights-UVCFOB3N.js +0 -132
- package/dist/inspect-VD3GVXDU.js +0 -192
- package/dist/inspiration-XZI5KCQW.js +0 -53
- package/dist/instant-experiences-2LKF7XVK.js +0 -264
- package/dist/instant-experiences-2LKF7XVK.js.map +0 -1
- package/dist/intent-F5NTOSQC.js +0 -95
- package/dist/job-GOX3KIKG.js +0 -202
- package/dist/job-create-F2PQSN3C.js +0 -109
- package/dist/job-status-3FMA5D7T.js +0 -74
- package/dist/keep-23ZYMWPG.js +0 -78
- package/dist/keyword-gap-EB5QATYN.js +0 -130
- package/dist/keyword-metrics-PW2DDIJW.js +0 -200
- package/dist/keywords-for-site-JEPABY6E.js +0 -131
- package/dist/knowledge-7M7DSRF3.js +0 -195
- package/dist/landing-4N6YSB4L.js +0 -28
- package/dist/landings-VNQ4VA2U.js +0 -151
- package/dist/languages-2X22HXM3.js +0 -55
- package/dist/languages-4S26FJDP.js +0 -40
- package/dist/launches-L4EUROCJ.js +0 -19
- package/dist/layerize-6QHQMA7Q.js +0 -190
- package/dist/lead-routes-5TPFJEVH.js +0 -733
- package/dist/leads-4TLOH47R.js +0 -541
- package/dist/leads-4TLOH47R.js.map +0 -1
- package/dist/leads-R5OZJQHW.js +0 -115
- package/dist/learn-AQ2FRFB7.js +0 -207
- package/dist/library-MNJC24E4.js +0 -212
- package/dist/lighthouse-DJMAXFTD.js +0 -75
- package/dist/line-item-writes-LGO7HIJJ.js +0 -211
- package/dist/line-items-AAZVKQ7E.js +0 -107
- package/dist/link-7IGHVARH.js +0 -67
- package/dist/linkedin-UB2CW4KP.js +0 -1344
- package/dist/linkedin-UB2CW4KP.js.map +0 -1
- package/dist/linkedin-person-D6U2ZAUW.js +0 -139
- package/dist/list-2277GCPH.js +0 -51
- package/dist/list-537S75BZ.js +0 -76
- package/dist/list-P44QRX2O.js +0 -154
- package/dist/list-Q52FPW3H.js +0 -50
- package/dist/list-UMJACDTQ.js +0 -67
- package/dist/list-V4PSDBLX.js +0 -93
- package/dist/list-VZKUHY4Y.js +0 -306
- package/dist/list-WIXQXNKB.js +0 -65
- package/dist/list-XK33NCSC.js +0 -57
- package/dist/locations-UWBQLHXW.js +0 -40
- package/dist/locations-WXGOI3VV.js +0 -69
- package/dist/log-6ZKMUTYS.js +0 -95
- package/dist/logo-4LSFZ3ZO.js +0 -19
- package/dist/lookup-WIM5WR25.js +0 -23
- package/dist/make-5CEIJRBC.js +0 -1367
- package/dist/make-5CEIJRBC.js.map +0 -1
- package/dist/map-ZL4MQVJZ.js +0 -445
- package/dist/mcp-GSRYLRD4.js +0 -729
- package/dist/media-34I7UB7Z.js +0 -89
- package/dist/media-KKI3KWLR.js +0 -18
- package/dist/media-sources-VSPVHLYN.js +0 -35
- package/dist/members-L6SXP6GC.js +0 -47
- package/dist/meme-6NFYFQ7T.js +0 -108
- package/dist/meta-2UK7KIE4.js +0 -124
- package/dist/metrics-4AFEEDVP.js +0 -152
- package/dist/models-2ZEM64H5.js +0 -155
- package/dist/normalize-G75RDSE4.js +0 -806
- package/dist/normalize-GK7DH7ZP.js +0 -144
- package/dist/options-FDAAHG7C.js +0 -125
- package/dist/organization-K2FTFAAO.js +0 -949
- package/dist/output-ELEO2Z6R.js +0 -24
- package/dist/page-4X6IBUWG.js +0 -105
- package/dist/page-photos-KNBLMFLN.js +0 -118
- package/dist/page-photos-KNBLMFLN.js.map +0 -1
- package/dist/pages-7HW5YOZV.js +0 -67
- package/dist/performance-N3UROH7Z.js +0 -5565
- package/dist/performance-RG2HR46T.js +0 -27
- package/dist/pinterest-KA6VFDM4.js +0 -105
- package/dist/pixels-D5HF24FI.js +0 -109
- package/dist/pixels-HEI5WVAO.js +0 -62
- package/dist/plan-XCA6R3HZ.js +0 -208
- package/dist/posts-ALGM6ONV.js +0 -36
- package/dist/preview-55TRUF4Q.js +0 -245
- package/dist/preview-NVWIEUHF.js +0 -101
- package/dist/profile-NHUPUCBR.js +0 -159
- package/dist/promoted-tweet-writes-7QZRFDOM.js +0 -183
- package/dist/promoted-tweets-V555Y7DN.js +0 -119
- package/dist/properties-2ZXA5BPJ.js +0 -101
- package/dist/publish-5KR6YLA6.js +0 -350
- package/dist/query-63CTX2PH.js +0 -231
- package/dist/query-DMWY3TDD.js +0 -236
- package/dist/query-K7MYBRTS.js +0 -62
- package/dist/questionnaire-WHE42RD4.js +0 -94
- package/dist/read-NESEKULG.js +0 -141
- package/dist/reddit-XPQ7YAJW.js +0 -29
- package/dist/refresh-ILDEPU5A.js +0 -42
- package/dist/refresh-XFHEBSDU.js +0 -97
- package/dist/release-3ECEF26P.js +0 -63
- package/dist/relevant-pages-XYQKVX3U.js +0 -99
- package/dist/remove-NHE4UT7G.js +0 -49
- package/dist/remove-OCTUC3RB.js +0 -53
- package/dist/reopen-JRI3TYD4.js +0 -66
- package/dist/rerun-HWWYCDT2.js +0 -97
- package/dist/rerun-HWWYCDT2.js.map +0 -1
- package/dist/research-ODPU62BA.js +0 -265
- package/dist/research-TG5CBTYP.js +0 -75
- package/dist/reset-J2NLNITD.js +0 -57
- package/dist/reset-SRU7YJUR.js +0 -57
- package/dist/resolve-KHMMUGB2.js +0 -124
- package/dist/retry-VLH4AO7F.js +0 -65
- package/dist/retry-WP7LWKZF.js +0 -63
- package/dist/retry-failed-R5HPQ3KQ.js +0 -45
- package/dist/revenue-EEIS2AV5.js +0 -91
- package/dist/revenue-EEIS2AV5.js.map +0 -1
- package/dist/rule-writes-QB4IWFCJ.js +0 -530
- package/dist/rule-writes-QB4IWFCJ.js.map +0 -1
- package/dist/rules-FYVD2QBB.js +0 -217
- package/dist/rules-TTUGQAEB.js +0 -99
- package/dist/rules-TTUGQAEB.js.map +0 -1
- package/dist/rules-add-AIXUAZXG.js +0 -465
- package/dist/rules-add-AIXUAZXG.js.map +0 -1
- package/dist/run-AQTACLY6.js +0 -69
- package/dist/run-YA6IWQAJ.js +0 -72
- package/dist/scaffold-ad-IYNFJPT7.js +0 -1513
- package/dist/scaffold-ad-IYNFJPT7.js.map +0 -1
- package/dist/scaffold-static-ad-SPYKSAJR.js +0 -1012
- package/dist/scaffold-static-ad-SPYKSAJR.js.map +0 -1
- package/dist/scaffold-video-BUN27PKS.js +0 -885
- package/dist/scaffold-video-BUN27PKS.js.map +0 -1
- package/dist/schedule-D7EDEM45.js +0 -67
- package/dist/schedule-EH2MOC5C.js +0 -64
- package/dist/scheduled-agents-DTAEP25E.js +0 -55
- package/dist/schema-7B4MVVAS.js +0 -135
- package/dist/schema-Z43AJOJ4.js +0 -152
- package/dist/scrape-VL2RWSTW.js +0 -2209
- package/dist/screenshot-Y6EEXS3Q.js +0 -103
- package/dist/search-CXC7N5XJ.js +0 -51
- package/dist/search-JEXYEAPQ.js +0 -228
- package/dist/search-L3GTZYRW.js +0 -92
- package/dist/search-TXBYKNQC.js +0 -91
- package/dist/search-XHSTUBDY.js +0 -26
- package/dist/search-ZZWIJRXJ.js +0 -177
- package/dist/search-copy-FIPG7OCC.js +0 -168
- package/dist/seeds-ADJKURNG.js +0 -101
- package/dist/select-LWZRF7KV.js +0 -110
- package/dist/select-LWZRF7KV.js.map +0 -1
- package/dist/sends-RS4LWRAC.js +0 -349
- package/dist/sequences-2RPKDKGQ.js +0 -146
- package/dist/set-prompt-YKDH6FYK.js +0 -199
- package/dist/set-prompt-YKDH6FYK.js.map +0 -1
- package/dist/setup-links-OE6PC2YQ.js +0 -144
- package/dist/shared-4GGUIOF2.js +0 -32
- package/dist/shopify-CCPLZI2H.js +0 -4009
- package/dist/site-FW5BBLYG.js +0 -180
- package/dist/sitemaps-Z6IELTQV.js +0 -77
- package/dist/sites-KLAKI2EY.js +0 -97
- package/dist/skills-OJP36EVR.js +0 -47
- package/dist/sources-WPHMWBEK.js +0 -30
- package/dist/sources-X77TGJ52.js +0 -457
- package/dist/stale-SPCDL73V.js +0 -90
- package/dist/stale-SPCDL73V.js.map +0 -1
- package/dist/stats-MIMFX4R7.js +0 -34
- package/dist/status-FLETGJ2A.js +0 -65
- package/dist/sticker-IREEEN7I.js +0 -103
- package/dist/stock-5AOSQH52.js +0 -212
- package/dist/studies-YGYAH3JI.js +0 -250
- package/dist/studio-4EV5S7PR.js +0 -49
- package/dist/study-writes-UPGJB36A.js +0 -471
- package/dist/study-writes-UPGJB36A.js.map +0 -1
- package/dist/suggest-5RTISDLI.js +0 -66
- package/dist/sync-363VKXU3.js +0 -57
- package/dist/sync-OHIXI4I6.js +0 -55
- package/dist/sync-VCAFAYW4.js +0 -279
- package/dist/sync-definition-ZDE5L644.js +0 -70
- package/dist/tag-DSCUKNC3.js +0 -57
- package/dist/tag-manager-IINALUEJ.js +0 -43
- package/dist/tags-6MN3AWKN.js +0 -23
- package/dist/tags-VOKUNEIW.js +0 -227
- package/dist/tags-Y6MNMIEA.js +0 -23
- package/dist/tags-YHAC3NVY.js +0 -23
- package/dist/tags-ZCQMJ5YH.js +0 -26
- package/dist/targeting-BM72UTI6.js +0 -762
- package/dist/targeting-BM72UTI6.js.map +0 -1
- package/dist/targeting-constants-54S3FXIF.js +0 -118
- package/dist/targeting-criteria-ECQFHQF3.js +0 -113
- package/dist/targets-U2JHTB5U.js +0 -106
- package/dist/terms-OFHNLW6U.js +0 -102
- package/dist/testimonials-IDVLMXDT.js +0 -32
- package/dist/themes-FW3VWZJE.js +0 -95
- package/dist/themes-FW3VWZJE.js.map +0 -1
- package/dist/top-companies-CBI4O3ZB.js +0 -111
- package/dist/transcript-IIRFTFRW.js +0 -165
- package/dist/translate-N6QW4FZB.js +0 -603
- package/dist/translate-N6QW4FZB.js.map +0 -1
- package/dist/triggers-Q3KRAMA3.js +0 -144
- package/dist/tweets-TRTXC6O4.js +0 -123
- package/dist/unfollow-DATOGPLZ.js +0 -46
- package/dist/unlink-7RVQXKAR.js +0 -70
- package/dist/unstage-3LPHNZKR.js +0 -88
- package/dist/unstage-LLQCMZ5H.js +0 -96
- package/dist/update-AL3LBHGK.js +0 -192
- package/dist/update-AWR7EHGA.js +0 -155
- package/dist/update-LNSSLZXG.js +0 -66
- package/dist/update-SD5YQIJC.js +0 -81
- package/dist/update-YBTFH5MN.js +0 -101
- package/dist/upload-45GCGMA5.js +0 -137
- package/dist/upload-7PPMVWVA.js +0 -155
- package/dist/upscale-WVJZG76V.js +0 -109
- package/dist/url-options-AHJPR5VY.js +0 -131
- package/dist/url-params-U6ZM4LL2.js +0 -101
- package/dist/use-6FADOAFZ.js +0 -111
- package/dist/validate-S325RXPH.js +0 -135
- package/dist/validate-S325RXPH.js.map +0 -1
- package/dist/variant-RNM36P4J.js +0 -338
- package/dist/videos-GHFCOTT7.js +0 -146
- package/dist/videos-NW2UP342.js +0 -41
- package/dist/view-YR6MDLWL.js +0 -133
- package/dist/viewer-check-IDXFRRCO.js +0 -83
- package/dist/web-VMPKMBKA.js +0 -173
- package/dist/winners-4T5RFQXU.js +0 -113
- package/dist/winning-ads-7UJXCWFH.js +0 -86
- package/dist/write-commands-6D55SB56.js +0 -206
- package/dist/write-commands-AIWLEGO2.js +0 -1169
- package/dist/write-commands-AIWLEGO2.js.map +0 -1
- package/dist/write-commands-R42DQEW6.js +0 -1524
- package/dist/write-commands-R42DQEW6.js.map +0 -1
- package/dist/write-commands-UO3OQIHH.js +0 -721
- package/dist/x-UGTUOCVR.js +0 -47
- /package/dist/{account-52WDLW4Z.js.map → account-6RJ6ZI3B.js.map} +0 -0
- /package/dist/{account-7KZ7MHMN.js.map → account-AIGNJ2RP.js.map} +0 -0
- /package/dist/{account-NSBALYYS.js.map → account-E5LLPRZ6.js.map} +0 -0
- /package/dist/{account-assets-EPEYTJFD.js.map → account-assets-J6SVHSXR.js.map} +0 -0
- /package/dist/{account-writes-3BJSUM2V.js.map → account-writes-XNS4IKZV.js.map} +0 -0
- /package/dist/{accounts-I2ZLR76R.js.map → accounts-3ZWYGRVM.js.map} +0 -0
- /package/dist/{accounts-ZV4IXOF5.js.map → accounts-5TLHSEZR.js.map} +0 -0
- /package/dist/{accounts-FLKNFDIE.js.map → accounts-BAZYYDFV.js.map} +0 -0
- /package/dist/{accounts-A47QUTTB.js.map → accounts-L2HVNJUF.js.map} +0 -0
- /package/dist/{accounts-E5TF2AFI.js.map → accounts-NTBIRB52.js.map} +0 -0
- /package/dist/{actions-IR47GVZ6.js.map → actions-N2FBJMT4.js.map} +0 -0
- /package/dist/{active-entities-XRSJNBOV.js.map → active-entities-IJPRN45K.js.map} +0 -0
- /package/dist/{activecampaign-MNJYIWJL.js.map → activecampaign-U77COT2F.js.map} +0 -0
- /package/dist/{activities-ZDWREYR7.js.map → activities-SS3SUWSS.js.map} +0 -0
- /package/dist/{ad-group-writes-KU4QMQZP.js.map → ad-group-writes-DTQSUNE2.js.map} +0 -0
- /package/dist/{ad-groups-NMW2G32A.js.map → ad-groups-CX23GLVE.js.map} +0 -0
- /package/dist/{ad-writes-7NOFTOM4.js.map → ad-writes-HAAUOJCG.js.map} +0 -0
- /package/dist/{add-QMTD6EGI.js.map → add-ABPQTO2M.js.map} +0 -0
- /package/dist/{add-JO4ZPS23.js.map → add-BK6N7KWU.js.map} +0 -0
- /package/dist/{add-25YZMFSH.js.map → add-ECN2FTMH.js.map} +0 -0
- /package/dist/{add-D44VCDRU.js.map → add-FH7OVKFF.js.map} +0 -0
- /package/dist/{add-7MAL7JRX.js.map → add-KHY3H54G.js.map} +0 -0
- /package/dist/{add-4I25INAO.js.map → add-VDH2VCXR.js.map} +0 -0
- /package/dist/{add-accounts-EKMSHAA4.js.map → add-accounts-6JAOSCXK.js.map} +0 -0
- /package/dist/{ads-4YZYNU66.js.map → ads-BEMEXBDJ.js.map} +0 -0
- /package/dist/{ads-PWTQC6KV.js.map → ads-GAU2XKNL.js.map} +0 -0
- /package/dist/{ads-P4Z3MLKS.js.map → ads-HZOXZ3FY.js.map} +0 -0
- /package/dist/{ads-DGL5SGP3.js.map → ads-I5OBZ5VI.js.map} +0 -0
- /package/dist/{adsets-PSVCPCE3.js.map → adsets-PMQGA6TW.js.map} +0 -0
- /package/dist/{advertisers-LOIXTTGP.js.map → advertisers-EOLL3VFQ.js.map} +0 -0
- /package/dist/{advertisers-7NAPI5ZU.js.map → advertisers-FNKY2PP4.js.map} +0 -0
- /package/dist/{analytics-NL2KGDLK.js.map → analytics-DOAUCF2Y.js.map} +0 -0
- /package/dist/{analytics-6AHC3J4L.js.map → analytics-MR3T34KN.js.map} +0 -0
- /package/dist/{animate-VX7E7KJE.js.map → animate-EKGVDSWM.js.map} +0 -0
- /package/dist/{approved-E4EZA5RT.js.map → approved-WQL4Z4EB.js.map} +0 -0
- /package/dist/{asset-writes-NDSHY5OT.js.map → asset-writes-A5X2T6LQ.js.map} +0 -0
- /package/dist/{assign-NKHIHVGI.js.map → assign-UMNHINRA.js.map} +0 -0
- /package/dist/{audience-size-WEOM6XIL.js.map → audience-size-Q7DZ6TGM.js.map} +0 -0
- /package/dist/{audiences-UHLVATR6.js.map → audiences-HBJGEGKL.js.map} +0 -0
- /package/dist/{audiences-P3SPTAJT.js.map → audiences-RDQZNGPI.js.map} +0 -0
- /package/dist/{audiences-T5LMTT3B.js.map → audiences-TA636UBN.js.map} +0 -0
- /package/dist/{audit-4RIBJ7BR.js.map → audit-H3F6FZNE.js.map} +0 -0
- /package/dist/{audit-46DO2HV3.js.map → audit-QMCK76AT.js.map} +0 -0
- /package/dist/{autocomplete-FMTJDXTL.js.map → autocomplete-DIBJ57VC.js.map} +0 -0
- /package/dist/{avatars-LY5SFMWO.js.map → avatars-UIXRGLPA.js.map} +0 -0
- /package/dist/{bid-pricing-MQ7WLV5U.js.map → bid-pricing-OMY2F2SB.js.map} +0 -0
- /package/dist/{brand-LR5IXW3W.js.map → brand-WV6CAU3M.js.map} +0 -0
- /package/dist/{businesses-TRFYMZ4I.js.map → businesses-56IUB5X4.js.map} +0 -0
- /package/dist/{campaign-groups-EZYLKMO2.js.map → campaign-groups-PGJIQV4S.js.map} +0 -0
- /package/dist/{campaign-writes-P5XPFTRK.js.map → campaign-writes-MAJ5FGXG.js.map} +0 -0
- /package/dist/{campaign-writes-UMENYMKO.js.map → campaign-writes-WL3YAEGJ.js.map} +0 -0
- /package/dist/{campaigns-2MTON2IE.js.map → campaigns-5L4ZTGF7.js.map} +0 -0
- /package/dist/{campaigns-PP2DQMJE.js.map → campaigns-EK7EUKZD.js.map} +0 -0
- /package/dist/{campaigns-SWZJVE2T.js.map → campaigns-HCJ3AIDK.js.map} +0 -0
- /package/dist/{campaigns-TAFDM242.js.map → campaigns-NHACWGWS.js.map} +0 -0
- /package/dist/{canvas-RKR3ZB4E.js.map → canvas-INL3J7HO.js.map} +0 -0
- /package/dist/{capabilities-45RZ6E6W.js.map → capabilities-Y33EWDMJ.js.map} +0 -0
- /package/dist/{cards-CXKIVM4D.js.map → cards-IWWKA5WH.js.map} +0 -0
- /package/dist/{catalog-TOHUVBEU.js.map → catalog-NSA2FUI2.js.map} +0 -0
- /package/dist/{catalogs-V7PTEJBO.js.map → catalogs-SJMYID7N.js.map} +0 -0
- /package/dist/{changes-5OW3UYMF.js.map → changes-2HOF2HSV.js.map} +0 -0
- /package/dist/{chatgpt-JBMYNVJB.js.map → chatgpt-J6MNVQVT.js.map} +0 -0
- /package/dist/{chats-VOLBYA3R.js.map → chats-4HK6UYD2.js.map} +0 -0
- /package/dist/{chunk-UK4XSLV2.js.map → chunk-2B2JFTWI.js.map} +0 -0
- /package/dist/{chunk-B4BITHOD.js.map → chunk-2HWX6AWY.js.map} +0 -0
- /package/dist/{chunk-G4FU6VC5.js.map → chunk-2O5CCKV7.js.map} +0 -0
- /package/dist/{chunk-ELC42LJJ.js.map → chunk-2W6DMVGH.js.map} +0 -0
- /package/dist/{chunk-BXTIG5JL.js.map → chunk-3BKESS5W.js.map} +0 -0
- /package/dist/{chunk-FLTAPEVY.js.map → chunk-3VBPJQ7L.js.map} +0 -0
- /package/dist/{chunk-Z5JWFNG4.js.map → chunk-3X262BEG.js.map} +0 -0
- /package/dist/{chunk-DGHSXHZR.js.map → chunk-4CYB33V3.js.map} +0 -0
- /package/dist/{chunk-JT3UUBID.js.map → chunk-4JB556VC.js.map} +0 -0
- /package/dist/{chunk-CDPX6WAL.js.map → chunk-4QYZJPSM.js.map} +0 -0
- /package/dist/{chunk-H6ASYVQX.js.map → chunk-4WLJYLRL.js.map} +0 -0
- /package/dist/{chunk-TEQEZAJI.js.map → chunk-56ZJO7TM.js.map} +0 -0
- /package/dist/{chunk-AQRBEPZL.js.map → chunk-5LQGW5UF.js.map} +0 -0
- /package/dist/{chunk-TEJOILEY.js.map → chunk-6IL7JFX5.js.map} +0 -0
- /package/dist/{chunk-Q5XUFN2W.js.map → chunk-6LNCKT6S.js.map} +0 -0
- /package/dist/{chunk-B64KJW5C.js.map → chunk-6LUDG5AB.js.map} +0 -0
- /package/dist/{chunk-JAC6JVCI.js.map → chunk-6OIKNJ7G.js.map} +0 -0
- /package/dist/{chunk-ZCGM7ZWM.js.map → chunk-6UQV5DOD.js.map} +0 -0
- /package/dist/{chunk-L7I47VGM.js.map → chunk-6WA7QSCN.js.map} +0 -0
- /package/dist/{chunk-4QFMRL6O.js.map → chunk-7CHPHER2.js.map} +0 -0
- /package/dist/{chunk-U6AWJIFP.js.map → chunk-7J7ASYIM.js.map} +0 -0
- /package/dist/{chunk-TPJ34LXX.js.map → chunk-7MMTIJO3.js.map} +0 -0
- /package/dist/{chunk-2N7TB346.js.map → chunk-7Y3LKR4P.js.map} +0 -0
- /package/dist/{chunk-3QPG2D27.js.map → chunk-AA3D7GZF.js.map} +0 -0
- /package/dist/{chunk-Q736UFSD.js.map → chunk-AGL7EWP2.js.map} +0 -0
- /package/dist/{chunk-KGJ6EIX3.js.map → chunk-AHVD6IEI.js.map} +0 -0
- /package/dist/{chunk-3GXHML4V.js.map → chunk-ASJMLTMX.js.map} +0 -0
- /package/dist/{chunk-WZATC4O5.js.map → chunk-AWENMEFC.js.map} +0 -0
- /package/dist/{chunk-EGICPBDY.js.map → chunk-AYX7PB2L.js.map} +0 -0
- /package/dist/{chunk-EJ6EED6I.js.map → chunk-BHZLKLK7.js.map} +0 -0
- /package/dist/{chunk-DHF4FXWS.js.map → chunk-BVER7I36.js.map} +0 -0
- /package/dist/{chunk-MTW2NDDD.js.map → chunk-C3RZNVLM.js.map} +0 -0
- /package/dist/{chunk-6AMN346B.js.map → chunk-CA5QBLIZ.js.map} +0 -0
- /package/dist/{chunk-QLO4RNHU.js.map → chunk-CONTVNSN.js.map} +0 -0
- /package/dist/{chunk-MKG57P2E.js.map → chunk-CUTTTFAU.js.map} +0 -0
- /package/dist/{chunk-IGCS3X4F.js.map → chunk-D32EWSMB.js.map} +0 -0
- /package/dist/{chunk-2CC4CPDT.js.map → chunk-EE6NZ6NG.js.map} +0 -0
- /package/dist/{chunk-M4KFO256.js.map → chunk-EG6HMBCF.js.map} +0 -0
- /package/dist/{chunk-J4BJLHLQ.js.map → chunk-EGZM35HT.js.map} +0 -0
- /package/dist/{chunk-MKOI6QYM.js.map → chunk-FHLAJYZE.js.map} +0 -0
- /package/dist/{chunk-XA76OGSL.js.map → chunk-FSNQFZ2Z.js.map} +0 -0
- /package/dist/{chunk-XGG72YRO.js.map → chunk-G67OBCXI.js.map} +0 -0
- /package/dist/{chunk-2TS2ITSG.js.map → chunk-GFYGVIT3.js.map} +0 -0
- /package/dist/{chunk-CTJWMZPL.js.map → chunk-GRNHQWSV.js.map} +0 -0
- /package/dist/{chunk-JAME5NBT.js.map → chunk-GWQSZWHT.js.map} +0 -0
- /package/dist/{chunk-BFAPSFS7.js.map → chunk-HBXR26LB.js.map} +0 -0
- /package/dist/{chunk-MC5F2L64.js.map → chunk-HUO5MZ7S.js.map} +0 -0
- /package/dist/{chunk-5OC6VUDZ.js.map → chunk-HVL22WUU.js.map} +0 -0
- /package/dist/{chunk-AZIXX73C.js.map → chunk-IA5GLVRV.js.map} +0 -0
- /package/dist/{chunk-JCDCIQMA.js.map → chunk-IEPCI2EB.js.map} +0 -0
- /package/dist/{chunk-HM4NWA72.js.map → chunk-IKSBLQTL.js.map} +0 -0
- /package/dist/{chunk-QSS34JWZ.js.map → chunk-IRLMIKI7.js.map} +0 -0
- /package/dist/{chunk-V5ODOBBI.js.map → chunk-IW4MX7OX.js.map} +0 -0
- /package/dist/{chunk-7NBQQOCU.js.map → chunk-J4WOF6WK.js.map} +0 -0
- /package/dist/{chunk-VAURJ4QJ.js.map → chunk-J63TN3GR.js.map} +0 -0
- /package/dist/{chunk-JSOOLOHP.js.map → chunk-JESSFI7R.js.map} +0 -0
- /package/dist/{chunk-H3RCEM6L.js.map → chunk-K4QPBXV7.js.map} +0 -0
- /package/dist/{chunk-YAMKCMAS.js.map → chunk-K5VDDKKF.js.map} +0 -0
- /package/dist/{chunk-WTPID22G.js.map → chunk-KM5K47TW.js.map} +0 -0
- /package/dist/{chunk-ITIUWJGQ.js.map → chunk-LGJIJVVH.js.map} +0 -0
- /package/dist/{chunk-IAE24RKD.js.map → chunk-LHSSIUU4.js.map} +0 -0
- /package/dist/{chunk-EKOMZH2S.js.map → chunk-LQMPA4DY.js.map} +0 -0
- /package/dist/{chunk-RVIBHENP.js.map → chunk-M3IXPK6U.js.map} +0 -0
- /package/dist/{chunk-2Z6PFHD2.js.map → chunk-MJU5VKX2.js.map} +0 -0
- /package/dist/{chunk-D5HD46VV.js.map → chunk-MRGU3NPN.js.map} +0 -0
- /package/dist/{chunk-2YXTXSYG.js.map → chunk-MSLFPL77.js.map} +0 -0
- /package/dist/{chunk-L4QEMWNJ.js.map → chunk-NKCWJPMN.js.map} +0 -0
- /package/dist/{chunk-LQACNCAV.js.map → chunk-OADMSHME.js.map} +0 -0
- /package/dist/{chunk-X25XRSDP.js.map → chunk-ONGZKI5J.js.map} +0 -0
- /package/dist/{chunk-RRKUXGAU.js.map → chunk-OOZNTJP6.js.map} +0 -0
- /package/dist/{chunk-MIHY534L.js.map → chunk-OP3NHIFH.js.map} +0 -0
- /package/dist/{chunk-5QNW5PCM.js.map → chunk-OU4KWL6B.js.map} +0 -0
- /package/dist/{chunk-COOJKEJE.js.map → chunk-PLIGHRIQ.js.map} +0 -0
- /package/dist/{chunk-4AO3LSYM.js.map → chunk-PLROJ3SX.js.map} +0 -0
- /package/dist/{chunk-VAV5CCDD.js.map → chunk-PSM3RI4B.js.map} +0 -0
- /package/dist/{chunk-Q3G4ZI2U.js.map → chunk-Q4O7ICAK.js.map} +0 -0
- /package/dist/{chunk-TNI7CN4L.js.map → chunk-Q6XM6ZDB.js.map} +0 -0
- /package/dist/{chunk-O2ECZKXP.js.map → chunk-QHRUCSRI.js.map} +0 -0
- /package/dist/{chunk-IYDESWW4.js.map → chunk-QUDPMIW7.js.map} +0 -0
- /package/dist/{chunk-22RM3UOO.js.map → chunk-QZ4YHQLW.js.map} +0 -0
- /package/dist/{chunk-Z3RGBLVJ.js.map → chunk-R2JGUOT6.js.map} +0 -0
- /package/dist/{chunk-YDALLZNS.js.map → chunk-R5I4IHJ5.js.map} +0 -0
- /package/dist/{chunk-MSIOGH67.js.map → chunk-RJXO66C4.js.map} +0 -0
- /package/dist/{chunk-CF5I4Q5M.js.map → chunk-RYNN6UUF.js.map} +0 -0
- /package/dist/{chunk-SIRRBWQ2.js.map → chunk-S4V2GOKV.js.map} +0 -0
- /package/dist/{chunk-6EOWBGGW.js.map → chunk-S7D4GTYY.js.map} +0 -0
- /package/dist/{chunk-MZPS46OR.js.map → chunk-SIKCVWM3.js.map} +0 -0
- /package/dist/{chunk-4HFM5RCP.js.map → chunk-T4RV7XOC.js.map} +0 -0
- /package/dist/{chunk-HPF3USL2.js.map → chunk-TDUAGNSQ.js.map} +0 -0
- /package/dist/{chunk-W3TZPHZO.js.map → chunk-TZRWET3S.js.map} +0 -0
- /package/dist/{chunk-C7KV5O5J.js.map → chunk-U5V4CIIG.js.map} +0 -0
- /package/dist/{chunk-DPOUS5DN.js.map → chunk-U625CQ3Y.js.map} +0 -0
- /package/dist/{chunk-QVHZTCB5.js.map → chunk-UDEVIXKX.js.map} +0 -0
- /package/dist/{chunk-LJEJCIHR.js.map → chunk-UUDWZIDC.js.map} +0 -0
- /package/dist/{chunk-LAOCXV6Z.js.map → chunk-VAQBBNLD.js.map} +0 -0
- /package/dist/{chunk-BIBXZJZI.js.map → chunk-VCDFBFPT.js.map} +0 -0
- /package/dist/{chunk-MPTNN35I.js.map → chunk-VF3W7CI7.js.map} +0 -0
- /package/dist/{chunk-KUI74TNG.js.map → chunk-VHOOAQY4.js.map} +0 -0
- /package/dist/{chunk-6MJKVNLL.js.map → chunk-VK2VC6A2.js.map} +0 -0
- /package/dist/{chunk-3WN5GWX4.js.map → chunk-WWPRSJOS.js.map} +0 -0
- /package/dist/{chunk-BMMXYR7A.js.map → chunk-WZXMZFVB.js.map} +0 -0
- /package/dist/{chunk-O5VSYBUA.js.map → chunk-XKYFNMTB.js.map} +0 -0
- /package/dist/{chunk-I33FO2ON.js.map → chunk-XL42ZEVH.js.map} +0 -0
- /package/dist/{chunk-XWAOECD2.js.map → chunk-XPUQFPIU.js.map} +0 -0
- /package/dist/{chunk-CBVUO7SK.js.map → chunk-XQEHLDGP.js.map} +0 -0
- /package/dist/{chunk-S5S54J2K.js.map → chunk-XQWC223L.js.map} +0 -0
- /package/dist/{chunk-VWHUO3AP.js.map → chunk-XYDHBLZ2.js.map} +0 -0
- /package/dist/{chunk-V7EN5LFS.js.map → chunk-XZO6ONVI.js.map} +0 -0
- /package/dist/{chunk-H25GY4U4.js.map → chunk-YFFQ3HY4.js.map} +0 -0
- /package/dist/{chunk-URGXEDFV.js.map → chunk-YGUGL4ZL.js.map} +0 -0
- /package/dist/{chunk-2Q7K4F4H.js.map → chunk-YOHGEF2N.js.map} +0 -0
- /package/dist/{chunk-TLQY4QBW.js.map → chunk-YT3S2XFG.js.map} +0 -0
- /package/dist/{chunk-IJ6WA2JW.js.map → chunk-ZPCZ4XDB.js.map} +0 -0
- /package/dist/{cite-WCAOCOO5.js.map → cite-2ZJG3FBV.js.map} +0 -0
- /package/dist/{claim-3UMAFZEM.js.map → claim-IGU5W4CT.js.map} +0 -0
- /package/dist/{client-VCKP6WBR.js.map → client-MSRCSDB7.js.map} +0 -0
- /package/dist/{code-VXOTFGD2.js.map → code-T7Z5JDQ2.js.map} +0 -0
- /package/dist/{companies-RL5A26AT.js.map → companies-HCSBVXCE.js.map} +0 -0
- /package/dist/{company-DJ44F5C6.js.map → company-SSMY4G2T.js.map} +0 -0
- /package/dist/{complete-PGNIP3LN.js.map → complete-FQNRXUI5.js.map} +0 -0
- /package/dist/{config-UR45YCIN.js.map → config-XRPKA5QR.js.map} +0 -0
- /package/dist/{connect-ROARWN63.js.map → connect-VXEE3QBU.js.map} +0 -0
- /package/dist/{content-EQQIKG5H.js.map → content-2JFP747N.js.map} +0 -0
- /package/dist/{conversation-GDFMJL7X.js.map → conversation-KKJKZIX5.js.map} +0 -0
- /package/dist/{conversion-report-2FREFML5.js.map → conversion-report-G65UHQRO.js.map} +0 -0
- /package/dist/{conversion-writes-JZIJSQ7T.js.map → conversion-writes-333V4OVR.js.map} +0 -0
- /package/dist/{conversions-2IFWDQKK.js.map → conversions-7UHCNIAO.js.map} +0 -0
- /package/dist/{conversions-Q5EBTEXA.js.map → conversions-L6775Q22.js.map} +0 -0
- /package/dist/{countries-GRCU4IGM.js.map → countries-XJVDM635.js.map} +0 -0
- /package/dist/{create-BRCSXXFO.js.map → create-AXWJECPP.js.map} +0 -0
- /package/dist/{create-PXAUL6FF.js.map → create-B24XHUGZ.js.map} +0 -0
- /package/dist/{create-B5DIYK5D.js.map → create-HJKTD5FN.js.map} +0 -0
- /package/dist/{create-R6CMATVY.js.map → create-V4NGP5KB.js.map} +0 -0
- /package/dist/{creatives-4EPM3RHG.js.map → creatives-OKFLX67Y.js.map} +0 -0
- /package/dist/{creatives-D6O6Z46U.js.map → creatives-WX6GQ37F.js.map} +0 -0
- /package/dist/{credentials-CLJO7WWY.js.map → credentials-4JFUH6FN.js.map} +0 -0
- /package/dist/{crm-JJHYRABB.js.map → crm-6MLYUEK7.js.map} +0 -0
- /package/dist/{crm-H5ITJ2RC.js.map → crm-PUQBWZKE.js.map} +0 -0
- /package/dist/{crop-NE7YX4SS.js.map → crop-V5MSIY5F.js.map} +0 -0
- /package/dist/{currency-EFDQYW5B.js.map → currency-SCSJ5FW2.js.map} +0 -0
- /package/dist/{custom-conversions-GQTU5E6X.js.map → custom-conversions-GN4JDS5F.js.map} +0 -0
- /package/dist/{customers-C5YXAVXI.js.map → customers-WXD2LTUC.js.map} +0 -0
- /package/dist/{decide-6Q5X3V3F.js.map → decide-PW2NRMRK.js.map} +0 -0
- /package/dist/{delete-WZ3KVVX5.js.map → delete-EAJN6ZHT.js.map} +0 -0
- /package/dist/{delete-NBUDIGSD.js.map → delete-GDIFIYA2.js.map} +0 -0
- /package/dist/{delete-3GYCQK6B.js.map → delete-JQG3ZWQX.js.map} +0 -0
- /package/dist/{delete-SP66F7ZV.js.map → delete-L7CGJ23X.js.map} +0 -0
- /package/dist/{delete-QHDDR66K.js.map → delete-OQREQEGN.js.map} +0 -0
- /package/dist/{delete-EKKOEB3N.js.map → delete-ZR3DVLWU.js.map} +0 -0
- /package/dist/{demographics-O7AJW7DO.js.map → demographics-LMRGNO7J.js.map} +0 -0
- /package/dist/{describe-MAGTSOW4.js.map → describe-OHWLLBDE.js.map} +0 -0
- /package/dist/{describe-DJPIUEFE.js.map → describe-YELOXWHY.js.map} +0 -0
- /package/dist/{dimensions-IC2H7V3H.js.map → dimensions-CLLCVVRY.js.map} +0 -0
- /package/dist/{discard-RMVZAX2J.js.map → discard-K2KIIFJQ.js.map} +0 -0
- /package/dist/{discover-PSL2NBJL.js.map → discover-SQJLRS4G.js.map} +0 -0
- /package/dist/{discover-BPUUWRBP.js.map → discover-UJMDGDQO.js.map} +0 -0
- /package/dist/{domain-J3ZMBOHS.js.map → domain-CJX5JSLS.js.map} +0 -0
- /package/dist/{download-ZVOGLTFB.js.map → download-HFDBP6BO.js.map} +0 -0
- /package/dist/{download-EHDJXBAC.js.map → download-SZ5P3GLV.js.map} +0 -0
- /package/dist/{draft-GCOCG4PO.js.map → draft-7QDE2Z3N.js.map} +0 -0
- /package/dist/{draft-27NMTARB.js.map → draft-ILXHFWTT.js.map} +0 -0
- /package/dist/{draft-6PJD3MCW.js.map → draft-NUFU5YME.js.map} +0 -0
- /package/dist/{draft-TPR3DH5N.js.map → draft-QSTD3DH2.js.map} +0 -0
- /package/dist/{draft-MWYKIZC4.js.map → draft-TV5IH5U4.js.map} +0 -0
- /package/dist/{draft-JESKGZ6O.js.map → draft-WNMHUFAH.js.map} +0 -0
- /package/dist/{env-NZXNMWSD.js.map → env-3256G2OE.js.map} +0 -0
- /package/dist/{experiment-XAYSEYTU.js.map → experiment-5L5USMAL.js.map} +0 -0
- /package/dist/{export-W54UZ62P.js.map → export-YSOM4E3B.js.map} +0 -0
- /package/dist/{extract-JMY6YRPW.js.map → extract-7FYXXEQZ.js.map} +0 -0
- /package/dist/{facets-B5AZAU2C.js.map → facets-2FRELYRC.js.map} +0 -0
- /package/dist/{favorites-Y6CT6NSQ.js.map → favorites-LTG2F6W2.js.map} +0 -0
- /package/dist/{feed-35BRQPTH.js.map → feed-RSBWEI75.js.map} +0 -0
- /package/dist/{feedback-4MCMOMVN.js.map → feedback-PQUM7UBT.js.map} +0 -0
- /package/dist/{fetch-I6P72CDL.js.map → fetch-3PWYTX4R.js.map} +0 -0
- /package/dist/{fetch-JDNFK476.js.map → fetch-FLQYW27W.js.map} +0 -0
- /package/dist/{find-SVGRA7IA.js.map → find-SHHDWCPM.js.map} +0 -0
- /package/dist/{fit-DKVH5BDW.js.map → fit-4XCDLF7C.js.map} +0 -0
- /package/dist/{flows-LURTZICL.js.map → flows-4ALWJVNF.js.map} +0 -0
- /package/dist/{follow-24QSDNAG.js.map → follow-N4TKU3UM.js.map} +0 -0
- /package/dist/{follow-competitors-AG4E4XFA.js.map → follow-competitors-AHQ57BWS.js.map} +0 -0
- /package/dist/{following-YGM6TBK3.js.map → following-CEYH33DW.js.map} +0 -0
- /package/dist/{fonts-HUXFDDAE.js.map → fonts-CYJ5EFR4.js.map} +0 -0
- /package/dist/{forecast-UHTW4Y7Q.js.map → forecast-SG2VUBZD.js.map} +0 -0
- /package/dist/{funding-WZNGXRLJ.js.map → funding-X7M5WLDX.js.map} +0 -0
- /package/dist/{funnel-QM7WFFMD.js.map → funnel-F7DS7PUN.js.map} +0 -0
- /package/dist/{ga4-W3U5YTRT.js.map → ga4-QPBAKGSH.js.map} +0 -0
- /package/dist/{generate-KAWRRYTT.js.map → generate-LVBI3VDD.js.map} +0 -0
- /package/dist/{get-YWDZYEAC.js.map → get-DMV7KG2F.js.map} +0 -0
- /package/dist/{get-GEUSRD5Y.js.map → get-EA7AX4NW.js.map} +0 -0
- /package/dist/{get-TS2ZJDCQ.js.map → get-EOSJWMWT.js.map} +0 -0
- /package/dist/{get-JIZPYK3Z.js.map → get-HVQHHDW6.js.map} +0 -0
- /package/dist/{get-3MTAVNTP.js.map → get-KQLCVQCK.js.map} +0 -0
- /package/dist/{get-FWPR2YPC.js.map → get-NAOMB6Q2.js.map} +0 -0
- /package/dist/{get-5SPNAIUQ.js.map → get-XYJBQFIT.js.map} +0 -0
- /package/dist/{get-237TYJZT.js.map → get-XZ7XPXZE.js.map} +0 -0
- /package/dist/{gif-NP6EDGEE.js.map → gif-XJ26IWAP.js.map} +0 -0
- /package/dist/{google-DTSLO3PT.js.map → google-QOKWSPOA.js.map} +0 -0
- /package/dist/{google-ads-RZOQQDQN.js.map → google-ads-B4FBPQ7O.js.map} +0 -0
- /package/dist/{group-3DT4UYSR.js.map → group-7EYM3PNJ.js.map} +0 -0
- /package/dist/{group-OEKKCFXT.js.map → group-GDTEICRY.js.map} +0 -0
- /package/dist/{gsc-4FEFPFPB.js.map → gsc-KVIAZMF4.js.map} +0 -0
- /package/dist/{history-YQSYXBJH.js.map → history-22YGILIT.js.map} +0 -0
- /package/dist/{history-XL52537O.js.map → history-E3JGYADF.js.map} +0 -0
- /package/dist/{history-H7S7XRBX.js.map → history-HKCSYH5L.js.map} +0 -0
- /package/dist/{hubspot-2DSISSUI.js.map → hubspot-LEW2RP5D.js.map} +0 -0
- /package/dist/{icon-43UJTGGE.js.map → icon-JLVEYF34.js.map} +0 -0
- /package/dist/{ideas-2XBFQJ56.js.map → ideas-JAIU4GC4.js.map} +0 -0
- /package/dist/{images-VFRQ32G5.js.map → images-ZG6RRAEP.js.map} +0 -0
- /package/dist/{improve-IMXQN6OD.js.map → improve-XSHWCMZS.js.map} +0 -0
- /package/dist/{ingest-4RPLN54K.js.map → ingest-GTXBGUNQ.js.map} +0 -0
- /package/dist/{ingest-TPVH44VI.js.map → ingest-SX7K6GNE.js.map} +0 -0
- /package/dist/{insights-UVCFOB3N.js.map → insights-IVUUWSQL.js.map} +0 -0
- /package/dist/{insights-BR3456EI.js.map → insights-PJPQB46E.js.map} +0 -0
- /package/dist/{inspect-VD3GVXDU.js.map → inspect-55BXSPJG.js.map} +0 -0
- /package/dist/{inspiration-XZI5KCQW.js.map → inspiration-NBOKHPZ5.js.map} +0 -0
- /package/dist/{intent-F5NTOSQC.js.map → intent-KSVTHFFE.js.map} +0 -0
- /package/dist/{job-GOX3KIKG.js.map → job-4VXDCYSG.js.map} +0 -0
- /package/dist/{job-create-F2PQSN3C.js.map → job-create-NZEZDOZT.js.map} +0 -0
- /package/dist/{job-status-3FMA5D7T.js.map → job-status-XI3ENS7D.js.map} +0 -0
- /package/dist/{keep-23ZYMWPG.js.map → keep-UYNOC3JZ.js.map} +0 -0
- /package/dist/{keyword-gap-EB5QATYN.js.map → keyword-gap-7UVDSID5.js.map} +0 -0
- /package/dist/{keyword-metrics-PW2DDIJW.js.map → keyword-metrics-QFRXZRAQ.js.map} +0 -0
- /package/dist/{keywords-for-site-JEPABY6E.js.map → keywords-for-site-Q4BCJ4PQ.js.map} +0 -0
- /package/dist/{knowledge-7M7DSRF3.js.map → knowledge-LVE3J3AK.js.map} +0 -0
- /package/dist/{landing-4N6YSB4L.js.map → landing-AJYM5GBY.js.map} +0 -0
- /package/dist/{landings-VNQ4VA2U.js.map → landings-SIN3MTUZ.js.map} +0 -0
- /package/dist/{languages-4S26FJDP.js.map → languages-AIASAINW.js.map} +0 -0
- /package/dist/{languages-2X22HXM3.js.map → languages-RDR6EBNJ.js.map} +0 -0
- /package/dist/{launches-L4EUROCJ.js.map → launches-4TVHXAZT.js.map} +0 -0
- /package/dist/{layerize-6QHQMA7Q.js.map → layerize-OLVGZRND.js.map} +0 -0
- /package/dist/{lead-routes-5TPFJEVH.js.map → lead-routes-ZOQDPCR3.js.map} +0 -0
- /package/dist/{leads-R5OZJQHW.js.map → leads-YSDLFBHN.js.map} +0 -0
- /package/dist/{learn-AQ2FRFB7.js.map → learn-FDQZNIP3.js.map} +0 -0
- /package/dist/{library-MNJC24E4.js.map → library-7CLWRDM3.js.map} +0 -0
- /package/dist/{lighthouse-DJMAXFTD.js.map → lighthouse-3ACQ3MVG.js.map} +0 -0
- /package/dist/{line-item-writes-LGO7HIJJ.js.map → line-item-writes-JARN73DV.js.map} +0 -0
- /package/dist/{line-items-AAZVKQ7E.js.map → line-items-B5GLDAJ2.js.map} +0 -0
- /package/dist/{link-7IGHVARH.js.map → link-YAZF34BZ.js.map} +0 -0
- /package/dist/{linkedin-person-D6U2ZAUW.js.map → linkedin-person-XDH7Q3PB.js.map} +0 -0
- /package/dist/{list-537S75BZ.js.map → list-6NYRZXKQ.js.map} +0 -0
- /package/dist/{list-WIXQXNKB.js.map → list-6WISGNQ2.js.map} +0 -0
- /package/dist/{list-Q52FPW3H.js.map → list-6YBIWX44.js.map} +0 -0
- /package/dist/{list-P44QRX2O.js.map → list-72JQGWNO.js.map} +0 -0
- /package/dist/{list-UMJACDTQ.js.map → list-FX7OG3OJ.js.map} +0 -0
- /package/dist/{list-2277GCPH.js.map → list-ITPBLMV3.js.map} +0 -0
- /package/dist/{list-XK33NCSC.js.map → list-J43GOBOX.js.map} +0 -0
- /package/dist/{list-V4PSDBLX.js.map → list-K4Z3BOWI.js.map} +0 -0
- /package/dist/{list-VZKUHY4Y.js.map → list-ONSYTCX2.js.map} +0 -0
- /package/dist/{locations-WXGOI3VV.js.map → locations-UNSREUBX.js.map} +0 -0
- /package/dist/{locations-UWBQLHXW.js.map → locations-XAC3GME3.js.map} +0 -0
- /package/dist/{log-6ZKMUTYS.js.map → log-PPNNFETI.js.map} +0 -0
- /package/dist/{logo-4LSFZ3ZO.js.map → logo-UNVIMA4B.js.map} +0 -0
- /package/dist/{lookup-WIM5WR25.js.map → lookup-L5QG3BWH.js.map} +0 -0
- /package/dist/{map-ZL4MQVJZ.js.map → map-QILMIKS7.js.map} +0 -0
- /package/dist/{mcp-GSRYLRD4.js.map → mcp-GOKFM4PF.js.map} +0 -0
- /package/dist/{media-KKI3KWLR.js.map → media-BN6B75NF.js.map} +0 -0
- /package/dist/{media-34I7UB7Z.js.map → media-YDDWV32Y.js.map} +0 -0
- /package/dist/{media-sources-VSPVHLYN.js.map → media-sources-HABLVJE3.js.map} +0 -0
- /package/dist/{members-L6SXP6GC.js.map → members-B4UI6ISY.js.map} +0 -0
- /package/dist/{meme-6NFYFQ7T.js.map → meme-2MERLAVW.js.map} +0 -0
- /package/dist/{meta-2UK7KIE4.js.map → meta-7FJQD44L.js.map} +0 -0
- /package/dist/{metrics-4AFEEDVP.js.map → metrics-SBKBEZJR.js.map} +0 -0
- /package/dist/{models-2ZEM64H5.js.map → models-ZBLBNNEH.js.map} +0 -0
- /package/dist/{normalize-G75RDSE4.js.map → normalize-5WVEQJXD.js.map} +0 -0
- /package/dist/{normalize-GK7DH7ZP.js.map → normalize-YPQBHWYS.js.map} +0 -0
- /package/dist/{options-FDAAHG7C.js.map → options-BV3TVUCK.js.map} +0 -0
- /package/dist/{organization-K2FTFAAO.js.map → organization-4OTGNRHP.js.map} +0 -0
- /package/dist/{output-ELEO2Z6R.js.map → output-FX4KJAO5.js.map} +0 -0
- /package/dist/{page-4X6IBUWG.js.map → page-5KWQ7PM3.js.map} +0 -0
- /package/dist/{pages-7HW5YOZV.js.map → pages-HKTAGXH3.js.map} +0 -0
- /package/dist/{performance-N3UROH7Z.js.map → performance-4MWQVTTA.js.map} +0 -0
- /package/dist/{performance-RG2HR46T.js.map → performance-TKE7NQF6.js.map} +0 -0
- /package/dist/{pinterest-KA6VFDM4.js.map → pinterest-UDX53CWY.js.map} +0 -0
- /package/dist/{pixels-D5HF24FI.js.map → pixels-BSNCVT77.js.map} +0 -0
- /package/dist/{pixels-HEI5WVAO.js.map → pixels-TR2PAYWV.js.map} +0 -0
- /package/dist/{plan-XCA6R3HZ.js.map → plan-V57AATQ5.js.map} +0 -0
- /package/dist/{posts-ALGM6ONV.js.map → posts-JHMXNHDV.js.map} +0 -0
- /package/dist/{preview-55TRUF4Q.js.map → preview-VY7UH2SK.js.map} +0 -0
- /package/dist/{preview-NVWIEUHF.js.map → preview-XUG4K4KV.js.map} +0 -0
- /package/dist/{profile-NHUPUCBR.js.map → profile-PV3R3BEG.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-7QZRFDOM.js.map → promoted-tweet-writes-O3S5OKUZ.js.map} +0 -0
- /package/dist/{promoted-tweets-V555Y7DN.js.map → promoted-tweets-4ZKSEC4I.js.map} +0 -0
- /package/dist/{properties-2ZXA5BPJ.js.map → properties-U2XUD2M6.js.map} +0 -0
- /package/dist/{publish-5KR6YLA6.js.map → publish-4RAYD7VI.js.map} +0 -0
- /package/dist/{query-K7MYBRTS.js.map → query-4C6UQN42.js.map} +0 -0
- /package/dist/{query-63CTX2PH.js.map → query-7FWE7GLV.js.map} +0 -0
- /package/dist/{query-DMWY3TDD.js.map → query-7Y2Y6YFI.js.map} +0 -0
- /package/dist/{questionnaire-WHE42RD4.js.map → questionnaire-3IPJXJT7.js.map} +0 -0
- /package/dist/{read-NESEKULG.js.map → read-WEQLEI7R.js.map} +0 -0
- /package/dist/{reddit-XPQ7YAJW.js.map → reddit-2FWCB7XY.js.map} +0 -0
- /package/dist/{refresh-XFHEBSDU.js.map → refresh-SGDB4QOD.js.map} +0 -0
- /package/dist/{refresh-ILDEPU5A.js.map → refresh-WZBVPKWE.js.map} +0 -0
- /package/dist/{release-3ECEF26P.js.map → release-YL3ZII3Z.js.map} +0 -0
- /package/dist/{relevant-pages-XYQKVX3U.js.map → relevant-pages-PF3LLUED.js.map} +0 -0
- /package/dist/{remove-NHE4UT7G.js.map → remove-52MSQXSW.js.map} +0 -0
- /package/dist/{remove-OCTUC3RB.js.map → remove-EIV7LJUA.js.map} +0 -0
- /package/dist/{reopen-JRI3TYD4.js.map → reopen-CW27MUJH.js.map} +0 -0
- /package/dist/{research-ODPU62BA.js.map → research-234BOCKM.js.map} +0 -0
- /package/dist/{research-TG5CBTYP.js.map → research-RABLL4HR.js.map} +0 -0
- /package/dist/{reset-J2NLNITD.js.map → reset-5KJDDVJL.js.map} +0 -0
- /package/dist/{reset-SRU7YJUR.js.map → reset-REUL47CB.js.map} +0 -0
- /package/dist/{resolve-KHMMUGB2.js.map → resolve-WRDEHLYL.js.map} +0 -0
- /package/dist/{retry-WP7LWKZF.js.map → retry-2A5HV4SN.js.map} +0 -0
- /package/dist/{retry-VLH4AO7F.js.map → retry-FNT2XVH3.js.map} +0 -0
- /package/dist/{retry-failed-R5HPQ3KQ.js.map → retry-failed-ND7UXYTJ.js.map} +0 -0
- /package/dist/{rules-FYVD2QBB.js.map → rules-2CUG2YG7.js.map} +0 -0
- /package/dist/{run-YA6IWQAJ.js.map → run-RKLNKV2U.js.map} +0 -0
- /package/dist/{run-AQTACLY6.js.map → run-YKGN3GQR.js.map} +0 -0
- /package/dist/{schedule-D7EDEM45.js.map → schedule-774JCRVM.js.map} +0 -0
- /package/dist/{schedule-EH2MOC5C.js.map → schedule-PKKSZ5RX.js.map} +0 -0
- /package/dist/{scheduled-agents-DTAEP25E.js.map → scheduled-agents-ZI3EWKAT.js.map} +0 -0
- /package/dist/{schema-7B4MVVAS.js.map → schema-BXNL4LKR.js.map} +0 -0
- /package/dist/{schema-Z43AJOJ4.js.map → schema-GFMVUZL2.js.map} +0 -0
- /package/dist/{scrape-VL2RWSTW.js.map → scrape-KKLE4WAU.js.map} +0 -0
- /package/dist/{screenshot-Y6EEXS3Q.js.map → screenshot-K6XOER6Z.js.map} +0 -0
- /package/dist/{search-TXBYKNQC.js.map → search-43ULIJL3.js.map} +0 -0
- /package/dist/{search-CXC7N5XJ.js.map → search-AXUNJUWY.js.map} +0 -0
- /package/dist/{search-XHSTUBDY.js.map → search-DLLJEYMB.js.map} +0 -0
- /package/dist/{search-L3GTZYRW.js.map → search-LWWTXBB2.js.map} +0 -0
- /package/dist/{search-JEXYEAPQ.js.map → search-VU6GI3U3.js.map} +0 -0
- /package/dist/{search-ZZWIJRXJ.js.map → search-XO365KES.js.map} +0 -0
- /package/dist/{search-copy-FIPG7OCC.js.map → search-copy-BHNLLCUV.js.map} +0 -0
- /package/dist/{seeds-ADJKURNG.js.map → seeds-6ROVZBFB.js.map} +0 -0
- /package/dist/{sends-RS4LWRAC.js.map → sends-P6OPCYH5.js.map} +0 -0
- /package/dist/{sequences-2RPKDKGQ.js.map → sequences-DP4BHM3E.js.map} +0 -0
- /package/dist/{setup-links-OE6PC2YQ.js.map → setup-links-T5TJZA3E.js.map} +0 -0
- /package/dist/{shared-4GGUIOF2.js.map → shared-24IPELBM.js.map} +0 -0
- /package/dist/{shopify-CCPLZI2H.js.map → shopify-OQEKI7HC.js.map} +0 -0
- /package/dist/{site-FW5BBLYG.js.map → site-QRLBZPEV.js.map} +0 -0
- /package/dist/{sitemaps-Z6IELTQV.js.map → sitemaps-SWADO4SI.js.map} +0 -0
- /package/dist/{sites-KLAKI2EY.js.map → sites-H3FYJQFO.js.map} +0 -0
- /package/dist/{skills-OJP36EVR.js.map → skills-OYO6Y3DQ.js.map} +0 -0
- /package/dist/{sources-X77TGJ52.js.map → sources-U2WRH6D7.js.map} +0 -0
- /package/dist/{sources-WPHMWBEK.js.map → sources-Y2BKZVXA.js.map} +0 -0
- /package/dist/{stats-MIMFX4R7.js.map → stats-TTJHXR3E.js.map} +0 -0
- /package/dist/{status-FLETGJ2A.js.map → status-4BSXND3I.js.map} +0 -0
- /package/dist/{sticker-IREEEN7I.js.map → sticker-CRIAIO75.js.map} +0 -0
- /package/dist/{stock-5AOSQH52.js.map → stock-TOFKLWSR.js.map} +0 -0
- /package/dist/{studies-YGYAH3JI.js.map → studies-VFNWS6ND.js.map} +0 -0
- /package/dist/{studio-4EV5S7PR.js.map → studio-WD364TWB.js.map} +0 -0
- /package/dist/{suggest-5RTISDLI.js.map → suggest-GX4IROQN.js.map} +0 -0
- /package/dist/{sync-OHIXI4I6.js.map → sync-BU7HU3FS.js.map} +0 -0
- /package/dist/{sync-363VKXU3.js.map → sync-GQL5JX4U.js.map} +0 -0
- /package/dist/{sync-VCAFAYW4.js.map → sync-VNBBOVBU.js.map} +0 -0
- /package/dist/{sync-definition-ZDE5L644.js.map → sync-definition-EOARPSBS.js.map} +0 -0
- /package/dist/{tag-DSCUKNC3.js.map → tag-SQ5ROLTP.js.map} +0 -0
- /package/dist/{tag-manager-IINALUEJ.js.map → tag-manager-7S7PVYIJ.js.map} +0 -0
- /package/dist/{tags-YHAC3NVY.js.map → tags-2226Q3VK.js.map} +0 -0
- /package/dist/{tags-VOKUNEIW.js.map → tags-7QIBFIBX.js.map} +0 -0
- /package/dist/{tags-Y6MNMIEA.js.map → tags-BNWKAV3H.js.map} +0 -0
- /package/dist/{tags-6MN3AWKN.js.map → tags-HG5EBHSO.js.map} +0 -0
- /package/dist/{tags-ZCQMJ5YH.js.map → tags-WTN4EBT5.js.map} +0 -0
- /package/dist/{targeting-constants-54S3FXIF.js.map → targeting-constants-6KZXMRNI.js.map} +0 -0
- /package/dist/{targeting-criteria-ECQFHQF3.js.map → targeting-criteria-QSCRW75G.js.map} +0 -0
- /package/dist/{targets-U2JHTB5U.js.map → targets-3KT3DO6O.js.map} +0 -0
- /package/dist/{terms-OFHNLW6U.js.map → terms-IRLEAMIY.js.map} +0 -0
- /package/dist/{testimonials-IDVLMXDT.js.map → testimonials-35FTFNQ5.js.map} +0 -0
- /package/dist/{top-companies-CBI4O3ZB.js.map → top-companies-JAWMSK2Q.js.map} +0 -0
- /package/dist/{transcript-IIRFTFRW.js.map → transcript-OIYU7F4E.js.map} +0 -0
- /package/dist/{triggers-Q3KRAMA3.js.map → triggers-7QRQFTVM.js.map} +0 -0
- /package/dist/{tweets-TRTXC6O4.js.map → tweets-7XVF7PJO.js.map} +0 -0
- /package/dist/{unfollow-DATOGPLZ.js.map → unfollow-ZCP6D2SC.js.map} +0 -0
- /package/dist/{unlink-7RVQXKAR.js.map → unlink-PYCYTYVN.js.map} +0 -0
- /package/dist/{unstage-3LPHNZKR.js.map → unstage-2OUF6ELM.js.map} +0 -0
- /package/dist/{unstage-LLQCMZ5H.js.map → unstage-YADONHH6.js.map} +0 -0
- /package/dist/{update-SD5YQIJC.js.map → update-DEBDSBDI.js.map} +0 -0
- /package/dist/{update-AL3LBHGK.js.map → update-IDUSNDOI.js.map} +0 -0
- /package/dist/{update-YBTFH5MN.js.map → update-NG3HUYZZ.js.map} +0 -0
- /package/dist/{update-AWR7EHGA.js.map → update-P5IT7AIN.js.map} +0 -0
- /package/dist/{update-LNSSLZXG.js.map → update-U6NU7OXI.js.map} +0 -0
- /package/dist/{upload-45GCGMA5.js.map → upload-4F2JICEH.js.map} +0 -0
- /package/dist/{upload-7PPMVWVA.js.map → upload-SS64KHDS.js.map} +0 -0
- /package/dist/{upscale-WVJZG76V.js.map → upscale-JNNXDN6X.js.map} +0 -0
- /package/dist/{url-options-AHJPR5VY.js.map → url-options-EDPKAPPP.js.map} +0 -0
- /package/dist/{url-params-U6ZM4LL2.js.map → url-params-4G26OEOO.js.map} +0 -0
- /package/dist/{use-6FADOAFZ.js.map → use-TKFP6WVP.js.map} +0 -0
- /package/dist/{variant-RNM36P4J.js.map → variant-3VTKOQUR.js.map} +0 -0
- /package/dist/{videos-GHFCOTT7.js.map → videos-EDTBHLOZ.js.map} +0 -0
- /package/dist/{videos-NW2UP342.js.map → videos-JRNJH66J.js.map} +0 -0
- /package/dist/{view-YR6MDLWL.js.map → view-6HX3FYMS.js.map} +0 -0
- /package/dist/{viewer-check-IDXFRRCO.js.map → viewer-check-OBBBAYV5.js.map} +0 -0
- /package/dist/{web-VMPKMBKA.js.map → web-GPUEUIDT.js.map} +0 -0
- /package/dist/{winners-4T5RFQXU.js.map → winners-MEC77MZ4.js.map} +0 -0
- /package/dist/{winning-ads-7UJXCWFH.js.map → winning-ads-2DECFON4.js.map} +0 -0
- /package/dist/{write-commands-UO3OQIHH.js.map → write-commands-D5M5A4YI.js.map} +0 -0
- /package/dist/{write-commands-6D55SB56.js.map → write-commands-LQVERLAQ.js.map} +0 -0
- /package/dist/{x-UGTUOCVR.js.map → x-4TM5RET4.js.map} +0 -0
package/dist/chunk-XHWHBGKX.js
DELETED
|
@@ -1,4277 +0,0 @@
|
|
|
1
|
-
// ../api/src/ads-google/limits.ts
|
|
2
|
-
var GOOGLE_ADS_LIMITS = {
|
|
3
|
-
budget: {
|
|
4
|
-
nameMax: 255,
|
|
5
|
-
amountMicrosMin: 1
|
|
6
|
-
},
|
|
7
|
-
campaign: {
|
|
8
|
-
nameMax: 255,
|
|
9
|
-
/** `campaign.final_url_suffix` — the query string appended to every final URL under the campaign. */
|
|
10
|
-
finalUrlSuffixMax: 2048,
|
|
11
|
-
/** `campaign.tracking_url_template` — the click-measurement URL every ad routes through. */
|
|
12
|
-
trackingUrlTemplateMax: 2048,
|
|
13
|
-
/** `campaign.url_custom_parameters` — Google caps a single entity at 8 `{_name}` parameters. */
|
|
14
|
-
urlCustomParametersMax: 8,
|
|
15
|
-
urlCustomParameterKeyMax: 16,
|
|
16
|
-
urlCustomParameterValueMax: 250,
|
|
17
|
-
/** `campaign.text_guidelines.term_exclusions` — words AI Max and Performance Max must never write. */
|
|
18
|
-
termExclusionsMax: 25,
|
|
19
|
-
termExclusionMax: 30,
|
|
20
|
-
/** `campaign.text_guidelines.messaging_restrictions` — freeform rules for generated text. */
|
|
21
|
-
messagingRestrictionsMax: 40,
|
|
22
|
-
messagingRestrictionMax: 300
|
|
23
|
-
},
|
|
24
|
-
adGroup: {
|
|
25
|
-
nameMax: 255
|
|
26
|
-
},
|
|
27
|
-
keyword: {
|
|
28
|
-
textMax: 80,
|
|
29
|
-
wordsMax: 10
|
|
30
|
-
},
|
|
31
|
-
responsiveSearchAd: {
|
|
32
|
-
headlinesMin: 3,
|
|
33
|
-
headlinesMax: 15,
|
|
34
|
-
headlineTextMax: 30,
|
|
35
|
-
descriptionsMin: 2,
|
|
36
|
-
descriptionsMax: 4,
|
|
37
|
-
descriptionTextMax: 90,
|
|
38
|
-
pathMax: 15
|
|
39
|
-
},
|
|
40
|
-
responsiveDisplayAd: {
|
|
41
|
-
headlinesMin: 1,
|
|
42
|
-
headlinesMax: 5,
|
|
43
|
-
headlineTextMax: 30,
|
|
44
|
-
longHeadlineTextMax: 90,
|
|
45
|
-
descriptionsMin: 1,
|
|
46
|
-
descriptionsMax: 5,
|
|
47
|
-
descriptionTextMax: 90,
|
|
48
|
-
businessNameMax: 25
|
|
49
|
-
},
|
|
50
|
-
appAd: {
|
|
51
|
-
headlinesMin: 1,
|
|
52
|
-
headlinesMax: 5,
|
|
53
|
-
headlineTextMax: 30,
|
|
54
|
-
descriptionsMin: 1,
|
|
55
|
-
descriptionsMax: 5,
|
|
56
|
-
descriptionTextMax: 90,
|
|
57
|
-
imagesMax: 20,
|
|
58
|
-
youtubeVideosMax: 20
|
|
59
|
-
},
|
|
60
|
-
/** `DemandGenMultiAssetAdInfo` — the image-carrying Demand Gen ad. No long headline exists on it. */
|
|
61
|
-
demandGenAd: {
|
|
62
|
-
adNameMax: 255,
|
|
63
|
-
headlinesMin: 1,
|
|
64
|
-
headlinesMax: 5,
|
|
65
|
-
headlineTextMax: 40,
|
|
66
|
-
descriptionsMin: 1,
|
|
67
|
-
descriptionsMax: 5,
|
|
68
|
-
descriptionTextMax: 90,
|
|
69
|
-
businessNameMax: 25
|
|
70
|
-
},
|
|
71
|
-
/**
|
|
72
|
-
* `DemandGenVideoResponsiveAdInfo` — the Demand Gen ad that runs a YouTube video. It is the only
|
|
73
|
-
* ad format with BOTH a headline list and a long-headline list, which is why its copy has no home
|
|
74
|
-
* in `demandGenAd`: every content schema is strict, so a payload naming `longHeadlines` there is
|
|
75
|
-
* refused, and before this format existed a served Demand Gen video ad could not be edited at all.
|
|
76
|
-
*/
|
|
77
|
-
demandGenVideoAd: {
|
|
78
|
-
adNameMax: 255,
|
|
79
|
-
headlinesMin: 1,
|
|
80
|
-
headlinesMax: 5,
|
|
81
|
-
headlineTextMax: 40,
|
|
82
|
-
longHeadlinesMin: 1,
|
|
83
|
-
longHeadlinesMax: 5,
|
|
84
|
-
longHeadlineTextMax: 90,
|
|
85
|
-
descriptionsMin: 1,
|
|
86
|
-
descriptionsMax: 5,
|
|
87
|
-
descriptionTextMax: 90,
|
|
88
|
-
businessNameMax: 25
|
|
89
|
-
},
|
|
90
|
-
sharedSet: {
|
|
91
|
-
nameMax: 255
|
|
92
|
-
},
|
|
93
|
-
asset: {
|
|
94
|
-
sitelinkLinkTextMax: 25,
|
|
95
|
-
sitelinkDescriptionMax: 35,
|
|
96
|
-
calloutTextMax: 25,
|
|
97
|
-
// A snippet's HEADER has no length limit of its own — it has to be one of
|
|
98
|
-
// Google's published headers (`structured-snippet-headers.ts`), the longest
|
|
99
|
-
// of which is 29 characters. Only the values are capped.
|
|
100
|
-
structuredSnippetValuesMin: 3,
|
|
101
|
-
structuredSnippetValuesMax: 10,
|
|
102
|
-
/**
|
|
103
|
-
* Per VALUE, not per asset. Google rejects a 26-character value with a bare "Too long." at
|
|
104
|
-
* `structured_snippet_asset.values[i]` — one red row inside an otherwise clean publish, plus
|
|
105
|
-
* every link that depends on the asset. Confirmed live on v23: "Bases de datos vectoriales"
|
|
106
|
-
* (26) rejected, its four neighbours accepted.
|
|
107
|
-
*/
|
|
108
|
-
structuredSnippetValueMax: 25
|
|
109
|
-
},
|
|
110
|
-
conversionAction: {
|
|
111
|
-
nameMax: 255
|
|
112
|
-
},
|
|
113
|
-
audience: {
|
|
114
|
-
nameMax: 255,
|
|
115
|
-
/** `membership_life_span` and a rule's lookback window top out at 540 days. */
|
|
116
|
-
membershipLifeSpanDaysMax: 540
|
|
117
|
-
},
|
|
118
|
-
biddingStrategy: {
|
|
119
|
-
nameMax: 255
|
|
120
|
-
},
|
|
121
|
-
label: {
|
|
122
|
-
nameMax: 255
|
|
123
|
-
},
|
|
124
|
-
assetGroup: {
|
|
125
|
-
nameMax: 255,
|
|
126
|
-
headlinesMin: 3,
|
|
127
|
-
headlinesMax: 15,
|
|
128
|
-
headlineTextMax: 30,
|
|
129
|
-
longHeadlinesMin: 1,
|
|
130
|
-
longHeadlinesMax: 5,
|
|
131
|
-
longHeadlineTextMax: 90,
|
|
132
|
-
descriptionsMin: 2,
|
|
133
|
-
descriptionsMax: 5,
|
|
134
|
-
descriptionTextMax: 90,
|
|
135
|
-
businessNameMax: 25
|
|
136
|
-
},
|
|
137
|
-
/** A Performance Max asset group's signals: its search themes and its one combined audience. */
|
|
138
|
-
assetGroupSignal: {
|
|
139
|
-
searchThemesMax: 25,
|
|
140
|
-
searchThemeTextMax: 80,
|
|
141
|
-
audiencesMax: 1
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
var GOOGLE_ADS_QUERY_MAX_PAGE_SIZE = 8192;
|
|
145
|
-
var KEYWORD_MATCH_TYPES = ["EXACT", "PHRASE", "BROAD"];
|
|
146
|
-
var ADVERTISING_CHANNEL_TYPES = [
|
|
147
|
-
"SEARCH",
|
|
148
|
-
"DISPLAY",
|
|
149
|
-
"PERFORMANCE_MAX",
|
|
150
|
-
"DEMAND_GEN",
|
|
151
|
-
"SHOPPING",
|
|
152
|
-
"MULTI_CHANNEL",
|
|
153
|
-
"TRAVEL",
|
|
154
|
-
"HOTEL"
|
|
155
|
-
];
|
|
156
|
-
var CHANNEL_CREATE_REFUSALS = {
|
|
157
|
-
VIDEO: "Google does not allow Video campaigns to be created through its API. To run video on YouTube, stage a Demand Gen campaign with a Demand Gen video ad; for a Video views or reach campaign, ask the user to create it in Google Ads.",
|
|
158
|
-
LOCAL: "Google retired Local campaigns \u2014 they became Performance Max. Stage a PERFORMANCE_MAX campaign with store-visit goals instead.",
|
|
159
|
-
APP: "An App campaign is channel MULTI_CHANNEL with channelSubType APP_CAMPAIGN (installs) or APP_CAMPAIGN_FOR_ENGAGEMENT, plus appCampaignSetting.",
|
|
160
|
-
SMART: "Baker can't create Smart campaigns: their business details (phone, website, business profile) are a setting Google refuses to check before publishing, so the change could never be validated. Stage a Search or Performance Max campaign instead, or ask the user to create the Smart campaign in Google Ads.",
|
|
161
|
-
LOCAL_SERVICES: "Local Services campaigns are created by Google's own Local Services setup, not through the API. Ask the user to set it up in Google Ads.",
|
|
162
|
-
DISCOVERY: "Discovery campaigns are now Demand Gen \u2014 stage a DEMAND_GEN campaign instead."
|
|
163
|
-
};
|
|
164
|
-
var ADVERTISING_CHANNEL_SUB_TYPES = [
|
|
165
|
-
"DISPLAY_MOBILE_APP",
|
|
166
|
-
"APP_CAMPAIGN",
|
|
167
|
-
"APP_CAMPAIGN_FOR_ENGAGEMENT",
|
|
168
|
-
"TRAVEL_ACTIVITIES"
|
|
169
|
-
];
|
|
170
|
-
var SUB_TYPE_CHANNEL = {
|
|
171
|
-
DISPLAY_MOBILE_APP: "DISPLAY",
|
|
172
|
-
APP_CAMPAIGN: "MULTI_CHANNEL",
|
|
173
|
-
APP_CAMPAIGN_FOR_ENGAGEMENT: "MULTI_CHANNEL",
|
|
174
|
-
TRAVEL_ACTIVITIES: "TRAVEL"
|
|
175
|
-
};
|
|
176
|
-
var RETIRED_SUB_TYPE = "Google retired this campaign sub-type \u2014 it can no longer be created.";
|
|
177
|
-
var SUB_TYPE_CREATE_REFUSALS = {
|
|
178
|
-
SEARCH_EXPRESS: `${RETIRED_SUB_TYPE} Stage a standard Search campaign (leave the sub-type out).`,
|
|
179
|
-
DISPLAY_EXPRESS: `${RETIRED_SUB_TYPE} Stage a standard Display campaign (leave the sub-type out).`,
|
|
180
|
-
DISPLAY_GMAIL_AD: `${RETIRED_SUB_TYPE} Gmail ads now run through Demand Gen \u2014 stage a DEMAND_GEN campaign.`,
|
|
181
|
-
DISPLAY_SMART_CAMPAIGN: `${RETIRED_SUB_TYPE} Stage a standard Display campaign, or Performance Max.`,
|
|
182
|
-
SHOPPING_SMART_ADS: `${RETIRED_SUB_TYPE} Smart Shopping became Performance Max \u2014 stage a PERFORMANCE_MAX campaign.`,
|
|
183
|
-
SHOPPING_COMPARISON_LISTING_ADS: `${RETIRED_SUB_TYPE} Ask the user to create a comparison-listing campaign in Google Ads.`,
|
|
184
|
-
SEARCH_MOBILE_APP: `${RETIRED_SUB_TYPE} App promotion runs through App campaigns \u2014 stage MULTI_CHANNEL with sub-type APP_CAMPAIGN.`,
|
|
185
|
-
SEARCH_MOBILE_APP_ENGAGEMENT: `${RETIRED_SUB_TYPE} App promotion runs through App campaigns \u2014 stage MULTI_CHANNEL with sub-type APP_CAMPAIGN_FOR_ENGAGEMENT.`,
|
|
186
|
-
APP_CAMPAIGN_FOR_PRE_REGISTRATION: "Baker does not stage pre-registration App campaigns: Google needs the app open for pre-registration and goal settings Baker cannot set. Ask the user to create it in Google Ads.",
|
|
187
|
-
VIDEO_ACTION: `${RETIRED_SUB_TYPE} Video action campaigns became Demand Gen \u2014 stage a DEMAND_GEN campaign.`,
|
|
188
|
-
VIDEO_NON_SKIPPABLE: CHANNEL_CREATE_REFUSALS.VIDEO ?? RETIRED_SUB_TYPE,
|
|
189
|
-
VIDEO_OUTSTREAM: CHANNEL_CREATE_REFUSALS.VIDEO ?? RETIRED_SUB_TYPE,
|
|
190
|
-
LOCAL_CAMPAIGN: CHANNEL_CREATE_REFUSALS.LOCAL ?? RETIRED_SUB_TYPE
|
|
191
|
-
};
|
|
192
|
-
var BIDDING_STRATEGY_TYPES = [
|
|
193
|
-
"MANUAL_CPC",
|
|
194
|
-
"MAXIMIZE_CONVERSIONS",
|
|
195
|
-
"MAXIMIZE_CONVERSION_VALUE",
|
|
196
|
-
"TARGET_SPEND",
|
|
197
|
-
"TARGET_CPA",
|
|
198
|
-
"TARGET_ROAS",
|
|
199
|
-
"TARGET_IMPRESSION_SHARE",
|
|
200
|
-
"MANUAL_CPM",
|
|
201
|
-
"MANUAL_CPV",
|
|
202
|
-
"PERCENT_CPC",
|
|
203
|
-
// Demand Gen's "maximize clicks at a target CPC" — `Campaign.target_cpc`, overridable per ad
|
|
204
|
-
// group via `AdGroup.target_cpc_micros`. Confirmed present in v23.
|
|
205
|
-
// It is one of the target-driven strategies governed by the August 2026 budget-limited
|
|
206
|
-
// change, so modelling it as a strategy without a target would leave a Demand Gen
|
|
207
|
-
// campaign's exposure invisible to `biddingTargetWarnings`.
|
|
208
|
-
"TARGET_CPC"
|
|
209
|
-
];
|
|
210
|
-
var VIDEO_BRAND_SAFETY_LEVELS = ["EXPANDED_INVENTORY", "STANDARD_INVENTORY", "LIMITED_INVENTORY"];
|
|
211
|
-
var TARGET_IMPRESSION_SHARE_LOCATIONS = ["ANYWHERE_ON_PAGE", "TOP_OF_PAGE", "ABSOLUTE_TOP_OF_PAGE"];
|
|
212
|
-
var MERGED_TARGET_STRATEGY_CHANNELS = /* @__PURE__ */ new Set(["SEARCH"]);
|
|
213
|
-
var MERGED_TARGET_CPA_MESSAGE = "Google doesn't accept Target CPA as a bidding strategy of its own on a Search campaign \u2014 the target sits inside Maximize conversions. Choose Maximize conversions and give it the same target CPA; it bids exactly the same.";
|
|
214
|
-
var MERGED_TARGET_ROAS_MESSAGE = "Google doesn't accept Target ROAS as a bidding strategy of its own on a Search campaign \u2014 the target sits inside Maximize conversion value. Choose Maximize conversion value and give it the same target ROAS; it bids exactly the same.";
|
|
215
|
-
function mergedTargetStrategyRefusal(channelType, biddingType) {
|
|
216
|
-
if (channelType === void 0 || !MERGED_TARGET_STRATEGY_CHANNELS.has(channelType)) {
|
|
217
|
-
return void 0;
|
|
218
|
-
}
|
|
219
|
-
if (biddingType === "TARGET_CPA") {
|
|
220
|
-
return MERGED_TARGET_CPA_MESSAGE;
|
|
221
|
-
}
|
|
222
|
-
return biddingType === "TARGET_ROAS" ? MERGED_TARGET_ROAS_MESSAGE : void 0;
|
|
223
|
-
}
|
|
224
|
-
var EMBEDDED_TARGET_CPA_DEMAND_GEN_MESSAGE = "Google doesn't accept a target CPA inside Maximize conversions on a Demand Gen campaign \u2014 there the target is its own bidding strategy. Choose Target CPA and give it the same target; it bids exactly the same.";
|
|
225
|
-
function embeddedTargetOnDemandGenRefusal(channelType, bidding) {
|
|
226
|
-
if (channelType !== "DEMAND_GEN" || bidding?.type !== "MAXIMIZE_CONVERSIONS") {
|
|
227
|
-
return void 0;
|
|
228
|
-
}
|
|
229
|
-
return bidding.targetCpaMicros === void 0 ? void 0 : EMBEDDED_TARGET_CPA_DEMAND_GEN_MESSAGE;
|
|
230
|
-
}
|
|
231
|
-
var MANUAL_CPC_DEMAND_GEN_MESSAGE = "Google doesn't accept Manual CPC on a Demand Gen campaign. Choose Maximize conversions (with a Target CPA as its own strategy if you have a target), or Target CPC, which exists on this channel alone.";
|
|
232
|
-
function manualCpcOnDemandGenRefusal(channelType, biddingType) {
|
|
233
|
-
return channelType === "DEMAND_GEN" && biddingType === "MANUAL_CPC" ? MANUAL_CPC_DEMAND_GEN_MESSAGE : void 0;
|
|
234
|
-
}
|
|
235
|
-
var TARGET_CPC_DEMAND_GEN_MESSAGE = "Google only accepts Target CPC on a Demand Gen campaign \u2014 no other campaign type has a target CPC. Pick the bidding this campaign's type supports (Maximize conversions with a target CPA on Search), or set the target CPC on the Demand Gen campaign that should carry it.";
|
|
236
|
-
function demandGenOnlyStrategyRefusal(channelType, biddingType) {
|
|
237
|
-
if (biddingType !== "TARGET_CPC" || channelType === void 0 || channelType === "DEMAND_GEN") {
|
|
238
|
-
return void 0;
|
|
239
|
-
}
|
|
240
|
-
return TARGET_CPC_DEMAND_GEN_MESSAGE;
|
|
241
|
-
}
|
|
242
|
-
var POSITIVE_GEO_TARGET_TYPES = ["PRESENCE_OR_INTEREST", "PRESENCE"];
|
|
243
|
-
var NEGATIVE_GEO_TARGET_TYPES = ["PRESENCE_OR_INTEREST", "PRESENCE"];
|
|
244
|
-
var BUDGET_DELIVERY_METHODS = ["STANDARD"];
|
|
245
|
-
var ACCELERATED_DELIVERY_MESSAGE = "Google no longer runs accelerated delivery: a budget set to it cannot be attached to any campaign. Leave delivery at STANDARD (Google paces the budget across the day); to spend faster, raise the daily amount instead.";
|
|
246
|
-
function retiredChoiceError(retired) {
|
|
247
|
-
return (issue) => typeof issue.input === "string" ? retired[issue.input] : void 0;
|
|
248
|
-
}
|
|
249
|
-
var AD_GROUP_TYPES = [
|
|
250
|
-
"SEARCH_STANDARD",
|
|
251
|
-
"DISPLAY_STANDARD",
|
|
252
|
-
"SHOPPING_PRODUCT_ADS",
|
|
253
|
-
"VIDEO_BUMPER",
|
|
254
|
-
"VIDEO_TRUE_VIEW_IN_STREAM",
|
|
255
|
-
"VIDEO_TRUE_VIEW_IN_DISPLAY",
|
|
256
|
-
"VIDEO_NON_SKIPPABLE_IN_STREAM",
|
|
257
|
-
"VIDEO_RESPONSIVE",
|
|
258
|
-
"VIDEO_EFFICIENT_REACH"
|
|
259
|
-
];
|
|
260
|
-
var SHARED_SET_TYPES = [
|
|
261
|
-
"NEGATIVE_KEYWORDS",
|
|
262
|
-
"NEGATIVE_PLACEMENTS",
|
|
263
|
-
"ACCOUNT_LEVEL_NEGATIVE_KEYWORDS",
|
|
264
|
-
"BRANDS"
|
|
265
|
-
];
|
|
266
|
-
var CALL_AD_RETIRED_MESSAGE = "Google retired call ads: they can no longer be created or edited. To take phone calls from search, stage a responsive search ad and add the phone number as a call asset in Google Ads (Baker cannot stage call assets yet) \u2014 and tell the user that is the one manual step.";
|
|
267
|
-
var STAGEABLE_CREATE_STATUSES = ["ENABLED", "PAUSED"];
|
|
268
|
-
var PINNED_FIELDS = ["HEADLINE_1", "HEADLINE_2", "HEADLINE_3", "DESCRIPTION_1", "DESCRIPTION_2"];
|
|
269
|
-
var CONVERSION_ACTION_CATEGORIES = [
|
|
270
|
-
"DEFAULT",
|
|
271
|
-
"PAGE_VIEW",
|
|
272
|
-
"PURCHASE",
|
|
273
|
-
"SIGNUP",
|
|
274
|
-
"LEAD",
|
|
275
|
-
"DOWNLOAD",
|
|
276
|
-
"ADD_TO_CART",
|
|
277
|
-
"BEGIN_CHECKOUT",
|
|
278
|
-
"SUBSCRIBE_PAID",
|
|
279
|
-
"PHONE_CALL_LEAD",
|
|
280
|
-
"SUBMIT_LEAD_FORM",
|
|
281
|
-
"BOOK_APPOINTMENT",
|
|
282
|
-
"REQUEST_QUOTE",
|
|
283
|
-
"CONTACT"
|
|
284
|
-
];
|
|
285
|
-
var CONVERSION_ACTION_TYPES = ["WEBPAGE", "UPLOAD_CLICKS", "UPLOAD_CALLS", "WEBSITE_CALL"];
|
|
286
|
-
var GA4_CONVERSION_CREATE_MESSAGE = "Google Analytics conversions can't be created through Google's API \u2014 they are imported. Mark the event as a key event in Google Analytics, make sure the property is linked to Google Ads, and ask the user to import it in Google Ads (Goals \u2192 Conversions \u2192 New conversion action \u2192 Import \u2192 Google Analytics 4). To track it with a Google Ads tag instead, create a WEBPAGE conversion.";
|
|
287
|
-
var CONVERSION_COUNTING_TYPES = ["ONE_PER_CLICK", "MANY_PER_CLICK"];
|
|
288
|
-
var CONVERSION_ORIGINS = [
|
|
289
|
-
"WEBSITE",
|
|
290
|
-
"GOOGLE_HOSTED",
|
|
291
|
-
"APP",
|
|
292
|
-
"CALL_FROM_ADS",
|
|
293
|
-
"STORE",
|
|
294
|
-
"YOUTUBE_HOSTED"
|
|
295
|
-
];
|
|
296
|
-
var USER_LIST_TYPES = ["CRM_BASED", "RULE_BASED", "LOGICAL", "BASIC", "LOOKALIKE"];
|
|
297
|
-
var USER_LIST_STRING_OPERATORS = [
|
|
298
|
-
"CONTAINS",
|
|
299
|
-
"EQUALS",
|
|
300
|
-
"STARTS_WITH",
|
|
301
|
-
"ENDS_WITH",
|
|
302
|
-
"NOT_EQUALS",
|
|
303
|
-
"NOT_CONTAINS",
|
|
304
|
-
"NOT_STARTS_WITH",
|
|
305
|
-
"NOT_ENDS_WITH"
|
|
306
|
-
];
|
|
307
|
-
var USER_LIST_NUMBER_OPERATORS = [
|
|
308
|
-
"GREATER_THAN",
|
|
309
|
-
"GREATER_THAN_OR_EQUAL",
|
|
310
|
-
"EQUALS",
|
|
311
|
-
"NOT_EQUALS",
|
|
312
|
-
"LESS_THAN",
|
|
313
|
-
"LESS_THAN_OR_EQUAL"
|
|
314
|
-
];
|
|
315
|
-
var USER_LIST_LOGICAL_OPERATORS = ["ALL", "ANY", "NONE"];
|
|
316
|
-
var LOOKALIKE_EXPANSION_LEVELS = ["NARROW", "BALANCED", "BROAD"];
|
|
317
|
-
var TARGETING_DIMENSIONS = [
|
|
318
|
-
"KEYWORD",
|
|
319
|
-
"AUDIENCE",
|
|
320
|
-
"TOPIC",
|
|
321
|
-
"GENDER",
|
|
322
|
-
"AGE_RANGE",
|
|
323
|
-
"PLACEMENT",
|
|
324
|
-
"PARENTAL_STATUS",
|
|
325
|
-
"INCOME_RANGE"
|
|
326
|
-
];
|
|
327
|
-
var ASSET_FIELD_TYPES = [
|
|
328
|
-
"SITELINK",
|
|
329
|
-
"CALLOUT",
|
|
330
|
-
"STRUCTURED_SNIPPET",
|
|
331
|
-
"CALL",
|
|
332
|
-
"PRICE",
|
|
333
|
-
"PROMOTION",
|
|
334
|
-
"MOBILE_APP",
|
|
335
|
-
"HEADLINE",
|
|
336
|
-
"DESCRIPTION",
|
|
337
|
-
"LOGO",
|
|
338
|
-
/**
|
|
339
|
-
* Kept because a draft staged before {@link IMAGE_ASSET_LINK_MESSAGE} shipped may still carry one,
|
|
340
|
-
* and because it is the field type an asset-group image occupies. It is refused on an
|
|
341
|
-
* `assetLink.attach` — see that message for what Google actually does with it.
|
|
342
|
-
*/
|
|
343
|
-
"MARKETING_IMAGE",
|
|
344
|
-
"BUSINESS_NAME",
|
|
345
|
-
/**
|
|
346
|
-
* The one image link a Search campaign takes. It carries the advertiser's logo beside the ad and
|
|
347
|
-
* is the only image field type that survives Google's field-type check at all — swept live on v23
|
|
348
|
-
* and v25, campaign and customer level both answer `CUSTOMER_NOT_VERIFIED` (an account fact,
|
|
349
|
-
* fixed by advertiser verification) rather than a field-type refusal. Ad group level is not a
|
|
350
|
-
* level Google links it at — see {@link BUSINESS_LOGO_LEVEL_MESSAGE}.
|
|
351
|
-
*/
|
|
352
|
-
"BUSINESS_LOGO"
|
|
353
|
-
];
|
|
354
|
-
var BUSINESS_LOGO_LEVEL_MESSAGE = "Google links a BUSINESS_LOGO at campaign or customer level only \u2014 an ad group link comes back UNSUPPORTED_FIELD_TYPE. Attach it to the campaign instead.";
|
|
355
|
-
var IMAGE_ASSET_LINK_FIELD_TYPES = /* @__PURE__ */ new Set([
|
|
356
|
-
"MARKETING_IMAGE",
|
|
357
|
-
"SQUARE_MARKETING_IMAGE",
|
|
358
|
-
"PORTRAIT_MARKETING_IMAGE",
|
|
359
|
-
"AD_IMAGE"
|
|
360
|
-
]);
|
|
361
|
-
function isImageAssetLinkFieldType(fieldType) {
|
|
362
|
-
return IMAGE_ASSET_LINK_FIELD_TYPES.has(fieldType);
|
|
363
|
-
}
|
|
364
|
-
var ASSET_GROUP_ASSET_FIELD_TYPES = [
|
|
365
|
-
"MARKETING_IMAGE",
|
|
366
|
-
"SQUARE_MARKETING_IMAGE",
|
|
367
|
-
"PORTRAIT_MARKETING_IMAGE",
|
|
368
|
-
"LOGO",
|
|
369
|
-
"LANDSCAPE_LOGO",
|
|
370
|
-
"YOUTUBE_VIDEO",
|
|
371
|
-
"HEADLINE",
|
|
372
|
-
"LONG_HEADLINE",
|
|
373
|
-
"DESCRIPTION",
|
|
374
|
-
"BUSINESS_NAME",
|
|
375
|
-
"CALL_TO_ACTION_SELECTION"
|
|
376
|
-
];
|
|
377
|
-
var DEVICE_TYPES = ["MOBILE", "TABLET", "DESKTOP", "CONNECTED_TV", "OTHER"];
|
|
378
|
-
var DAYS_OF_WEEK = ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"];
|
|
379
|
-
var CAMPAIGN_OBJECTIVES = [
|
|
380
|
-
"SALES",
|
|
381
|
-
"LEADS",
|
|
382
|
-
"WEBSITE_TRAFFIC",
|
|
383
|
-
"PRODUCT_BRAND_CONSIDERATION",
|
|
384
|
-
"BRAND_AWARENESS_REACH",
|
|
385
|
-
"APP_PROMOTION",
|
|
386
|
-
"LOCAL_STORE_VISITS"
|
|
387
|
-
];
|
|
388
|
-
var MICROS_PER_UNIT = 1e6;
|
|
389
|
-
function toMicros(amount) {
|
|
390
|
-
return Math.round(amount * MICROS_PER_UNIT);
|
|
391
|
-
}
|
|
392
|
-
var PLAYBOOK_DAILY_BUDGET_FLOOR_MICROS = 10 * MICROS_PER_UNIT;
|
|
393
|
-
var TEMP_REF_REGEX = /^g_temp_[A-Za-z0-9_-]{2,}$/;
|
|
394
|
-
var NUMERIC_ID_REGEX = /^\d+$/;
|
|
395
|
-
var RESOURCE_NAME_REGEX = /^customers\/\d+\/[A-Za-z]+\/[-\w~]+$/;
|
|
396
|
-
var GEO_TARGET_CONSTANT_REGEX = /^geoTargetConstants\/\d+$/;
|
|
397
|
-
var LANGUAGE_CONSTANT_REGEX = /^languageConstants\/\d+$/;
|
|
398
|
-
|
|
399
|
-
// ../api/src/ads-google/conversion-upload.ts
|
|
400
|
-
import { z } from "zod";
|
|
401
|
-
var CONVERSION_UPLOAD_MAX_ROWS = 200;
|
|
402
|
-
var SHA256_HEX_REGEX = /^[0-9a-f]{64}$/i;
|
|
403
|
-
var conversionUploadActionSchema = z.union([
|
|
404
|
-
z.string().regex(NUMERIC_ID_REGEX, "expected the numeric conversion action id"),
|
|
405
|
-
z.string().regex(RESOURCE_NAME_REGEX, "expected a customers/\u2026/conversionActions/\u2026 resource name")
|
|
406
|
-
]);
|
|
407
|
-
var clickIdSchema = z.string().min(1).max(512).regex(/^[A-Za-z0-9_.-]+$/, "a click id is letters, digits, '-', '_' and '.' only \u2014 paste the id, not the URL");
|
|
408
|
-
var conversionDateTimeSchema = z.string().regex(
|
|
409
|
-
/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$/,
|
|
410
|
-
"expected an ISO-8601 instant WITH a timezone, e.g. 2026-08-01T10:00:00Z or 2026-08-01T12:00:00+02:00"
|
|
411
|
-
).refine((value) => Number.isFinite(Date.parse(value)), "not a real date");
|
|
412
|
-
var emailSchema = z.string().min(3).max(320).refine(
|
|
413
|
-
(value) => SHA256_HEX_REGEX.test(value) || /^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(value),
|
|
414
|
-
"expected an email address"
|
|
415
|
-
);
|
|
416
|
-
var phoneSchema = z.string().min(4).max(64).refine(
|
|
417
|
-
(value) => SHA256_HEX_REGEX.test(value) || /^\+\d[\d\s().-]{6,}$/.test(value),
|
|
418
|
-
"expected a phone number in E.164 with its country code, e.g. +34600111222 \u2014 a local number hashes to something Google cannot match"
|
|
419
|
-
);
|
|
420
|
-
var nameSchema = z.string().min(1).max(120);
|
|
421
|
-
var addressSchema = z.strictObject({
|
|
422
|
-
givenName: nameSchema,
|
|
423
|
-
familyName: nameSchema,
|
|
424
|
-
/** ISO-3166-1 alpha-2, sent in the clear — it is not identifying on its own. */
|
|
425
|
-
regionCode: z.string().regex(/^[A-Z]{2}$/, "expected a 2-letter country code, e.g. ES"),
|
|
426
|
-
/** Sent in the clear, like the country: Google matches on it as a plain string. */
|
|
427
|
-
postalCode: z.string().min(2).max(16),
|
|
428
|
-
addressLine: z.string().min(1).max(200).optional(),
|
|
429
|
-
city: z.string().min(1).max(100).optional(),
|
|
430
|
-
/** State / province / region, whatever the country calls it. */
|
|
431
|
-
administrativeArea: z.string().min(1).max(100).optional()
|
|
432
|
-
}).describe("advanced matching by name and address");
|
|
433
|
-
var conversionCountSchema = z.number().int().positive().max(1e4);
|
|
434
|
-
var CONVERSION_EVENT_SOURCES = ["WEB", "APP", "IN_STORE", "PHONE", "OTHER"];
|
|
435
|
-
var conversionUploadRowSchema = z.strictObject({
|
|
436
|
-
/**
|
|
437
|
-
* The order id the original conversion carried — Baker's server-side tag sends the Form
|
|
438
|
-
* submission id here, so a repair reuses that. Required: without it Google has no way to tell a
|
|
439
|
-
* re-send from a new conversion, and the only way to find out is to double-count.
|
|
440
|
-
*/
|
|
441
|
-
orderId: z.string().min(1).max(64),
|
|
442
|
-
conversionDateTime: conversionDateTimeSchema,
|
|
443
|
-
gclid: clickIdSchema.optional(),
|
|
444
|
-
gbraid: clickIdSchema.optional(),
|
|
445
|
-
wbraid: clickIdSchema.optional(),
|
|
446
|
-
email: emailSchema.optional(),
|
|
447
|
-
phone: phoneSchema.optional(),
|
|
448
|
-
address: addressSchema.optional(),
|
|
449
|
-
conversionCount: conversionCountSchema.optional(),
|
|
450
|
-
eventSource: z.enum(CONVERSION_EVENT_SOURCES).optional(),
|
|
451
|
-
value: z.number().nonnegative().optional(),
|
|
452
|
-
currency: z.string().regex(/^[A-Z]{3}$/, "expected a 3-letter currency code, e.g. EUR").optional()
|
|
453
|
-
}).refine(
|
|
454
|
-
(row) => Boolean(row.gclid ?? row.gbraid ?? row.wbraid ?? row.email ?? row.phone ?? row.address),
|
|
455
|
-
"every conversion needs something to match on: a click id (gclid / gbraid / wbraid), or a customer's email, phone or name+address"
|
|
456
|
-
).refine(
|
|
457
|
-
(row) => [row.gclid, row.gbraid, row.wbraid].filter(Boolean).length <= 1,
|
|
458
|
-
"pass at most one click id per conversion \u2014 gclid, gbraid and wbraid are three ways of naming the same click"
|
|
459
|
-
).refine(
|
|
460
|
-
(row) => row.value === void 0 || row.currency !== void 0,
|
|
461
|
-
"a conversion with a value needs its currency too"
|
|
462
|
-
).refine((row) => row.currency === void 0 || row.value !== void 0, "currency was given with no value");
|
|
463
|
-
var conversionUploadSchema = z.strictObject({
|
|
464
|
-
conversionAction: conversionUploadActionSchema,
|
|
465
|
-
conversions: z.array(conversionUploadRowSchema).min(1).max(CONVERSION_UPLOAD_MAX_ROWS)
|
|
466
|
-
}).refine((payload) => {
|
|
467
|
-
const ids = payload.conversions.map((row) => row.orderId);
|
|
468
|
-
return new Set(ids).size === ids.length;
|
|
469
|
-
}, "two conversions share an order id \u2014 each order id can appear once per upload");
|
|
470
|
-
var MS_PER_DAY = 24 * 60 * 60 * 1e3;
|
|
471
|
-
|
|
472
|
-
// ../api/src/ads-google/bidding-matrix.ts
|
|
473
|
-
var STANDARD_BIDDING_BY_CHANNEL = {
|
|
474
|
-
SEARCH: [
|
|
475
|
-
"MANUAL_CPC",
|
|
476
|
-
"MAXIMIZE_CONVERSIONS",
|
|
477
|
-
"MAXIMIZE_CONVERSION_VALUE",
|
|
478
|
-
"TARGET_SPEND",
|
|
479
|
-
"TARGET_IMPRESSION_SHARE"
|
|
480
|
-
],
|
|
481
|
-
DISPLAY: [
|
|
482
|
-
"MANUAL_CPC",
|
|
483
|
-
"MAXIMIZE_CONVERSIONS",
|
|
484
|
-
"MAXIMIZE_CONVERSION_VALUE",
|
|
485
|
-
"TARGET_SPEND",
|
|
486
|
-
"TARGET_CPA",
|
|
487
|
-
"TARGET_ROAS",
|
|
488
|
-
"MANUAL_CPM"
|
|
489
|
-
],
|
|
490
|
-
// Accepted with Manual CPC; Maximize conversions was OPERATION_NOT_PERMITTED_FOR_CONTEXT. Nothing
|
|
491
|
-
// else was tried, so nothing else is claimed.
|
|
492
|
-
"DISPLAY/DISPLAY_MOBILE_APP": ["MANUAL_CPC"],
|
|
493
|
-
// Target ROAS answered "not enough conversions" — eligibility, so it stays.
|
|
494
|
-
SHOPPING: ["MANUAL_CPC", "TARGET_SPEND", "TARGET_ROAS", "MAXIMIZE_CONVERSION_VALUE"],
|
|
495
|
-
// Which one depends on the App goal (`APP_CAMPAIGN_GOALS`, channel-settings.ts); Manual CPC and
|
|
496
|
-
// the rest were OPERATION_NOT_PERMITTED_FOR_CONTEXT.
|
|
497
|
-
MULTI_CHANNEL: ["TARGET_CPA", "MAXIMIZE_CONVERSIONS", "TARGET_ROAS"],
|
|
498
|
-
// With a target ROAS inside (required). Manual CPC, Maximize clicks, Target ROAS / CPA, Maximize
|
|
499
|
-
// conversions and Percent CPC were all OPERATION_NOT_PERMITTED_FOR_CONTEXT. Hotel has no row: the
|
|
500
|
-
// account cannot create one, so nothing was answered.
|
|
501
|
-
TRAVEL: ["MAXIMIZE_CONVERSION_VALUE"],
|
|
502
|
-
PERFORMANCE_MAX: ["MAXIMIZE_CONVERSIONS", "MAXIMIZE_CONVERSION_VALUE"],
|
|
503
|
-
DEMAND_GEN: [
|
|
504
|
-
"MAXIMIZE_CONVERSIONS",
|
|
505
|
-
"MAXIMIZE_CONVERSION_VALUE",
|
|
506
|
-
"TARGET_SPEND",
|
|
507
|
-
"TARGET_CPA",
|
|
508
|
-
"TARGET_ROAS",
|
|
509
|
-
"TARGET_CPC"
|
|
510
|
-
]
|
|
511
|
-
};
|
|
512
|
-
var PORTFOLIO_BIDDING_BY_CHANNEL = {
|
|
513
|
-
SEARCH: [
|
|
514
|
-
"MAXIMIZE_CONVERSIONS",
|
|
515
|
-
"MAXIMIZE_CONVERSION_VALUE",
|
|
516
|
-
"TARGET_CPA",
|
|
517
|
-
"TARGET_ROAS",
|
|
518
|
-
"TARGET_SPEND",
|
|
519
|
-
"TARGET_IMPRESSION_SHARE"
|
|
520
|
-
],
|
|
521
|
-
DISPLAY: ["TARGET_CPA", "TARGET_ROAS", "TARGET_SPEND"],
|
|
522
|
-
SHOPPING: ["MAXIMIZE_CONVERSION_VALUE", "TARGET_ROAS", "TARGET_SPEND"],
|
|
523
|
-
MULTI_CHANNEL: [],
|
|
524
|
-
PERFORMANCE_MAX: [],
|
|
525
|
-
DEMAND_GEN: []
|
|
526
|
-
};
|
|
527
|
-
var PORTFOLIO_STRATEGY_TYPES = [
|
|
528
|
-
"MAXIMIZE_CONVERSIONS",
|
|
529
|
-
"MAXIMIZE_CONVERSION_VALUE",
|
|
530
|
-
"TARGET_CPA",
|
|
531
|
-
"TARGET_ROAS",
|
|
532
|
-
"TARGET_SPEND",
|
|
533
|
-
"TARGET_IMPRESSION_SHARE"
|
|
534
|
-
];
|
|
535
|
-
var BIDDING_STRATEGY_LABELS = {
|
|
536
|
-
MANUAL_CPC: "Manual CPC (MANUAL_CPC)",
|
|
537
|
-
MAXIMIZE_CONVERSIONS: "Maximize conversions (MAXIMIZE_CONVERSIONS)",
|
|
538
|
-
MAXIMIZE_CONVERSION_VALUE: "Maximize conversion value (MAXIMIZE_CONVERSION_VALUE)",
|
|
539
|
-
TARGET_SPEND: "Maximize clicks (TARGET_SPEND)",
|
|
540
|
-
TARGET_CPA: "Target CPA (TARGET_CPA)",
|
|
541
|
-
TARGET_ROAS: "Target ROAS (TARGET_ROAS)",
|
|
542
|
-
TARGET_IMPRESSION_SHARE: "Target impression share (TARGET_IMPRESSION_SHARE)",
|
|
543
|
-
MANUAL_CPM: "Manual CPM (MANUAL_CPM)",
|
|
544
|
-
MANUAL_CPV: "Manual CPV (MANUAL_CPV)",
|
|
545
|
-
PERCENT_CPC: "Percent CPC (PERCENT_CPC)",
|
|
546
|
-
TARGET_CPC: "Target CPC (TARGET_CPC)"
|
|
547
|
-
};
|
|
548
|
-
var CHANNEL_LABELS = {
|
|
549
|
-
SEARCH: "Search",
|
|
550
|
-
DISPLAY: "Display",
|
|
551
|
-
PERFORMANCE_MAX: "Performance Max",
|
|
552
|
-
DEMAND_GEN: "Demand Gen",
|
|
553
|
-
SHOPPING: "Shopping",
|
|
554
|
-
MULTI_CHANNEL: "App",
|
|
555
|
-
TRAVEL: "Travel",
|
|
556
|
-
HOTEL: "Hotel"
|
|
557
|
-
};
|
|
558
|
-
function labelOf(strategy) {
|
|
559
|
-
return BIDDING_STRATEGY_LABELS[strategy] ?? strategy;
|
|
560
|
-
}
|
|
561
|
-
function rowFor(table, channelType, channelSubType) {
|
|
562
|
-
return (channelSubType ? table[`${channelType}/${channelSubType}`] : void 0) ?? table[channelType];
|
|
563
|
-
}
|
|
564
|
-
var EMBEDDED_TARGETS_REFUSED = {
|
|
565
|
-
SHOPPING: ["cpa", "roas"],
|
|
566
|
-
MULTI_CHANNEL: ["cpa", "roas"],
|
|
567
|
-
DISPLAY: ["cpa"],
|
|
568
|
-
DEMAND_GEN: ["roas"]
|
|
569
|
-
};
|
|
570
|
-
function embeddedTargetRefusal(channelType, bidding) {
|
|
571
|
-
const refused = channelType ? EMBEDDED_TARGETS_REFUSED[channelType] : void 0;
|
|
572
|
-
if (!channelType || !bidding || !refused) {
|
|
573
|
-
return void 0;
|
|
574
|
-
}
|
|
575
|
-
const channel = CHANNEL_LABELS[channelType] ?? channelType;
|
|
576
|
-
const standalone = (strategy) => STANDARD_BIDDING_BY_CHANNEL[channelType]?.includes(strategy) ? ` \u2014 choose ${labelOf(strategy)} with the same target instead.` : ".";
|
|
577
|
-
if (bidding.type === "MAXIMIZE_CONVERSION_VALUE" && bidding.targetRoas !== void 0 && refused.includes("roas")) {
|
|
578
|
-
return `Google doesn't take a target ROAS inside Maximize conversion value on ${channel} campaigns${standalone("TARGET_ROAS")}`;
|
|
579
|
-
}
|
|
580
|
-
if (bidding.type === "MAXIMIZE_CONVERSIONS" && bidding.targetCpaMicros !== void 0 && refused.includes("cpa")) {
|
|
581
|
-
return `Google doesn't take a target CPA inside Maximize conversions on ${channel} campaigns${standalone("TARGET_CPA")}`;
|
|
582
|
-
}
|
|
583
|
-
return void 0;
|
|
584
|
-
}
|
|
585
|
-
function biddingMatrixRefusal(query) {
|
|
586
|
-
const { channelType, channelSubType, strategy, portfolio = false } = query;
|
|
587
|
-
if (!channelType || !strategy) {
|
|
588
|
-
return void 0;
|
|
589
|
-
}
|
|
590
|
-
const row = rowFor(
|
|
591
|
-
portfolio ? PORTFOLIO_BIDDING_BY_CHANNEL : STANDARD_BIDDING_BY_CHANNEL,
|
|
592
|
-
channelType,
|
|
593
|
-
channelSubType
|
|
594
|
-
);
|
|
595
|
-
if (!row || row.includes(strategy)) {
|
|
596
|
-
return void 0;
|
|
597
|
-
}
|
|
598
|
-
const channel = CHANNEL_LABELS[channelType] ?? channelType;
|
|
599
|
-
if (portfolio && row.length === 0) {
|
|
600
|
-
const own = rowFor(STANDARD_BIDDING_BY_CHANNEL, channelType, channelSubType) ?? [];
|
|
601
|
-
return `Google doesn't let a ${channel} campaign use a portfolio bid strategy. Give it its own bidding instead: ${own.map(labelOf).join(", ")}.`;
|
|
602
|
-
}
|
|
603
|
-
const kind = portfolio ? "portfolio strategy" : "bidding";
|
|
604
|
-
return `Google doesn't accept ${labelOf(strategy)} as ${kind} on a ${channel} campaign. It takes: ${row.map(labelOf).join(", ")}.`;
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
// ../api/src/ads-google/channel-settings.ts
|
|
608
|
-
import { z as z2 } from "zod";
|
|
609
|
-
var int64IdSchema = (what) => z2.string().regex(NUMERIC_ID_REGEX, `${what} must be the bare numeric id`);
|
|
610
|
-
var SHOPPING_CAMPAIGN_PRIORITIES = [0, 1, 2];
|
|
611
|
-
var shoppingSettingSchema = z2.strictObject({
|
|
612
|
-
merchantId: int64IdSchema("merchantId"),
|
|
613
|
-
feedLabel: z2.string().trim().min(1).max(20).optional(),
|
|
614
|
-
/** Shopping only. Which Shopping campaign wins when several advertise the same product. */
|
|
615
|
-
campaignPriority: z2.number().int().refine(
|
|
616
|
-
(value) => SHOPPING_CAMPAIGN_PRIORITIES.includes(value),
|
|
617
|
-
"campaignPriority is 0, 1 or 2"
|
|
618
|
-
).optional(),
|
|
619
|
-
/** Shopping only. Local inventory ads — products in nearby stores. Only `true` is ever sent. */
|
|
620
|
-
enableLocal: z2.boolean().optional()
|
|
621
|
-
});
|
|
622
|
-
var shoppingSettingUpdateSchema = z2.strictObject({
|
|
623
|
-
feedLabel: z2.union([z2.string().trim().min(1).max(20), z2.literal("")]).optional(),
|
|
624
|
-
campaignPriority: shoppingSettingSchema.shape.campaignPriority,
|
|
625
|
-
enableLocal: z2.boolean().optional()
|
|
626
|
-
}).refine((p) => Object.values(p).some((v) => v !== void 0), "shoppingSetting needs a field to change");
|
|
627
|
-
var APP_STORES = ["GOOGLE_APP_STORE", "APPLE_APP_STORE"];
|
|
628
|
-
var APP_CAMPAIGN_GOALS = {
|
|
629
|
-
OPTIMIZE_INSTALLS_TARGET_INSTALL_COST: { strategy: "TARGET_CPA", needsConversions: false },
|
|
630
|
-
OPTIMIZE_INSTALLS_WITHOUT_TARGET_INSTALL_COST: { strategy: "MAXIMIZE_CONVERSIONS", needsConversions: false },
|
|
631
|
-
OPTIMIZE_IN_APP_CONVERSIONS_TARGET_INSTALL_COST: { strategy: "TARGET_CPA", needsConversions: true },
|
|
632
|
-
OPTIMIZE_IN_APP_CONVERSIONS_TARGET_CONVERSION_COST: { strategy: "TARGET_CPA", needsConversions: true },
|
|
633
|
-
OPTIMIZE_RETURN_ON_ADVERTISING_SPEND: { strategy: "TARGET_ROAS", needsConversions: true }
|
|
634
|
-
};
|
|
635
|
-
var APP_CAMPAIGN_GOAL_TYPES = Object.keys(APP_CAMPAIGN_GOALS);
|
|
636
|
-
var appCampaignSettingSchema = z2.strictObject({
|
|
637
|
-
/** Android package name (`com.example.app`) or the App Store's numeric id. */
|
|
638
|
-
appId: z2.string().trim().min(1).max(200),
|
|
639
|
-
appStore: z2.enum(APP_STORES),
|
|
640
|
-
biddingStrategyGoalType: z2.enum(APP_CAMPAIGN_GOAL_TYPES)
|
|
641
|
-
});
|
|
642
|
-
var selectiveOptimizationSchema = z2.strictObject({
|
|
643
|
-
conversionActions: z2.array(
|
|
644
|
-
z2.union([z2.string().regex(RESOURCE_NAME_REGEX), z2.string().regex(NUMERIC_ID_REGEX)], {
|
|
645
|
-
error: "conversionActions are the app's existing conversion actions \u2014 an id or resource name"
|
|
646
|
-
})
|
|
647
|
-
).min(1)
|
|
648
|
-
});
|
|
649
|
-
var APP_SUB_TYPES = /* @__PURE__ */ new Set(["APP_CAMPAIGN", "APP_CAMPAIGN_FOR_ENGAGEMENT"]);
|
|
650
|
-
var APP_SETTING_REQUIRED_MESSAGE = "An App campaign (MULTI_CHANNEL) needs appCampaignSetting \u2014 appId, appStore (GOOGLE_APP_STORE | APPLE_APP_STORE) and biddingStrategyGoalType \u2014 and channelSubType APP_CAMPAIGN (installs) or APP_CAMPAIGN_FOR_ENGAGEMENT.";
|
|
651
|
-
var APP_SETTING_CHANNEL_MESSAGE = "appCampaignSetting and selectiveOptimization belong to an App campaign (MULTI_CHANNEL) only.";
|
|
652
|
-
var APP_CONVERSIONS_REQUIRED_MESSAGE = "This App goal optimizes toward in-app conversions \u2014 list the app's conversion actions in selectiveOptimization.conversionActions (Google refuses the campaign without them).";
|
|
653
|
-
var APP_ENGAGEMENT_GOAL_MESSAGE = "An engagement App campaign (APP_CAMPAIGN_FOR_ENGAGEMENT) optimizes toward in-app actions \u2014 use an in-app or return-on-ad-spend goal, not an installs goal.";
|
|
654
|
-
function appGoalBiddingMessage(goal) {
|
|
655
|
-
return `The App goal ${goal} bids with ${APP_CAMPAIGN_GOALS[goal].strategy} only \u2014 Google refuses any other strategy with it.`;
|
|
656
|
-
}
|
|
657
|
-
var travelCampaignSettingsSchema = z2.strictObject({ travelAccountId: int64IdSchema("travelAccountId") });
|
|
658
|
-
var hotelSettingSchema = z2.strictObject({ hotelCenterId: int64IdSchema("hotelCenterId") });
|
|
659
|
-
var TRAVEL_SETTING_REQUIRED_MESSAGE = "A Travel campaign needs travelCampaignSettings.travelAccountId \u2014 the travel account linked to this Google Ads account.";
|
|
660
|
-
var HOTEL_SETTING_REQUIRED_MESSAGE = "A Hotel campaign needs hotelSetting.hotelCenterId \u2014 the Hotel Center account linked to this Google Ads account.";
|
|
661
|
-
var TRAVEL_HOTEL_CHANNEL_MESSAGE = "travelCampaignSettings belongs to a Travel campaign and hotelSetting to a Hotel campaign only.";
|
|
662
|
-
var TRAVEL_TARGET_ROAS_MESSAGE = "A Travel campaign bids with Maximize conversion value at a target ROAS \u2014 set bidding.targetRoas (Google requires it).";
|
|
663
|
-
var dynamicSearchAdsSettingSchema = z2.strictObject({
|
|
664
|
-
domainName: z2.string().trim().regex(
|
|
665
|
-
/^(?!-)[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)+$/,
|
|
666
|
-
"domainName is the site's bare domain (withbaker.com) \u2014 no https://, no path"
|
|
667
|
-
),
|
|
668
|
-
languageCode: z2.string().regex(
|
|
669
|
-
/^[a-z]{2,3}(_[A-Z]{2})?$/,
|
|
670
|
-
`languageCode is Google's language code in lowercase ("en", "es"; "zh_CN" with a region)`
|
|
671
|
-
),
|
|
672
|
-
/** Build ads only from the pages a page feed lists, not the whole site. */
|
|
673
|
-
useSuppliedUrlsOnly: z2.boolean().optional()
|
|
674
|
-
});
|
|
675
|
-
var dynamicSearchAdsSettingUpdateSchema = dynamicSearchAdsSettingSchema.partial().refine((p) => Object.values(p).some((v) => v !== void 0), "dynamicSearchAdsSetting needs a field to change");
|
|
676
|
-
var FREQUENCY_CAP_LEVELS = ["CAMPAIGN", "AD_GROUP", "AD_GROUP_AD"];
|
|
677
|
-
var FREQUENCY_CAP_EVENTS = ["IMPRESSION", "VIDEO_VIEW"];
|
|
678
|
-
var FREQUENCY_CAP_TIME_UNITS = ["DAY", "WEEK", "MONTH"];
|
|
679
|
-
var frequencyCapsSchema = z2.array(
|
|
680
|
-
z2.strictObject({
|
|
681
|
-
level: z2.enum(FREQUENCY_CAP_LEVELS),
|
|
682
|
-
eventType: z2.enum(FREQUENCY_CAP_EVENTS),
|
|
683
|
-
timeUnit: z2.enum(FREQUENCY_CAP_TIME_UNITS),
|
|
684
|
-
cap: z2.number().int().min(1)
|
|
685
|
-
})
|
|
686
|
-
).refine(
|
|
687
|
-
(caps) => new Set(caps.map((c) => `${c.level}/${c.eventType}/${c.timeUnit}`)).size === caps.length,
|
|
688
|
-
"one cap per level, event and period \u2014 Google refuses a second (DUPLICATE_VALUES)"
|
|
689
|
-
);
|
|
690
|
-
var DSA_CHANNEL_MESSAGE = "dynamicSearchAdsSetting belongs to a Search campaign only.";
|
|
691
|
-
var FREQUENCY_CAP_CHANNELS = /* @__PURE__ */ new Set(["DISPLAY", "VIDEO"]);
|
|
692
|
-
var FREQUENCY_CAPS_CHANNEL_MESSAGE = "Frequency caps work on Display (and existing Video) campaigns only \u2014 Demand Gen refuses them, and Search, Shopping and Performance Max ads are not frequency-capped.";
|
|
693
|
-
var assetAutomationSchema = z2.strictObject({
|
|
694
|
-
/** Text Google writes from the landing page and the assets (TEXT_ASSET_AUTOMATION). */
|
|
695
|
-
textAssets: z2.boolean().optional(),
|
|
696
|
-
/** Send traffic to the most relevant page of the site (FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION). */
|
|
697
|
-
finalUrlExpansion: z2.boolean().optional(),
|
|
698
|
-
/** Enhanced versions of the campaign's YouTube videos (GENERATE_ENHANCED_YOUTUBE_VIDEOS). */
|
|
699
|
-
videoEnhancement: z2.boolean().optional(),
|
|
700
|
-
/** Enhanced versions of the campaign's images (GENERATE_IMAGE_ENHANCEMENT). */
|
|
701
|
-
imageEnhancement: z2.boolean().optional(),
|
|
702
|
-
/** Images taken from the landing page (GENERATE_IMAGE_EXTRACTION). */
|
|
703
|
-
imageExtraction: z2.boolean().optional(),
|
|
704
|
-
/** New designs made from the campaign's images (GENERATE_DESIGN_VERSIONS_FOR_IMAGES). */
|
|
705
|
-
imageDesignVersions: z2.boolean().optional()
|
|
706
|
-
}).refine((p) => Object.values(p).some((v) => v !== void 0), "assetAutomation needs at least one switch");
|
|
707
|
-
var ASSET_AUTOMATION_CHANNEL_MESSAGE = "assetAutomation switches what Google generates for a Performance Max campaign only \u2014 on Search use AI Max (`aiMax`: text customization, final URL expansion); Display and Demand Gen take none.";
|
|
708
|
-
var TEXT_ASSETS_NEED_URL_EXPANSION_OFF_MESSAGE = "Google refuses turning generated text off while final URL expansion is on \u2014 set finalUrlExpansion: false (`--url-expansion=false`) in the same change.";
|
|
709
|
-
function assetAutomationStateIssue(state) {
|
|
710
|
-
return state.textAssets === false && state.finalUrlExpansion !== false ? TEXT_ASSETS_NEED_URL_EXPANSION_OFF_MESSAGE : void 0;
|
|
711
|
-
}
|
|
712
|
-
var hexColorSchema = z2.string().regex(/^#[0-9A-Fa-f]{6}$/, "colors are #RRGGBB hex codes");
|
|
713
|
-
var brandStyleShape = {
|
|
714
|
-
mainColor: hexColorSchema.optional(),
|
|
715
|
-
accentColor: hexColorSchema.optional(),
|
|
716
|
-
/** One of Google's predefined fonts, e.g. "Roboto". */
|
|
717
|
-
fontFamily: z2.string().trim().min(1).max(50).optional()
|
|
718
|
-
};
|
|
719
|
-
var BRAND_COLORS_PAIR_MESSAGE = "Google needs both brand colors together \u2014 set mainColor and accentColor, or neither.";
|
|
720
|
-
var BRAND_GUIDELINES_OFF_MESSAGE = "Brand colors and font only apply with brand guidelines on \u2014 set enabled: true, or leave them out.";
|
|
721
|
-
var BRAND_GUIDELINES_CHANNEL_MESSAGE = "Brand guidelines belong to Performance Max campaigns only.";
|
|
722
|
-
function colorsPaired(p) {
|
|
723
|
-
return p.mainColor === void 0 === (p.accentColor === void 0);
|
|
724
|
-
}
|
|
725
|
-
var brandGuidelinesCreateSchema = z2.strictObject({ enabled: z2.boolean(), ...brandStyleShape }).superRefine((p, ctx) => {
|
|
726
|
-
if (!colorsPaired(p)) {
|
|
727
|
-
ctx.addIssue({ code: "custom", message: BRAND_COLORS_PAIR_MESSAGE });
|
|
728
|
-
}
|
|
729
|
-
if (!p.enabled && (p.mainColor !== void 0 || p.fontFamily !== void 0)) {
|
|
730
|
-
ctx.addIssue({ code: "custom", message: BRAND_GUIDELINES_OFF_MESSAGE });
|
|
731
|
-
}
|
|
732
|
-
});
|
|
733
|
-
var brandGuidelinesUpdateSchema = z2.strictObject(brandStyleShape).refine((p) => Object.values(p).some((v) => v !== void 0), "brandGuidelines needs a color or a font");
|
|
734
|
-
var existingAssetSchema = z2.union([z2.string().regex(RESOURCE_NAME_REGEX), z2.string().regex(NUMERIC_ID_REGEX)], {
|
|
735
|
-
error: "brand assets are assets already in the account \u2014 an id or resource name"
|
|
736
|
-
});
|
|
737
|
-
var ENABLE_BRAND_ASSETS_MESSAGE = "Name the business name asset and at least one square logo asset (businessNameAsset, logoAssets), or set autoPopulateBrandAssets: true to let Google take them from the campaign's asset groups.";
|
|
738
|
-
var campaignEnableBrandGuidelinesSchema = z2.strictObject({
|
|
739
|
-
autoPopulateBrandAssets: z2.boolean().optional(),
|
|
740
|
-
businessNameAsset: existingAssetSchema.optional(),
|
|
741
|
-
logoAssets: z2.array(existingAssetSchema).min(1).max(5).optional(),
|
|
742
|
-
landscapeLogoAssets: z2.array(existingAssetSchema).max(5).optional(),
|
|
743
|
-
/** The site's domain (withbaker.com) — required by Google with explicit assets. */
|
|
744
|
-
finalUriDomain: z2.string().trim().min(1).optional(),
|
|
745
|
-
...brandStyleShape
|
|
746
|
-
}).superRefine((p, ctx) => {
|
|
747
|
-
if (p.autoPopulateBrandAssets !== true && (!p.businessNameAsset || !p.logoAssets)) {
|
|
748
|
-
ctx.addIssue({ code: "custom", message: ENABLE_BRAND_ASSETS_MESSAGE });
|
|
749
|
-
}
|
|
750
|
-
if (!colorsPaired(p)) {
|
|
751
|
-
ctx.addIssue({ code: "custom", message: BRAND_COLORS_PAIR_MESSAGE });
|
|
752
|
-
}
|
|
753
|
-
});
|
|
754
|
-
var TEXT_GUIDELINES_CREATE_CHANNEL_MESSAGE = "Text guidelines apply where Google writes the ad text: Performance Max, and Search with AI Max and its text customization on. This campaign type doesn't take them.";
|
|
755
|
-
var TEXT_GUIDELINES_CREATE_AI_MAX_MESSAGE = "Text guidelines on a Search campaign need AI Max with text customization on \u2014 add aiMax {enabled: true, textCustomization: true} (`--ai-max --ai-max-text`) to the same create, or leave the guidelines out.";
|
|
756
|
-
var SHOPPING_SETTING_REQUIRED_MESSAGE = "A Shopping campaign needs shoppingSetting.merchantId \u2014 the Merchant Center account whose products it advertises. Read the linked ones with `baker ads google merchant-center list`.";
|
|
757
|
-
var SHOPPING_SETTING_CHANNEL_MESSAGE = "shoppingSetting belongs to a Shopping or Performance Max campaign only.";
|
|
758
|
-
var PMAX_SHOPPING_ONLY_FIELDS_MESSAGE = "On Performance Max, shoppingSetting takes only merchantId and feedLabel \u2014 campaignPriority and enableLocal are Shopping-campaign settings.";
|
|
759
|
-
function textGuidelinesCreateIssue(p) {
|
|
760
|
-
if (p.textGuidelines === void 0 || p.channelType === "PERFORMANCE_MAX") {
|
|
761
|
-
return void 0;
|
|
762
|
-
}
|
|
763
|
-
if (p.channelType !== "SEARCH") {
|
|
764
|
-
return TEXT_GUIDELINES_CREATE_CHANNEL_MESSAGE;
|
|
765
|
-
}
|
|
766
|
-
return p.aiMax?.enabled === true && p.aiMax.textCustomization === true ? void 0 : TEXT_GUIDELINES_CREATE_AI_MAX_MESSAGE;
|
|
767
|
-
}
|
|
768
|
-
function servingSettingIssues(channelType, p) {
|
|
769
|
-
const issues = [];
|
|
770
|
-
if (p.brandGuidelines !== void 0 && channelType !== "PERFORMANCE_MAX") {
|
|
771
|
-
issues.push({ path: ["brandGuidelines"], message: BRAND_GUIDELINES_CHANNEL_MESSAGE });
|
|
772
|
-
}
|
|
773
|
-
if (p.assetAutomation !== void 0 && channelType !== "PERFORMANCE_MAX") {
|
|
774
|
-
issues.push({ path: ["assetAutomation"], message: ASSET_AUTOMATION_CHANNEL_MESSAGE });
|
|
775
|
-
}
|
|
776
|
-
if (p.dynamicSearchAdsSetting !== void 0 && channelType !== "SEARCH") {
|
|
777
|
-
issues.push({ path: ["dynamicSearchAdsSetting"], message: DSA_CHANNEL_MESSAGE });
|
|
778
|
-
}
|
|
779
|
-
if (p.frequencyCaps !== void 0 && !FREQUENCY_CAP_CHANNELS.has(channelType)) {
|
|
780
|
-
issues.push({ path: ["frequencyCaps"], message: FREQUENCY_CAPS_CHANNEL_MESSAGE });
|
|
781
|
-
}
|
|
782
|
-
return issues;
|
|
783
|
-
}
|
|
784
|
-
function travelHotelCreateIssues(p) {
|
|
785
|
-
const issues = [];
|
|
786
|
-
if (p.channelType === "TRAVEL" && !p.travelCampaignSettings) {
|
|
787
|
-
issues.push({ path: ["travelCampaignSettings"], message: TRAVEL_SETTING_REQUIRED_MESSAGE });
|
|
788
|
-
}
|
|
789
|
-
if (p.channelType === "TRAVEL" && p.bidding?.type === "MAXIMIZE_CONVERSION_VALUE" && p.bidding.targetRoas === void 0) {
|
|
790
|
-
issues.push({ path: ["bidding", "targetRoas"], message: TRAVEL_TARGET_ROAS_MESSAGE });
|
|
791
|
-
}
|
|
792
|
-
if (p.channelType === "HOTEL" && !p.hotelSetting) {
|
|
793
|
-
issues.push({ path: ["hotelSetting"], message: HOTEL_SETTING_REQUIRED_MESSAGE });
|
|
794
|
-
}
|
|
795
|
-
if (p.travelCampaignSettings && p.channelType !== "TRAVEL" || p.hotelSetting && p.channelType !== "HOTEL") {
|
|
796
|
-
issues.push({
|
|
797
|
-
path: [p.hotelSetting ? "hotelSetting" : "travelCampaignSettings"],
|
|
798
|
-
message: TRAVEL_HOTEL_CHANNEL_MESSAGE
|
|
799
|
-
});
|
|
800
|
-
}
|
|
801
|
-
return issues;
|
|
802
|
-
}
|
|
803
|
-
function appCreateIssues(p) {
|
|
804
|
-
if (p.channelType !== "MULTI_CHANNEL") {
|
|
805
|
-
return p.appCampaignSetting || p.selectiveOptimization ? [{ path: ["appCampaignSetting"], message: APP_SETTING_CHANNEL_MESSAGE }] : [];
|
|
806
|
-
}
|
|
807
|
-
const setting = p.appCampaignSetting;
|
|
808
|
-
if (!setting || !p.channelSubType || !APP_SUB_TYPES.has(p.channelSubType)) {
|
|
809
|
-
return [{ path: ["appCampaignSetting"], message: APP_SETTING_REQUIRED_MESSAGE }];
|
|
810
|
-
}
|
|
811
|
-
const goal = APP_CAMPAIGN_GOALS[setting.biddingStrategyGoalType];
|
|
812
|
-
const issues = [];
|
|
813
|
-
if (p.bidding && p.bidding.type !== goal.strategy) {
|
|
814
|
-
issues.push({ path: ["bidding"], message: appGoalBiddingMessage(setting.biddingStrategyGoalType) });
|
|
815
|
-
}
|
|
816
|
-
if (goal.needsConversions && !p.selectiveOptimization) {
|
|
817
|
-
issues.push({ path: ["selectiveOptimization"], message: APP_CONVERSIONS_REQUIRED_MESSAGE });
|
|
818
|
-
}
|
|
819
|
-
if (p.channelSubType === "APP_CAMPAIGN_FOR_ENGAGEMENT" && !goal.needsConversions) {
|
|
820
|
-
issues.push({ path: ["appCampaignSetting", "biddingStrategyGoalType"], message: APP_ENGAGEMENT_GOAL_MESSAGE });
|
|
821
|
-
}
|
|
822
|
-
return issues;
|
|
823
|
-
}
|
|
824
|
-
function shoppingChannelIssue(channelType, setting) {
|
|
825
|
-
if (!setting) {
|
|
826
|
-
return void 0;
|
|
827
|
-
}
|
|
828
|
-
if (channelType !== "SHOPPING" && channelType !== "PERFORMANCE_MAX") {
|
|
829
|
-
return SHOPPING_SETTING_CHANNEL_MESSAGE;
|
|
830
|
-
}
|
|
831
|
-
return channelType === "PERFORMANCE_MAX" && (setting.campaignPriority !== void 0 || setting.enableLocal !== void 0) ? PMAX_SHOPPING_ONLY_FIELDS_MESSAGE : void 0;
|
|
832
|
-
}
|
|
833
|
-
function channelSettingsCreateIssues(p) {
|
|
834
|
-
const issues = [];
|
|
835
|
-
if (p.channelType === "SHOPPING" && !p.shoppingSetting) {
|
|
836
|
-
issues.push({ path: ["shoppingSetting"], message: SHOPPING_SETTING_REQUIRED_MESSAGE });
|
|
837
|
-
}
|
|
838
|
-
const shopping = shoppingChannelIssue(p.channelType, p.shoppingSetting);
|
|
839
|
-
if (shopping) {
|
|
840
|
-
issues.push({ path: ["shoppingSetting"], message: shopping });
|
|
841
|
-
}
|
|
842
|
-
issues.push(...appCreateIssues(p), ...travelHotelCreateIssues(p), ...servingSettingIssues(p.channelType, p));
|
|
843
|
-
const guidelines = textGuidelinesCreateIssue(p);
|
|
844
|
-
if (guidelines) {
|
|
845
|
-
issues.push({ path: ["textGuidelines"], message: guidelines });
|
|
846
|
-
}
|
|
847
|
-
const automation = p.assetAutomation && assetAutomationStateIssue(p.assetAutomation);
|
|
848
|
-
if (automation) {
|
|
849
|
-
issues.push({ path: ["assetAutomation"], message: automation });
|
|
850
|
-
}
|
|
851
|
-
return issues;
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
// ../api/src/ads-google/geo-constants.ts
|
|
855
|
-
var GEO_TARGET_COUNTRIES = {
|
|
856
|
-
"2004": "Afghanistan",
|
|
857
|
-
"2008": "Albania",
|
|
858
|
-
"2010": "Antarctica",
|
|
859
|
-
"2012": "Algeria",
|
|
860
|
-
"2016": "American Samoa",
|
|
861
|
-
"2020": "Andorra",
|
|
862
|
-
"2024": "Angola",
|
|
863
|
-
"2028": "Antigua and Barbuda",
|
|
864
|
-
"2031": "Azerbaijan",
|
|
865
|
-
"2032": "Argentina",
|
|
866
|
-
"2036": "Australia",
|
|
867
|
-
"2040": "Austria",
|
|
868
|
-
"2044": "The Bahamas",
|
|
869
|
-
"2048": "Bahrain",
|
|
870
|
-
"2050": "Bangladesh",
|
|
871
|
-
"2051": "Armenia",
|
|
872
|
-
"2052": "Barbados",
|
|
873
|
-
"2056": "Belgium",
|
|
874
|
-
"2060": "Bermuda",
|
|
875
|
-
"2064": "Bhutan",
|
|
876
|
-
"2068": "Bolivia",
|
|
877
|
-
"2070": "Bosnia and Herzegovina",
|
|
878
|
-
"2072": "Botswana",
|
|
879
|
-
"2074": "Bouvet Island",
|
|
880
|
-
"2076": "Brazil",
|
|
881
|
-
"2084": "Belize",
|
|
882
|
-
"2086": "British Indian Ocean Territory",
|
|
883
|
-
"2090": "Solomon Islands",
|
|
884
|
-
"2092": "British Virgin Islands",
|
|
885
|
-
"2096": "Brunei",
|
|
886
|
-
"2100": "Bulgaria",
|
|
887
|
-
"2104": "Myanmar (Burma)",
|
|
888
|
-
"2108": "Burundi",
|
|
889
|
-
"2112": "Belarus",
|
|
890
|
-
"2116": "Cambodia",
|
|
891
|
-
"2120": "Cameroon",
|
|
892
|
-
"2124": "Canada",
|
|
893
|
-
"2132": "Cabo Verde",
|
|
894
|
-
"2136": "Cayman Islands",
|
|
895
|
-
"2140": "Central African Republic",
|
|
896
|
-
"2144": "Sri Lanka",
|
|
897
|
-
"2148": "Chad",
|
|
898
|
-
"2152": "Chile",
|
|
899
|
-
"2156": "China",
|
|
900
|
-
"2158": "Taiwan",
|
|
901
|
-
"2162": "Christmas Island",
|
|
902
|
-
"2166": "Cocos (Keeling) Islands",
|
|
903
|
-
"2170": "Colombia",
|
|
904
|
-
"2174": "Comoros",
|
|
905
|
-
"2175": "Mayotte",
|
|
906
|
-
"2178": "Republic of the Congo",
|
|
907
|
-
"2180": "Democratic Republic of the Congo",
|
|
908
|
-
"2184": "Cook Islands",
|
|
909
|
-
"2188": "Costa Rica",
|
|
910
|
-
"2191": "Croatia",
|
|
911
|
-
"2196": "Cyprus",
|
|
912
|
-
"2203": "Czechia",
|
|
913
|
-
"2204": "Benin",
|
|
914
|
-
"2208": "Denmark",
|
|
915
|
-
"2212": "Dominica",
|
|
916
|
-
"2214": "Dominican Republic",
|
|
917
|
-
"2218": "Ecuador",
|
|
918
|
-
"2222": "El Salvador",
|
|
919
|
-
"2226": "Equatorial Guinea",
|
|
920
|
-
"2231": "Ethiopia",
|
|
921
|
-
"2232": "Eritrea",
|
|
922
|
-
"2233": "Estonia",
|
|
923
|
-
"2234": "Faroe Islands",
|
|
924
|
-
"2238": "Falkland Islands (Islas Malvinas)",
|
|
925
|
-
"2239": "South Georgia and the South Sandwich Islands",
|
|
926
|
-
"2242": "Fiji",
|
|
927
|
-
"2246": "Finland",
|
|
928
|
-
"2250": "France",
|
|
929
|
-
"2254": "French Guiana",
|
|
930
|
-
"2258": "French Polynesia",
|
|
931
|
-
"2260": "French Southern and Antarctic Lands",
|
|
932
|
-
"2262": "Djibouti",
|
|
933
|
-
"2266": "Gabon",
|
|
934
|
-
"2268": "Georgia",
|
|
935
|
-
"2270": "The Gambia",
|
|
936
|
-
"2275": "Palestine",
|
|
937
|
-
"2276": "Germany",
|
|
938
|
-
"2288": "Ghana",
|
|
939
|
-
"2292": "Gibraltar",
|
|
940
|
-
"2296": "Kiribati",
|
|
941
|
-
"2300": "Greece",
|
|
942
|
-
"2304": "Greenland",
|
|
943
|
-
"2308": "Grenada",
|
|
944
|
-
"2312": "Guadeloupe",
|
|
945
|
-
"2316": "Guam",
|
|
946
|
-
"2320": "Guatemala",
|
|
947
|
-
"2324": "Guinea",
|
|
948
|
-
"2328": "Guyana",
|
|
949
|
-
"2332": "Haiti",
|
|
950
|
-
"2334": "Heard Island and McDonald Islands",
|
|
951
|
-
"2336": "Vatican City",
|
|
952
|
-
"2340": "Honduras",
|
|
953
|
-
"2344": "Hong Kong",
|
|
954
|
-
"2348": "Hungary",
|
|
955
|
-
"2352": "Iceland",
|
|
956
|
-
"2356": "India",
|
|
957
|
-
"2360": "Indonesia",
|
|
958
|
-
"2368": "Iraq",
|
|
959
|
-
"2372": "Ireland",
|
|
960
|
-
"2376": "Israel",
|
|
961
|
-
"2380": "Italy",
|
|
962
|
-
"2384": "Cote d'Ivoire",
|
|
963
|
-
"2388": "Jamaica",
|
|
964
|
-
"2392": "Japan",
|
|
965
|
-
"2398": "Kazakhstan",
|
|
966
|
-
"2400": "Jordan",
|
|
967
|
-
"2404": "Kenya",
|
|
968
|
-
"2410": "South Korea",
|
|
969
|
-
"2414": "Kuwait",
|
|
970
|
-
"2417": "Kyrgyzstan",
|
|
971
|
-
"2418": "Laos",
|
|
972
|
-
"2422": "Lebanon",
|
|
973
|
-
"2426": "Lesotho",
|
|
974
|
-
"2428": "Latvia",
|
|
975
|
-
"2430": "Liberia",
|
|
976
|
-
"2434": "Libya",
|
|
977
|
-
"2438": "Liechtenstein",
|
|
978
|
-
"2440": "Lithuania",
|
|
979
|
-
"2442": "Luxembourg",
|
|
980
|
-
"2446": "Macao",
|
|
981
|
-
"2450": "Madagascar",
|
|
982
|
-
"2454": "Malawi",
|
|
983
|
-
"2458": "Malaysia",
|
|
984
|
-
"2462": "Maldives",
|
|
985
|
-
"2466": "Mali",
|
|
986
|
-
"2470": "Malta",
|
|
987
|
-
"2474": "Martinique",
|
|
988
|
-
"2478": "Mauritania",
|
|
989
|
-
"2480": "Mauritius",
|
|
990
|
-
"2484": "Mexico",
|
|
991
|
-
"2492": "Monaco",
|
|
992
|
-
"2496": "Mongolia",
|
|
993
|
-
"2498": "Moldova",
|
|
994
|
-
"2499": "Montenegro",
|
|
995
|
-
"2500": "Montserrat",
|
|
996
|
-
"2504": "Morocco",
|
|
997
|
-
"2508": "Mozambique",
|
|
998
|
-
"2512": "Oman",
|
|
999
|
-
"2516": "Namibia",
|
|
1000
|
-
"2520": "Nauru",
|
|
1001
|
-
"2524": "Nepal",
|
|
1002
|
-
"2528": "Netherlands",
|
|
1003
|
-
"2531": "Curacao",
|
|
1004
|
-
"2533": "Aruba",
|
|
1005
|
-
"2534": "Sint Maarten",
|
|
1006
|
-
"2535": "Caribbean Netherlands",
|
|
1007
|
-
"2540": "New Caledonia",
|
|
1008
|
-
"2548": "Vanuatu",
|
|
1009
|
-
"2554": "New Zealand",
|
|
1010
|
-
"2558": "Nicaragua",
|
|
1011
|
-
"2562": "Niger",
|
|
1012
|
-
"2566": "Nigeria",
|
|
1013
|
-
"2570": "Niue",
|
|
1014
|
-
"2574": "Norfolk Island",
|
|
1015
|
-
"2578": "Norway",
|
|
1016
|
-
"2580": "Northern Mariana Islands",
|
|
1017
|
-
"2581": "United States Minor Outlying Islands",
|
|
1018
|
-
"2583": "Micronesia",
|
|
1019
|
-
"2584": "Marshall Islands",
|
|
1020
|
-
"2585": "Palau",
|
|
1021
|
-
"2586": "Pakistan",
|
|
1022
|
-
"2591": "Panama",
|
|
1023
|
-
"2598": "Papua New Guinea",
|
|
1024
|
-
"2600": "Paraguay",
|
|
1025
|
-
"2604": "Peru",
|
|
1026
|
-
"2608": "Philippines",
|
|
1027
|
-
"2612": "Pitcairn Islands",
|
|
1028
|
-
"2616": "Poland",
|
|
1029
|
-
"2620": "Portugal",
|
|
1030
|
-
"2624": "Guinea-Bissau",
|
|
1031
|
-
"2626": "Timor-Leste",
|
|
1032
|
-
"2630": "Puerto Rico",
|
|
1033
|
-
"2634": "Qatar",
|
|
1034
|
-
"2638": "Reunion",
|
|
1035
|
-
"2642": "Romania",
|
|
1036
|
-
"2643": "Russia",
|
|
1037
|
-
"2646": "Rwanda",
|
|
1038
|
-
"2652": "Saint Barthelemy",
|
|
1039
|
-
"2654": "Saint Helena, Ascension and Tristan da Cunha",
|
|
1040
|
-
"2659": "Saint Kitts and Nevis",
|
|
1041
|
-
"2660": "Anguilla",
|
|
1042
|
-
"2662": "Saint Lucia",
|
|
1043
|
-
"2663": "Saint Martin",
|
|
1044
|
-
"2666": "Saint Pierre and Miquelon",
|
|
1045
|
-
"2670": "Saint Vincent and the Grenadines",
|
|
1046
|
-
"2674": "San Marino",
|
|
1047
|
-
"2678": "Sao Tome and Principe",
|
|
1048
|
-
"2682": "Saudi Arabia",
|
|
1049
|
-
"2686": "Senegal",
|
|
1050
|
-
"2688": "Serbia",
|
|
1051
|
-
"2690": "Seychelles",
|
|
1052
|
-
"2694": "Sierra Leone",
|
|
1053
|
-
"2702": "Singapore",
|
|
1054
|
-
"2703": "Slovakia",
|
|
1055
|
-
"2704": "Vietnam",
|
|
1056
|
-
"2705": "Slovenia",
|
|
1057
|
-
"2706": "Somalia",
|
|
1058
|
-
"2710": "South Africa",
|
|
1059
|
-
"2716": "Zimbabwe",
|
|
1060
|
-
"2724": "Spain",
|
|
1061
|
-
"2728": "South Sudan",
|
|
1062
|
-
"2732": "Western Sahara",
|
|
1063
|
-
"2736": "Sudan",
|
|
1064
|
-
"2740": "Suriname",
|
|
1065
|
-
"2744": "Svalbard and Jan Mayen",
|
|
1066
|
-
"2748": "Eswatini",
|
|
1067
|
-
"2752": "Sweden",
|
|
1068
|
-
"2756": "Switzerland",
|
|
1069
|
-
"2760": "Syria",
|
|
1070
|
-
"2762": "Tajikistan",
|
|
1071
|
-
"2764": "Thailand",
|
|
1072
|
-
"2768": "Togo",
|
|
1073
|
-
"2772": "Tokelau",
|
|
1074
|
-
"2776": "Tonga",
|
|
1075
|
-
"2780": "Trinidad and Tobago",
|
|
1076
|
-
"2784": "United Arab Emirates",
|
|
1077
|
-
"2788": "Tunisia",
|
|
1078
|
-
"2792": "Turkiye",
|
|
1079
|
-
"2795": "Turkmenistan",
|
|
1080
|
-
"2796": "Turks and Caicos Islands",
|
|
1081
|
-
"2798": "Tuvalu",
|
|
1082
|
-
"2800": "Uganda",
|
|
1083
|
-
"2804": "Ukraine",
|
|
1084
|
-
"2807": "North Macedonia",
|
|
1085
|
-
"2818": "Egypt",
|
|
1086
|
-
"2826": "United Kingdom",
|
|
1087
|
-
"2831": "Guernsey",
|
|
1088
|
-
"2832": "Jersey",
|
|
1089
|
-
"2833": "Isle of Man",
|
|
1090
|
-
"2834": "Tanzania",
|
|
1091
|
-
"2840": "United States",
|
|
1092
|
-
"2850": "U.S. Virgin Islands",
|
|
1093
|
-
"2854": "Burkina Faso",
|
|
1094
|
-
"2858": "Uruguay",
|
|
1095
|
-
"2860": "Uzbekistan",
|
|
1096
|
-
"2862": "Venezuela",
|
|
1097
|
-
"2876": "Wallis and Futuna",
|
|
1098
|
-
"2882": "Samoa",
|
|
1099
|
-
"2887": "Yemen",
|
|
1100
|
-
"2894": "Zambia",
|
|
1101
|
-
"2900": "Kosovo"
|
|
1102
|
-
};
|
|
1103
|
-
var LANGUAGE_CONSTANTS = {
|
|
1104
|
-
"1000": "English",
|
|
1105
|
-
"1001": "German",
|
|
1106
|
-
"1002": "French",
|
|
1107
|
-
"1003": "Spanish",
|
|
1108
|
-
"1004": "Italian",
|
|
1109
|
-
"1005": "Japanese",
|
|
1110
|
-
"1009": "Danish",
|
|
1111
|
-
"1010": "Dutch",
|
|
1112
|
-
"1011": "Finnish",
|
|
1113
|
-
"1012": "Korean",
|
|
1114
|
-
"1013": "Norwegian",
|
|
1115
|
-
"1014": "Portuguese",
|
|
1116
|
-
"1015": "Swedish",
|
|
1117
|
-
"1017": "Chinese (simplified)",
|
|
1118
|
-
"1018": "Chinese (traditional)",
|
|
1119
|
-
"1019": "Arabic",
|
|
1120
|
-
"1020": "Bulgarian",
|
|
1121
|
-
"1021": "Czech",
|
|
1122
|
-
"1022": "Greek",
|
|
1123
|
-
"1023": "Hindi",
|
|
1124
|
-
"1024": "Hungarian",
|
|
1125
|
-
"1025": "Indonesian",
|
|
1126
|
-
"1026": "Icelandic",
|
|
1127
|
-
"1027": "Hebrew",
|
|
1128
|
-
"1028": "Latvian",
|
|
1129
|
-
"1029": "Lithuanian",
|
|
1130
|
-
"1030": "Polish",
|
|
1131
|
-
"1031": "Russian",
|
|
1132
|
-
"1032": "Romanian",
|
|
1133
|
-
"1033": "Slovak",
|
|
1134
|
-
"1034": "Slovenian",
|
|
1135
|
-
"1035": "Serbian",
|
|
1136
|
-
"1036": "Ukrainian",
|
|
1137
|
-
"1037": "Turkish",
|
|
1138
|
-
"1038": "Catalan",
|
|
1139
|
-
"1039": "Croatian",
|
|
1140
|
-
"1040": "Vietnamese",
|
|
1141
|
-
"1041": "Urdu",
|
|
1142
|
-
"1042": "Filipino",
|
|
1143
|
-
"1043": "Estonian",
|
|
1144
|
-
"1044": "Thai",
|
|
1145
|
-
"1056": "Bengali",
|
|
1146
|
-
"1064": "Persian",
|
|
1147
|
-
"1072": "Gujarati",
|
|
1148
|
-
"1086": "Kannada",
|
|
1149
|
-
"1098": "Malayalam",
|
|
1150
|
-
"1101": "Marathi",
|
|
1151
|
-
"1102": "Malay",
|
|
1152
|
-
"1110": "Punjabi",
|
|
1153
|
-
"1130": "Tamil",
|
|
1154
|
-
"1131": "Telugu"
|
|
1155
|
-
};
|
|
1156
|
-
|
|
1157
|
-
// ../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/dist/es6/src/domain.js
|
|
1158
|
-
function shareSameDomainSuffix(hostname, vhost) {
|
|
1159
|
-
if (hostname.endsWith(vhost)) {
|
|
1160
|
-
return hostname.length === vhost.length || hostname[hostname.length - vhost.length - 1] === ".";
|
|
1161
|
-
}
|
|
1162
|
-
return false;
|
|
1163
|
-
}
|
|
1164
|
-
function extractDomainWithSuffix(hostname, publicSuffix) {
|
|
1165
|
-
const publicSuffixIndex = hostname.length - publicSuffix.length - 2;
|
|
1166
|
-
const lastDotBeforeSuffixIndex = hostname.lastIndexOf(".", publicSuffixIndex);
|
|
1167
|
-
if (lastDotBeforeSuffixIndex === -1) {
|
|
1168
|
-
return hostname;
|
|
1169
|
-
}
|
|
1170
|
-
return hostname.slice(lastDotBeforeSuffixIndex + 1);
|
|
1171
|
-
}
|
|
1172
|
-
function getDomain(suffix, hostname, options) {
|
|
1173
|
-
if (options.validHosts !== null) {
|
|
1174
|
-
const validHosts = options.validHosts;
|
|
1175
|
-
for (const vhost of validHosts) {
|
|
1176
|
-
if (
|
|
1177
|
-
/*@__INLINE__*/
|
|
1178
|
-
shareSameDomainSuffix(hostname, vhost)
|
|
1179
|
-
) {
|
|
1180
|
-
return vhost;
|
|
1181
|
-
}
|
|
1182
|
-
}
|
|
1183
|
-
}
|
|
1184
|
-
let numberOfLeadingDots = 0;
|
|
1185
|
-
if (hostname.startsWith(".")) {
|
|
1186
|
-
while (numberOfLeadingDots < hostname.length && hostname[numberOfLeadingDots] === ".") {
|
|
1187
|
-
numberOfLeadingDots += 1;
|
|
1188
|
-
}
|
|
1189
|
-
}
|
|
1190
|
-
if (suffix.length === hostname.length - numberOfLeadingDots) {
|
|
1191
|
-
return null;
|
|
1192
|
-
}
|
|
1193
|
-
return (
|
|
1194
|
-
/*@__INLINE__*/
|
|
1195
|
-
extractDomainWithSuffix(hostname, suffix)
|
|
1196
|
-
);
|
|
1197
|
-
}
|
|
1198
|
-
|
|
1199
|
-
// ../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/dist/es6/src/domain-without-suffix.js
|
|
1200
|
-
function getDomainWithoutSuffix(domain, suffix) {
|
|
1201
|
-
return domain.slice(0, -suffix.length - 1);
|
|
1202
|
-
}
|
|
1203
|
-
|
|
1204
|
-
// ../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/dist/es6/src/extract-hostname.js
|
|
1205
|
-
var CONTROL_CHARS = /[\t\n\r]/g;
|
|
1206
|
-
var extractedHostnameValidated = false;
|
|
1207
|
-
function isValidHostnameChar(code) {
|
|
1208
|
-
return code >= 97 && code <= 122 || // a-z
|
|
1209
|
-
code >= 48 && code <= 57 || // 0-9
|
|
1210
|
-
code > 127 || // non-ASCII (accepted, not punycode-checked)
|
|
1211
|
-
code >= 65 && code <= 90 || // A-Z (becomes valid once lowercased)
|
|
1212
|
-
code === 45 || // '-'
|
|
1213
|
-
code === 95;
|
|
1214
|
-
}
|
|
1215
|
-
function getSpecialScheme(url, schemeStart, colonIndex) {
|
|
1216
|
-
const length = colonIndex - schemeStart;
|
|
1217
|
-
const c0 = url.charCodeAt(schemeStart) | 32;
|
|
1218
|
-
if (length === 2) {
|
|
1219
|
-
return c0 === 119 && (url.charCodeAt(schemeStart + 1) | 32) === 115 ? 1 : 0;
|
|
1220
|
-
} else if (length === 3) {
|
|
1221
|
-
const c1 = url.charCodeAt(schemeStart + 1) | 32;
|
|
1222
|
-
const c2 = url.charCodeAt(schemeStart + 2) | 32;
|
|
1223
|
-
if (c0 === 119 && c1 === 115 && c2 === 115)
|
|
1224
|
-
return 1;
|
|
1225
|
-
if (c0 === 102 && c1 === 116 && c2 === 112)
|
|
1226
|
-
return 1;
|
|
1227
|
-
return 0;
|
|
1228
|
-
} else if (length === 4) {
|
|
1229
|
-
const c1 = url.charCodeAt(schemeStart + 1) | 32;
|
|
1230
|
-
const c2 = url.charCodeAt(schemeStart + 2) | 32;
|
|
1231
|
-
const c3 = url.charCodeAt(schemeStart + 3) | 32;
|
|
1232
|
-
if (c0 === 104 && c1 === 116 && c2 === 116 && c3 === 112)
|
|
1233
|
-
return 1;
|
|
1234
|
-
if (c0 === 102 && c1 === 105 && c2 === 108 && c3 === 101)
|
|
1235
|
-
return 2;
|
|
1236
|
-
return 0;
|
|
1237
|
-
} else if (length === 5) {
|
|
1238
|
-
return c0 === 104 && (url.charCodeAt(schemeStart + 1) | 32) === 116 && (url.charCodeAt(schemeStart + 2) | 32) === 116 && (url.charCodeAt(schemeStart + 3) | 32) === 112 && (url.charCodeAt(schemeStart + 4) | 32) === 115 ? 1 : 0;
|
|
1239
|
-
}
|
|
1240
|
-
return 0;
|
|
1241
|
-
}
|
|
1242
|
-
function extractHostname(url, urlIsValidHostname, validate = false) {
|
|
1243
|
-
let start = 0;
|
|
1244
|
-
let end = url.length;
|
|
1245
|
-
let hasUpper = false;
|
|
1246
|
-
let isSpecial = false;
|
|
1247
|
-
extractedHostnameValidated = false;
|
|
1248
|
-
if (!urlIsValidHostname) {
|
|
1249
|
-
if (url.startsWith("data:")) {
|
|
1250
|
-
return null;
|
|
1251
|
-
}
|
|
1252
|
-
while (start < url.length && url.charCodeAt(start) <= 32) {
|
|
1253
|
-
start += 1;
|
|
1254
|
-
}
|
|
1255
|
-
while (end > start + 1 && url.charCodeAt(end - 1) <= 32) {
|
|
1256
|
-
end -= 1;
|
|
1257
|
-
}
|
|
1258
|
-
if (url.charCodeAt(start) === 47 && url.charCodeAt(start + 1) === 47) {
|
|
1259
|
-
start += 2;
|
|
1260
|
-
} else {
|
|
1261
|
-
const indexOfProtocol = url.indexOf(":/", start);
|
|
1262
|
-
if (indexOfProtocol !== -1) {
|
|
1263
|
-
const special = getSpecialScheme(url, start, indexOfProtocol);
|
|
1264
|
-
if (special === 1) {
|
|
1265
|
-
isSpecial = true;
|
|
1266
|
-
start = indexOfProtocol + 2;
|
|
1267
|
-
while (url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) {
|
|
1268
|
-
start += 1;
|
|
1269
|
-
}
|
|
1270
|
-
} else if (special === 2) {
|
|
1271
|
-
isSpecial = true;
|
|
1272
|
-
start = indexOfProtocol + 1;
|
|
1273
|
-
let slashes = 0;
|
|
1274
|
-
while ((url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) && slashes < 2) {
|
|
1275
|
-
start += 1;
|
|
1276
|
-
slashes += 1;
|
|
1277
|
-
}
|
|
1278
|
-
if (slashes < 2) {
|
|
1279
|
-
return null;
|
|
1280
|
-
}
|
|
1281
|
-
} else {
|
|
1282
|
-
for (let i = start; i < indexOfProtocol; i += 1) {
|
|
1283
|
-
const code = url.charCodeAt(i) | 32;
|
|
1284
|
-
if (!(code >= 97 && code <= 122 || // [a, z]
|
|
1285
|
-
code >= 48 && code <= 57 || // [0, 9]
|
|
1286
|
-
code === 46 || // '.'
|
|
1287
|
-
code === 45 || // '-'
|
|
1288
|
-
code === 43)) {
|
|
1289
|
-
const raw = url.charCodeAt(i);
|
|
1290
|
-
if (raw === 9 || raw === 10 || raw === 13) {
|
|
1291
|
-
return extractHostname(url.replace(CONTROL_CHARS, ""), urlIsValidHostname, validate);
|
|
1292
|
-
}
|
|
1293
|
-
return null;
|
|
1294
|
-
}
|
|
1295
|
-
}
|
|
1296
|
-
if (url.charCodeAt(indexOfProtocol + 2) === 47) {
|
|
1297
|
-
start = indexOfProtocol + 3;
|
|
1298
|
-
} else {
|
|
1299
|
-
return null;
|
|
1300
|
-
}
|
|
1301
|
-
}
|
|
1302
|
-
} else if (url.charCodeAt(start) !== 91) {
|
|
1303
|
-
let indexOfColon = -1;
|
|
1304
|
-
for (let i = start; i < end; i += 1) {
|
|
1305
|
-
const code = url.charCodeAt(i);
|
|
1306
|
-
if (code === 9 || code === 10 || code === 13) {
|
|
1307
|
-
return extractHostname(url.replace(CONTROL_CHARS, ""), urlIsValidHostname, validate);
|
|
1308
|
-
}
|
|
1309
|
-
if (code === 58) {
|
|
1310
|
-
indexOfColon = i;
|
|
1311
|
-
break;
|
|
1312
|
-
}
|
|
1313
|
-
if (code === 47 || code === 92 || code === 63 || code === 35) {
|
|
1314
|
-
break;
|
|
1315
|
-
}
|
|
1316
|
-
}
|
|
1317
|
-
if (indexOfColon !== -1) {
|
|
1318
|
-
let hasIdentifier = false;
|
|
1319
|
-
for (let i = indexOfColon + 1; i < end; i += 1) {
|
|
1320
|
-
const code = url.charCodeAt(i);
|
|
1321
|
-
if (code === 47 || code === 92 || code === 63 || code === 35) {
|
|
1322
|
-
break;
|
|
1323
|
-
}
|
|
1324
|
-
if (code === 64) {
|
|
1325
|
-
hasIdentifier = true;
|
|
1326
|
-
break;
|
|
1327
|
-
}
|
|
1328
|
-
}
|
|
1329
|
-
if (!hasIdentifier) {
|
|
1330
|
-
let allDigits = true;
|
|
1331
|
-
let i = indexOfColon + 1;
|
|
1332
|
-
for (; i < end; i += 1) {
|
|
1333
|
-
const code = url.charCodeAt(i);
|
|
1334
|
-
if (code === 47 || code === 92 || code === 63 || code === 35) {
|
|
1335
|
-
break;
|
|
1336
|
-
}
|
|
1337
|
-
if (code < 48 || code > 57) {
|
|
1338
|
-
allDigits = false;
|
|
1339
|
-
break;
|
|
1340
|
-
}
|
|
1341
|
-
}
|
|
1342
|
-
if (i === indexOfColon + 1) {
|
|
1343
|
-
allDigits = false;
|
|
1344
|
-
}
|
|
1345
|
-
if (!allDigits) {
|
|
1346
|
-
const special = getSpecialScheme(url, start, indexOfColon);
|
|
1347
|
-
if (special === 0) {
|
|
1348
|
-
let isBareIpv6 = false;
|
|
1349
|
-
for (let j = indexOfColon + 1; j < end; j += 1) {
|
|
1350
|
-
const code = url.charCodeAt(j);
|
|
1351
|
-
if (code === 47 || code === 92 || code === 63 || code === 35) {
|
|
1352
|
-
break;
|
|
1353
|
-
}
|
|
1354
|
-
if (code === 58) {
|
|
1355
|
-
isBareIpv6 = true;
|
|
1356
|
-
break;
|
|
1357
|
-
}
|
|
1358
|
-
}
|
|
1359
|
-
if (!isBareIpv6) {
|
|
1360
|
-
return null;
|
|
1361
|
-
}
|
|
1362
|
-
} else {
|
|
1363
|
-
isSpecial = true;
|
|
1364
|
-
start = indexOfColon + 1;
|
|
1365
|
-
if (special === 2) {
|
|
1366
|
-
let slashes = 0;
|
|
1367
|
-
while ((url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) && slashes < 2) {
|
|
1368
|
-
start += 1;
|
|
1369
|
-
slashes += 1;
|
|
1370
|
-
}
|
|
1371
|
-
if (slashes < 2) {
|
|
1372
|
-
return null;
|
|
1373
|
-
}
|
|
1374
|
-
} else {
|
|
1375
|
-
while (url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) {
|
|
1376
|
-
start += 1;
|
|
1377
|
-
}
|
|
1378
|
-
}
|
|
1379
|
-
}
|
|
1380
|
-
}
|
|
1381
|
-
}
|
|
1382
|
-
}
|
|
1383
|
-
}
|
|
1384
|
-
}
|
|
1385
|
-
let indexOfIdentifier = -1;
|
|
1386
|
-
let indexOfClosingBracket = -1;
|
|
1387
|
-
let indexOfPort = -1;
|
|
1388
|
-
let indexOfFirstColon = -1;
|
|
1389
|
-
let hasControl = false;
|
|
1390
|
-
let vValid = validate;
|
|
1391
|
-
let vLastDot = start - 1;
|
|
1392
|
-
let vLastCode = -1;
|
|
1393
|
-
if (validate && start < end) {
|
|
1394
|
-
const c0 = url.charCodeAt(start);
|
|
1395
|
-
if (!/*@__INLINE__*/
|
|
1396
|
-
(isValidHostnameChar(c0) || c0 === 46 || c0 === 95) || c0 === 45) {
|
|
1397
|
-
vValid = false;
|
|
1398
|
-
}
|
|
1399
|
-
}
|
|
1400
|
-
for (let i = start; i < end; i += 1) {
|
|
1401
|
-
const code = url.charCodeAt(i);
|
|
1402
|
-
if (code < 64) {
|
|
1403
|
-
if (code === 47 || code === 35 || code === 63) {
|
|
1404
|
-
end = i;
|
|
1405
|
-
break;
|
|
1406
|
-
} else if (code === 58) {
|
|
1407
|
-
if (indexOfFirstColon === -1) {
|
|
1408
|
-
indexOfFirstColon = i;
|
|
1409
|
-
}
|
|
1410
|
-
indexOfPort = i;
|
|
1411
|
-
} else if (code === 9 || code === 10 || code === 13) {
|
|
1412
|
-
hasControl = true;
|
|
1413
|
-
} else if (validate) {
|
|
1414
|
-
if (code === 46) {
|
|
1415
|
-
if (i - vLastDot > 64 || vLastCode === 46 || vLastCode === 45) {
|
|
1416
|
-
vValid = false;
|
|
1417
|
-
}
|
|
1418
|
-
vLastDot = i;
|
|
1419
|
-
} else if (code < 48 || code > 57) {
|
|
1420
|
-
if (code !== 45 || vLastCode === 46) {
|
|
1421
|
-
vValid = false;
|
|
1422
|
-
}
|
|
1423
|
-
}
|
|
1424
|
-
}
|
|
1425
|
-
} else if (isSpecial && code === 92) {
|
|
1426
|
-
end = i;
|
|
1427
|
-
break;
|
|
1428
|
-
} else if (code === 64) {
|
|
1429
|
-
indexOfIdentifier = i;
|
|
1430
|
-
indexOfFirstColon = -1;
|
|
1431
|
-
} else if (code === 93) {
|
|
1432
|
-
indexOfClosingBracket = i;
|
|
1433
|
-
} else if (code >= 65 && code <= 90) {
|
|
1434
|
-
hasUpper = true;
|
|
1435
|
-
} else if (validate && !/*@__INLINE__*/
|
|
1436
|
-
isValidHostnameChar(code)) {
|
|
1437
|
-
vValid = false;
|
|
1438
|
-
}
|
|
1439
|
-
if (validate) {
|
|
1440
|
-
vLastCode = code;
|
|
1441
|
-
}
|
|
1442
|
-
}
|
|
1443
|
-
if (hasControl) {
|
|
1444
|
-
return extractHostname(url.replace(CONTROL_CHARS, ""), urlIsValidHostname, validate);
|
|
1445
|
-
}
|
|
1446
|
-
if (indexOfIdentifier !== -1 && indexOfIdentifier >= start && indexOfIdentifier < end) {
|
|
1447
|
-
start = indexOfIdentifier + 1;
|
|
1448
|
-
}
|
|
1449
|
-
if (url.charCodeAt(start) === 91) {
|
|
1450
|
-
if (indexOfClosingBracket !== -1) {
|
|
1451
|
-
return url.slice(start + 1, indexOfClosingBracket).toLowerCase();
|
|
1452
|
-
}
|
|
1453
|
-
return null;
|
|
1454
|
-
} else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end && // A host:port has exactly one ':' in the host (so its first ':' is its
|
|
1455
|
-
// last); a bare, unbracketed IPv6 literal ("2a01:e35::1") has >= 2, so
|
|
1456
|
-
// its first ':' precedes the last. Only the former has a ':port' to trim.
|
|
1457
|
-
indexOfFirstColon === indexOfPort) {
|
|
1458
|
-
end = indexOfPort;
|
|
1459
|
-
}
|
|
1460
|
-
if (start >= end) {
|
|
1461
|
-
return null;
|
|
1462
|
-
}
|
|
1463
|
-
if (validate && vValid && indexOfIdentifier === -1 && indexOfPort === -1 && indexOfClosingBracket === -1 && url.charCodeAt(end - 1) !== 46 && end - start <= 255 && // total length
|
|
1464
|
-
end - vLastDot - 1 <= 63 && // last label length
|
|
1465
|
-
vLastCode !== 45) {
|
|
1466
|
-
extractedHostnameValidated = true;
|
|
1467
|
-
}
|
|
1468
|
-
}
|
|
1469
|
-
while (end > start + 1 && url.charCodeAt(end - 1) === 46) {
|
|
1470
|
-
end -= 1;
|
|
1471
|
-
}
|
|
1472
|
-
const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url;
|
|
1473
|
-
if (hasUpper) {
|
|
1474
|
-
return hostname.toLowerCase();
|
|
1475
|
-
}
|
|
1476
|
-
return hostname;
|
|
1477
|
-
}
|
|
1478
|
-
|
|
1479
|
-
// ../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/dist/es6/src/is-ip.js
|
|
1480
|
-
function isProbablyIpv4(hostname) {
|
|
1481
|
-
if (hostname.length < 7) {
|
|
1482
|
-
return false;
|
|
1483
|
-
}
|
|
1484
|
-
if (hostname.length > 15) {
|
|
1485
|
-
return false;
|
|
1486
|
-
}
|
|
1487
|
-
let numberOfDots = 0;
|
|
1488
|
-
for (let i = 0; i < hostname.length; i += 1) {
|
|
1489
|
-
const code = hostname.charCodeAt(i);
|
|
1490
|
-
if (code === 46) {
|
|
1491
|
-
numberOfDots += 1;
|
|
1492
|
-
} else if (code < 48 || code > 57) {
|
|
1493
|
-
return false;
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
return numberOfDots === 3 && hostname.charCodeAt(0) !== 46 && hostname.charCodeAt(hostname.length - 1) !== 46;
|
|
1497
|
-
}
|
|
1498
|
-
function isProbablyIpv6(hostname) {
|
|
1499
|
-
if (hostname.length < 3) {
|
|
1500
|
-
return false;
|
|
1501
|
-
}
|
|
1502
|
-
let start = hostname.startsWith("[") ? 1 : 0;
|
|
1503
|
-
let end = hostname.length;
|
|
1504
|
-
if (hostname[end - 1] === "]") {
|
|
1505
|
-
end -= 1;
|
|
1506
|
-
}
|
|
1507
|
-
if (end - start > 39) {
|
|
1508
|
-
return false;
|
|
1509
|
-
}
|
|
1510
|
-
let hasColon = false;
|
|
1511
|
-
for (; start < end; start += 1) {
|
|
1512
|
-
const code = hostname.charCodeAt(start);
|
|
1513
|
-
if (code === 58) {
|
|
1514
|
-
hasColon = true;
|
|
1515
|
-
} else if (!(code >= 48 && code <= 57 || // 0-9
|
|
1516
|
-
code >= 97 && code <= 102 || // a-f
|
|
1517
|
-
code >= 65 && code <= 70)) {
|
|
1518
|
-
return false;
|
|
1519
|
-
}
|
|
1520
|
-
}
|
|
1521
|
-
return hasColon;
|
|
1522
|
-
}
|
|
1523
|
-
function isIp(hostname) {
|
|
1524
|
-
return isProbablyIpv6(hostname) || isProbablyIpv4(hostname);
|
|
1525
|
-
}
|
|
1526
|
-
|
|
1527
|
-
// ../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/dist/es6/src/is-special-use.js
|
|
1528
|
-
var SPECIAL_USE_DOMAINS = [
|
|
1529
|
-
"test",
|
|
1530
|
-
// RFC 6761
|
|
1531
|
-
"localhost",
|
|
1532
|
-
// RFC 6761
|
|
1533
|
-
"invalid",
|
|
1534
|
-
// RFC 6761
|
|
1535
|
-
"example",
|
|
1536
|
-
// RFC 6761
|
|
1537
|
-
"example.com",
|
|
1538
|
-
// RFC 6761
|
|
1539
|
-
"example.net",
|
|
1540
|
-
// RFC 6761
|
|
1541
|
-
"example.org",
|
|
1542
|
-
// RFC 6761
|
|
1543
|
-
"local",
|
|
1544
|
-
// RFC 6762 (mDNS)
|
|
1545
|
-
"onion",
|
|
1546
|
-
// RFC 7686 (Tor)
|
|
1547
|
-
"alt",
|
|
1548
|
-
// RFC 9476
|
|
1549
|
-
"home.arpa",
|
|
1550
|
-
// RFC 8375
|
|
1551
|
-
"ipv4only.arpa",
|
|
1552
|
-
// RFC 8880
|
|
1553
|
-
"resolver.arpa",
|
|
1554
|
-
// RFC 9462
|
|
1555
|
-
"service.arpa",
|
|
1556
|
-
// RFC 9665
|
|
1557
|
-
"6tisch.arpa",
|
|
1558
|
-
// RFC 9031
|
|
1559
|
-
"eap.arpa"
|
|
1560
|
-
// RFC 9965
|
|
1561
|
-
];
|
|
1562
|
-
function isSpecialUse(hostname) {
|
|
1563
|
-
for (const name of SPECIAL_USE_DOMAINS) {
|
|
1564
|
-
if (hostname.endsWith(name) && (hostname.length === name.length || hostname.charCodeAt(hostname.length - name.length - 1) === 46)) {
|
|
1565
|
-
return true;
|
|
1566
|
-
}
|
|
1567
|
-
}
|
|
1568
|
-
return false;
|
|
1569
|
-
}
|
|
1570
|
-
|
|
1571
|
-
// ../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/dist/es6/src/is-valid.js
|
|
1572
|
-
function isValidAscii(code) {
|
|
1573
|
-
return code >= 97 && code <= 122 || code >= 48 && code <= 57 || code > 127;
|
|
1574
|
-
}
|
|
1575
|
-
function is_valid_default(hostname) {
|
|
1576
|
-
if (hostname.length > 255) {
|
|
1577
|
-
return false;
|
|
1578
|
-
}
|
|
1579
|
-
if (hostname.length === 0) {
|
|
1580
|
-
return false;
|
|
1581
|
-
}
|
|
1582
|
-
if (
|
|
1583
|
-
/*@__INLINE__*/
|
|
1584
|
-
!isValidAscii(hostname.charCodeAt(0)) && hostname.charCodeAt(0) !== 46 && // '.' (dot)
|
|
1585
|
-
hostname.charCodeAt(0) !== 95
|
|
1586
|
-
) {
|
|
1587
|
-
return false;
|
|
1588
|
-
}
|
|
1589
|
-
let lastDotIndex = -1;
|
|
1590
|
-
let lastCharCode = -1;
|
|
1591
|
-
const len = hostname.length;
|
|
1592
|
-
for (let i = 0; i < len; i += 1) {
|
|
1593
|
-
const code = hostname.charCodeAt(i);
|
|
1594
|
-
if (code === 46) {
|
|
1595
|
-
if (
|
|
1596
|
-
// Check that previous label is < 63 bytes long (64 = 63 + '.')
|
|
1597
|
-
i - lastDotIndex > 64 || // Check that previous character was not already a '.'
|
|
1598
|
-
lastCharCode === 46 || // Check that the previous label does not end with '-' (RFC 1035 §2.3.1 LDH).
|
|
1599
|
-
// '_' is intentionally NOT restricted: DNS allows any octet (RFC 2181 §11) and
|
|
1600
|
-
// WHATWG URL does not treat '_' as a forbidden host code point.
|
|
1601
|
-
lastCharCode === 45
|
|
1602
|
-
) {
|
|
1603
|
-
return false;
|
|
1604
|
-
}
|
|
1605
|
-
lastDotIndex = i;
|
|
1606
|
-
} else if (
|
|
1607
|
-
// A forbidden character in the label...
|
|
1608
|
-
!/*@__INLINE__*/
|
|
1609
|
-
(isValidAscii(code) || code === 45 || code === 95) || // ...or a '-' starting a label (the byte right after a '.'). A label must
|
|
1610
|
-
// not begin with a hyphen (RFC 1034 §3.5 / RFC 1035 §2.3.1 LDH, as amended
|
|
1611
|
-
// by RFC 1123 §2.1; cf. UTS #46 CheckHyphens). The first label is covered by
|
|
1612
|
-
// the leading-character guard above; mirrors the trailing-'-' rule below.
|
|
1613
|
-
code === 45 && lastCharCode === 46
|
|
1614
|
-
) {
|
|
1615
|
-
return false;
|
|
1616
|
-
}
|
|
1617
|
-
lastCharCode = code;
|
|
1618
|
-
}
|
|
1619
|
-
return (
|
|
1620
|
-
// Check that last label is shorter than 63 chars
|
|
1621
|
-
len - lastDotIndex - 1 <= 63 && // Check that the last character is an allowed trailing label character.
|
|
1622
|
-
// Since we already checked that the char is a valid hostname character,
|
|
1623
|
-
// we only need to check that it's different from '-'.
|
|
1624
|
-
lastCharCode !== 45
|
|
1625
|
-
);
|
|
1626
|
-
}
|
|
1627
|
-
|
|
1628
|
-
// ../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/dist/es6/src/options.js
|
|
1629
|
-
function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, detectSpecialUse = false, extractHostname: extractHostname2 = true, mixedInputs = true, validHosts = null, validateHostname = true }) {
|
|
1630
|
-
return {
|
|
1631
|
-
allowIcannDomains,
|
|
1632
|
-
allowPrivateDomains,
|
|
1633
|
-
detectIp,
|
|
1634
|
-
detectSpecialUse,
|
|
1635
|
-
extractHostname: extractHostname2,
|
|
1636
|
-
mixedInputs,
|
|
1637
|
-
validHosts,
|
|
1638
|
-
validateHostname
|
|
1639
|
-
};
|
|
1640
|
-
}
|
|
1641
|
-
var DEFAULT_OPTIONS = (
|
|
1642
|
-
/*@__INLINE__*/
|
|
1643
|
-
setDefaultsImpl({})
|
|
1644
|
-
);
|
|
1645
|
-
function setDefaults(options) {
|
|
1646
|
-
if (options === void 0) {
|
|
1647
|
-
return DEFAULT_OPTIONS;
|
|
1648
|
-
}
|
|
1649
|
-
return (
|
|
1650
|
-
/*@__INLINE__*/
|
|
1651
|
-
setDefaultsImpl(options)
|
|
1652
|
-
);
|
|
1653
|
-
}
|
|
1654
|
-
|
|
1655
|
-
// ../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/dist/es6/src/subdomain.js
|
|
1656
|
-
function getSubdomain(hostname, domain) {
|
|
1657
|
-
if (domain.length === hostname.length) {
|
|
1658
|
-
return "";
|
|
1659
|
-
}
|
|
1660
|
-
return hostname.slice(0, -domain.length - 1);
|
|
1661
|
-
}
|
|
1662
|
-
|
|
1663
|
-
// ../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/dist/es6/src/factory.js
|
|
1664
|
-
function getEmptyResult() {
|
|
1665
|
-
return {
|
|
1666
|
-
domain: null,
|
|
1667
|
-
domainWithoutSuffix: null,
|
|
1668
|
-
hostname: null,
|
|
1669
|
-
isIcann: null,
|
|
1670
|
-
isIp: null,
|
|
1671
|
-
isPrivate: null,
|
|
1672
|
-
isSpecialUse: null,
|
|
1673
|
-
publicSuffix: null,
|
|
1674
|
-
subdomain: null
|
|
1675
|
-
};
|
|
1676
|
-
}
|
|
1677
|
-
function resetResult(result) {
|
|
1678
|
-
result.domain = null;
|
|
1679
|
-
result.domainWithoutSuffix = null;
|
|
1680
|
-
result.hostname = null;
|
|
1681
|
-
result.isIcann = null;
|
|
1682
|
-
result.isIp = null;
|
|
1683
|
-
result.isPrivate = null;
|
|
1684
|
-
result.isSpecialUse = null;
|
|
1685
|
-
result.publicSuffix = null;
|
|
1686
|
-
result.subdomain = null;
|
|
1687
|
-
}
|
|
1688
|
-
function parseImpl(url, step, suffixLookup2, partialOptions, result) {
|
|
1689
|
-
const options = (
|
|
1690
|
-
/*@__INLINE__*/
|
|
1691
|
-
setDefaults(partialOptions)
|
|
1692
|
-
);
|
|
1693
|
-
if (typeof url !== "string") {
|
|
1694
|
-
return result;
|
|
1695
|
-
}
|
|
1696
|
-
let urlIsValid = false;
|
|
1697
|
-
if (!options.extractHostname) {
|
|
1698
|
-
result.hostname = url;
|
|
1699
|
-
} else if (options.mixedInputs) {
|
|
1700
|
-
urlIsValid = is_valid_default(url);
|
|
1701
|
-
result.hostname = extractHostname(url, urlIsValid, options.validateHostname);
|
|
1702
|
-
} else {
|
|
1703
|
-
result.hostname = extractHostname(url, false, options.validateHostname);
|
|
1704
|
-
}
|
|
1705
|
-
if (options.detectIp && result.hostname !== null) {
|
|
1706
|
-
result.isIp = isIp(result.hostname);
|
|
1707
|
-
if (result.isIp) {
|
|
1708
|
-
return result;
|
|
1709
|
-
}
|
|
1710
|
-
}
|
|
1711
|
-
if (options.validateHostname && options.extractHostname && result.hostname !== null && // Skip the re-scan when `url` was already validated and extractHostname
|
|
1712
|
-
// returned it unchanged (same reference => identical string, still valid).
|
|
1713
|
-
!(urlIsValid && result.hostname === url) && // Skip the re-scan when extractHostname already validated the host inline
|
|
1714
|
-
// (a confirmed-valid simple authority — see extract-hostname.ts).
|
|
1715
|
-
!extractedHostnameValidated && !is_valid_default(result.hostname)) {
|
|
1716
|
-
result.hostname = null;
|
|
1717
|
-
return result;
|
|
1718
|
-
}
|
|
1719
|
-
if (step === 0 || result.hostname === null) {
|
|
1720
|
-
return result;
|
|
1721
|
-
}
|
|
1722
|
-
if (step === 5 && options.detectSpecialUse) {
|
|
1723
|
-
result.isSpecialUse = isSpecialUse(result.hostname);
|
|
1724
|
-
}
|
|
1725
|
-
suffixLookup2(result.hostname, options, result);
|
|
1726
|
-
if (step === 2 || result.publicSuffix === null) {
|
|
1727
|
-
return result;
|
|
1728
|
-
}
|
|
1729
|
-
result.domain = getDomain(result.publicSuffix, result.hostname, options);
|
|
1730
|
-
if (step === 3 || result.domain === null) {
|
|
1731
|
-
return result;
|
|
1732
|
-
}
|
|
1733
|
-
result.subdomain = getSubdomain(result.hostname, result.domain);
|
|
1734
|
-
if (step === 4) {
|
|
1735
|
-
return result;
|
|
1736
|
-
}
|
|
1737
|
-
result.domainWithoutSuffix = getDomainWithoutSuffix(result.domain, result.publicSuffix);
|
|
1738
|
-
return result;
|
|
1739
|
-
}
|
|
1740
|
-
|
|
1741
|
-
// ../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/dist/es6/src/lookup/fast-path.js
|
|
1742
|
-
function fast_path_default(hostname, options, out) {
|
|
1743
|
-
if (!options.allowPrivateDomains && hostname.length > 3) {
|
|
1744
|
-
const last = hostname.length - 1;
|
|
1745
|
-
const c3 = hostname.charCodeAt(last);
|
|
1746
|
-
const c2 = hostname.charCodeAt(last - 1);
|
|
1747
|
-
const c1 = hostname.charCodeAt(last - 2);
|
|
1748
|
-
const c0 = hostname.charCodeAt(last - 3);
|
|
1749
|
-
if (c3 === 109 && c2 === 111 && c1 === 99 && c0 === 46) {
|
|
1750
|
-
out.isIcann = true;
|
|
1751
|
-
out.isPrivate = false;
|
|
1752
|
-
out.publicSuffix = "com";
|
|
1753
|
-
return true;
|
|
1754
|
-
} else if (c3 === 103 && c2 === 114 && c1 === 111 && c0 === 46) {
|
|
1755
|
-
out.isIcann = true;
|
|
1756
|
-
out.isPrivate = false;
|
|
1757
|
-
out.publicSuffix = "org";
|
|
1758
|
-
return true;
|
|
1759
|
-
} else if (c3 === 117 && c2 === 100 && c1 === 101 && c0 === 46) {
|
|
1760
|
-
out.isIcann = true;
|
|
1761
|
-
out.isPrivate = false;
|
|
1762
|
-
out.publicSuffix = "edu";
|
|
1763
|
-
return true;
|
|
1764
|
-
} else if (c3 === 118 && c2 === 111 && c1 === 103 && c0 === 46) {
|
|
1765
|
-
out.isIcann = true;
|
|
1766
|
-
out.isPrivate = false;
|
|
1767
|
-
out.publicSuffix = "gov";
|
|
1768
|
-
return true;
|
|
1769
|
-
} else if (c3 === 116 && c2 === 101 && c1 === 110 && c0 === 46) {
|
|
1770
|
-
out.isIcann = true;
|
|
1771
|
-
out.isPrivate = false;
|
|
1772
|
-
out.publicSuffix = "net";
|
|
1773
|
-
return true;
|
|
1774
|
-
} else if (c3 === 101 && c2 === 100 && c1 === 46) {
|
|
1775
|
-
out.isIcann = true;
|
|
1776
|
-
out.isPrivate = false;
|
|
1777
|
-
out.publicSuffix = "de";
|
|
1778
|
-
return true;
|
|
1779
|
-
}
|
|
1780
|
-
}
|
|
1781
|
-
return false;
|
|
1782
|
-
}
|
|
1783
|
-
|
|
1784
|
-
// ../../node_modules/.pnpm/tldts@7.4.15/node_modules/tldts/dist/es6/src/data/trie.js
|
|
1785
|
-
var nodeFlags = /* @__PURE__ */ new Uint8Array([1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 0, 2, 2, 0, 2, 0, 0, 1, 0, 0, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 2, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 2, 2, 0, 0, 0, 2, 0, 1, 1, 0, 2, 0, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]);
|
|
1786
|
-
var edgeStart = /* @__PURE__ */ new Uint16Array([0, 0, 0, 10, 11, 18, 106, 111, 117, 124, 130, 136, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 157, 159, 226, 239, 241, 242, 243, 258, 265, 266, 269, 270, 271, 274, 276, 295, 296, 298, 307, 312, 329, 330, 333, 335, 336, 338, 372, 373, 375, 378, 379, 383, 385, 389, 392, 424, 427, 440, 441, 449, 450, 452, 462, 476, 477, 478, 487, 488, 525, 530, 546, 566, 572, 614, 615, 642, 669, 670, 818, 824, 827, 828, 829, 834, 839, 848, 870, 871, 872, 873, 874, 875, 876, 894, 896, 897, 900, 902, 903, 905, 907, 922, 937, 942, 943, 945, 946, 947, 948, 949, 951, 954, 959, 960, 961, 963, 964, 967, 970, 971, 972, 985, 987, 999, 1010, 1018, 1020, 1061, 1064, 1068, 1069, 1071, 1074, 1085, 1087, 1097, 1099, 1105, 1107, 1108, 1110, 1113, 1114, 1115, 1168, 1170, 1172, 1192, 1193, 1194, 1195, 1197, 1208, 1239, 1250, 1262, 1271, 1278, 1283, 1296, 1307, 1320, 1321, 1332, 1366, 1367, 1368, 1383, 1398, 1470, 1471, 1473, 1474, 1508, 1509, 1510, 1511, 1514, 1518, 1521, 1523, 1552, 1553, 1561, 1562, 1563, 1564, 1566, 1568, 1569, 1571, 1572, 1573, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1599, 1600, 1601, 2055, 2058, 2059, 2061, 2068, 2075, 2085, 2089, 2100, 2101, 2102, 2114, 2115, 2117, 2119, 2120, 2127, 2128, 2130, 2131, 2133, 2134, 2135, 2136, 2137, 2211, 2213, 2234, 2235, 2236, 2238, 2264, 2265, 2316, 2317, 2319, 2326, 2332, 2342, 2352, 2405, 2406, 2407, 2417, 2431, 2432, 2435, 2442, 2443, 2451, 2452, 2453, 2454, 2455, 2466, 2467, 2468, 2470, 2471, 2472, 2481, 2493, 2499, 2531, 2535, 2537, 2538, 2540, 2541, 2552, 2553, 2555, 2563, 2570, 2576, 2581, 2582, 2588, 2591, 2597, 2604, 2605, 2612, 2620, 2621, 2622, 2660, 2666, 2681, 2682, 2687, 2705, 2736, 2754, 2756, 2759, 2767, 2769, 2776, 2828, 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2865, 2866, 2867, 2868, 2869, 2870, 2872, 2873, 2877, 2957, 2970, 2971, 3408, 3412, 3426, 3478, 3506, 3528, 3586, 3608, 3623, 3686, 3737, 3775, 3811, 3836, 3978, 4024, 4075, 4094, 4128, 4143, 4163, 4193, 4224, 4247, 4278, 4308, 4340, 4367, 4442, 4464, 4502, 4512, 4546, 4565, 4591, 4633, 4683, 4709, 4778, 4779, 4781, 4804, 4827, 4863, 4894, 4911, 4968, 4981, 5005, 5034, 5036, 5070, 5086, 5114, 5419, 5428, 5437, 5444, 5461, 5465, 5471, 5510, 5512, 5519, 5526, 5535, 5542, 5543, 5544, 5556, 5559, 5574, 5575, 5584, 5585, 5594, 5603, 5609, 5611, 5612, 5613, 5650, 5651, 5653, 5661, 5668, 5681, 5685, 5687, 5688, 5694, 5701, 5715, 5725, 5730, 5738, 5746, 5752, 5753, 5757, 5759, 5760, 5772, 5844, 5845, 5846, 5847, 5849, 5850, 5853, 5855, 5858, 5862, 5863, 5864, 5870, 5871, 5872, 5874, 5876, 5878, 5879, 5880, 5883, 5885, 5888, 5889, 5891, 6089, 6096, 6097, 6098, 6108, 6113, 6130, 6144, 6153, 6154, 6155, 6159, 6160, 6162, 6164, 6170, 6171, 6174, 6175, 6177, 6178, 6179, 7079, 7082, 7086, 7104, 7113, 7116, 7123, 7124, 7126, 7127, 7128, 7130, 7182, 7183, 7186, 7187, 7304, 7305, 7316, 7327, 7334, 7337, 7346, 7347, 7348, 7363, 7418, 7609, 7611, 7612, 7614, 7619, 7632, 7647, 7654, 7663, 7666, 7669, 7676, 7684, 7688, 7689, 7690, 7704, 7708, 7717, 7718, 7719, 7723, 7758, 7759, 7777, 7784, 7792, 7793, 7798, 7806, 7850, 7851, 7857, 7860, 7872, 7877, 7878, 7881, 7883, 7918, 7919, 7925, 7932, 7933, 7942, 7951, 7966, 7970, 7971, 8023, 8024, 8029, 8031, 8034, 8036, 8037, 8038, 8047, 8061, 8069, 8083, 8095, 8096, 8098, 8100, 8122, 8133, 8139, 8140, 8152, 8164, 8251, 8263, 8271, 8274, 8280, 8305, 8308, 8309, 8310, 8311, 8313, 8316, 8319, 8330, 8332, 8334, 8362, 8437, 8444, 8448, 8449, 8458, 8480, 8481, 8486, 8487, 8566, 8568, 8570, 8579, 8583, 8589, 8595, 8601, 8611, 8616, 8617, 8635, 8646, 8651, 8656, 8666, 8672, 8676, 8682, 8688, 10297, 10298, 10299, 10306, 10308]);
|
|
1787
|
-
var edgeLength = /* @__PURE__ */ new Uint8Array([3, 3, 3, 3, 3, 3, 3, 3, 5, 8, 8, 2, 2, 3, 3, 3, 3, 3, 8, 5, 5, 5, 5, 5, 3, 3, 5, 5, 9, 12, 19, 8, 19, 8, 11, 9, 9, 8, 7, 7, 6, 8, 9, 16, 10, 7, 7, 11, 8, 6, 6, 9, 7, 11, 7, 14, 4, 4, 4, 4, 4, 4, 10, 7, 6, 6, 6, 6, 10, 10, 6, 10, 10, 22, 11, 9, 10, 10, 10, 9, 10, 8, 7, 7, 7, 8, 21, 13, 11, 11, 9, 10, 9, 13, 10, 8, 8, 9, 12, 9, 7, 10, 7, 7, 13, 7, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 6, 3, 3, 3, 3, 3, 3, 2, 5, 3, 3, 3, 7, 2, 2, 2, 2, 2, 2, 3, 3, 3, 1, 1, 7, 8, 5, 2, 2, 7, 2, 2, 1, 4, 1, 11, 9, 9, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 5, 11, 9, 9, 13, 7, 14, 7, 6, 6, 6, 7, 6, 6, 6, 6, 6, 10, 7, 11, 9, 4, 4, 4, 4, 4, 6, 6, 6, 6, 13, 6, 8, 7, 10, 9, 9, 9, 8, 9, 8, 7, 10, 6, 9, 8, 10, 10, 7, 8, 1, 9, 10, 12, 12, 12, 10, 9, 9, 10, 10, 9, 9, 1, 1, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 4, 3, 3, 3, 7, 4, 4, 4, 3, 3, 6, 7, 3, 4, 1, 2, 2, 2, 6, 1, 2, 2, 2, 2, 2, 12, 5, 3, 8, 9, 13, 4, 4, 13, 9, 9, 11, 7, 3, 12, 9, 2, 2, 2, 3, 3, 3, 3, 3, 8, 2, 2, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 7, 10, 15, 7, 15, 15, 20, 15, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 13, 13, 9, 9, 9, 9, 9, 9, 7, 8, 6, 8, 8, 6, 8, 13, 8, 8, 6, 13, 8, 11, 13, 8, 6, 13, 8, 6, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 9, 9, 9, 10, 14, 14, 11, 13, 13, 9, 9, 9, 9, 9, 9, 2, 6, 9, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 2, 3, 3, 3, 3, 3, 3, 7, 7, 2, 3, 2, 2, 5, 3, 3, 3, 3, 3, 3, 4, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 5, 7, 2, 2, 12, 8, 10, 8, 10, 7, 18, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 2, 2, 3, 3, 3, 5, 5, 3, 8, 8, 6, 8, 6, 6, 4, 6, 7, 7, 7, 10, 11, 2, 5, 5, 3, 3, 3, 3, 3, 3, 5, 5, 6, 11, 10, 7, 7, 7, 4, 4, 4, 2, 3, 3, 3, 3, 3, 2, 2, 7, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 11, 7, 6, 9, 6, 6, 8, 10, 8, 6, 8, 13, 4, 4, 4, 4, 4, 10, 8, 11, 8, 8, 8, 10, 10, 7, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 10, 13, 7, 8, 7, 11, 8, 8, 6, 9, 8, 8, 6, 6, 6, 8, 8, 6, 6, 6, 6, 6, 9, 7, 6, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 9, 7, 8, 10, 8, 8, 2, 3, 3, 3, 3, 3, 2, 8, 9, 9, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 9, 2, 2, 3, 3, 3, 3, 3, 3, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 5, 3, 5, 4, 2, 3, 2, 4, 3, 9, 2, 2, 2, 2, 2, 5, 5, 3, 8, 8, 13, 6, 10, 9, 4, 7, 9, 11, 2, 3, 7, 3, 3, 4, 1, 3, 4, 2, 9, 3, 3, 12, 5, 3, 7, 10, 10, 7, 4, 4, 6, 14, 7, 9, 7, 13, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 8, 15, 4, 4, 2, 3, 3, 3, 7, 4, 9, 9, 2, 3, 3, 3, 5, 3, 2, 2, 7, 2, 7, 6, 6, 7, 2, 4, 2, 2, 2, 2, 2, 2, 8, 8, 8, 9, 5, 2, 3, 3, 3, 3, 3, 3, 10, 7, 4, 4, 4, 4, 3, 4, 2, 3, 3, 3, 3, 3, 10, 7, 4, 4, 4, 4, 2, 3, 3, 3, 3, 10, 7, 4, 4, 4, 4, 3, 9, 6, 6, 6, 9, 13, 9, 2, 2, 2, 8, 7, 9, 5, 3, 3, 3, 5, 5, 13, 12, 9, 10, 7, 8, 7, 6, 8, 6, 11, 12, 7, 9, 10, 4, 4, 7, 8, 11, 6, 7, 9, 8, 7, 10, 8, 9, 15, 7, 8, 5, 4, 7, 2, 3, 3, 3, 2, 14, 10, 2, 14, 10, 2, 14, 3, 9, 13, 13, 10, 14, 16, 17, 11, 2, 14, 2, 14, 3, 9, 13, 10, 14, 16, 17, 11, 14, 10, 14, 2, 7, 3, 10, 7, 14, 10, 2, 14, 10, 9, 9, 17, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 10, 10, 10, 12, 9, 4, 10, 10, 11, 8, 8, 8, 7, 9, 5, 3, 3, 3, 3, 3, 3, 3, 3, 5, 8, 4, 4, 4, 4, 4, 4, 6, 16, 3, 3, 14, 3, 14, 2, 14, 9, 13, 10, 10, 14, 16, 17, 11, 6, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 9, 9, 9, 9, 9, 9, 2, 14, 9, 13, 10, 10, 14, 16, 17, 11, 6, 2, 14, 9, 17, 13, 10, 10, 14, 16, 17, 11, 6, 2, 14, 9, 13, 10, 14, 16, 17, 11, 2, 14, 9, 13, 10, 16, 11, 2, 14, 10, 19, 7, 2, 14, 9, 13, 10, 19, 10, 7, 14, 16, 17, 11, 6, 2, 14, 9, 13, 10, 19, 7, 14, 16, 17, 11, 2, 14, 9, 13, 17, 13, 10, 10, 14, 16, 17, 11, 6, 3, 2, 14, 9, 13, 10, 10, 14, 16, 17, 11, 6, 9, 10, 12, 14, 14, 14, 12, 12, 12, 12, 12, 14, 14, 14, 10, 10, 10, 14, 9, 9, 9, 9, 14, 14, 14, 13, 13, 14, 9, 9, 9, 9, 9, 9, 4, 11, 2, 14, 9, 13, 17, 13, 10, 19, 10, 7, 14, 16, 17, 11, 6, 2, 14, 9, 13, 17, 13, 10, 19, 10, 7, 14, 16, 17, 11, 6, 2, 9, 10, 10, 7, 17, 3, 3, 12, 12, 16, 15, 15, 12, 14, 14, 14, 20, 20, 13, 12, 12, 12, 12, 12, 12, 20, 25, 14, 14, 12, 12, 10, 10, 10, 10, 9, 9, 9, 25, 4, 9, 17, 10, 7, 14, 16, 21, 13, 13, 14, 20, 14, 13, 17, 24, 9, 12, 13, 25, 13, 21, 20, 17, 9, 9, 9, 9, 9, 9, 12, 17, 4, 4, 9, 9, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 13, 13, 9, 9, 9, 9, 9, 9, 1, 5, 8, 7, 11, 11, 1, 3, 3, 3, 5, 3, 3, 4, 8, 9, 10, 14, 14, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 13, 13, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 4, 9, 12, 6, 14, 4, 12, 7, 2, 2, 1, 2, 7, 6, 4, 4, 4, 6, 8, 8, 7, 4, 5, 6, 3, 3, 3, 3, 4, 16, 8, 5, 4, 3, 3, 3, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, 12, 7, 7, 13, 9, 10, 17, 12, 8, 9, 7, 8, 5, 12, 10, 13, 14, 5, 5, 5, 13, 5, 5, 5, 3, 3, 3, 5, 16, 5, 5, 5, 5, 7, 12, 14, 8, 12, 8, 10, 12, 9, 11, 7, 9, 7, 10, 7, 13, 9, 7, 12, 8, 17, 7, 7, 16, 10, 13, 13, 8, 10, 10, 14, 17, 7, 16, 16, 15, 8, 10, 10, 12, 17, 17, 7, 17, 14, 7, 10, 17, 8, 7, 7, 7, 8, 15, 15, 7, 14, 10, 10, 10, 11, 11, 7, 7, 13, 8, 10, 7, 16, 7, 8, 7, 14, 17, 12, 10, 11, 21, 8, 9, 7, 13, 9, 8, 13, 6, 12, 7, 6, 13, 10, 10, 10, 8, 18, 9, 17, 13, 10, 12, 6, 13, 6, 11, 8, 13, 10, 13, 18, 13, 11, 13, 8, 16, 7, 10, 8, 16, 12, 10, 8, 8, 14, 11, 8, 15, 8, 8, 7, 7, 12, 7, 8, 9, 14, 15, 8, 9, 10, 9, 15, 7, 8, 8, 12, 13, 9, 10, 15, 13, 7, 10, 10, 20, 7, 6, 9, 6, 6, 14, 11, 14, 11, 12, 9, 10, 16, 16, 12, 7, 11, 28, 8, 11, 10, 7, 21, 8, 7, 9, 4, 4, 4, 17, 7, 8, 6, 9, 6, 6, 13, 6, 6, 6, 6, 18, 20, 14, 8, 11, 12, 9, 10, 13, 15, 15, 19, 8, 9, 12, 7, 10, 16, 12, 9, 9, 9, 14, 12, 11, 9, 12, 11, 18, 9, 9, 9, 10, 7, 7, 16, 8, 9, 7, 13, 12, 10, 14, 18, 7, 8, 11, 7, 7, 8, 8, 13, 7, 7, 7, 11, 15, 13, 11, 7, 8, 15, 11, 7, 8, 18, 14, 13, 18, 15, 10, 12, 12, 9, 7, 11, 11, 8, 7, 10, 8, 14, 12, 10, 18, 7, 10, 9, 7, 8, 13, 10, 14, 10, 8, 8, 23, 7, 7, 11, 12, 12, 17, 7, 7, 11, 11, 17, 16, 16, 7, 8, 11, 14, 14, 8, 10, 7, 7, 16, 16, 13, 9, 11, 9, 15, 15, 11, 11, 7, 7, 14, 7, 9, 7, 7, 16, 10, 13, 10, 11, 14, 7, 11, 10, 11, 7, 11, 10, 11, 15, 11, 15, 10, 12, 10, 14, 13, 11, 11, 12, 13, 10, 7, 13, 10, 16, 12, 21, 9, 10, 10, 7, 11, 14, 17, 7, 7, 8, 11, 12, 8, 15, 14, 14, 8, 17, 12, 10, 10, 7, 9, 11, 7, 10, 7, 11, 18, 7, 11, 7, 12, 11, 8, 8, 14, 12, 7, 8, 15, 3, 7, 7, 5, 2, 9, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 5, 3, 3, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 5, 11, 6, 4, 7, 10, 7, 7, 11, 1, 10, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 7, 3, 5, 6, 3, 3, 5, 2, 2, 5, 3, 4, 13, 11, 3, 3, 6, 3, 5, 14, 2, 2, 3, 8, 2, 2, 12, 5, 18, 5, 3, 3, 3, 16, 5, 5, 5, 10, 7, 13, 12, 13, 9, 12, 14, 19, 9, 9, 21, 9, 9, 10, 6, 9, 6, 15, 10, 6, 12, 8, 6, 10, 15, 4, 4, 6, 6, 9, 9, 12, 16, 14, 23, 7, 7, 7, 14, 9, 7, 7, 11, 14, 10, 7, 10, 10, 10, 12, 6, 11, 10, 13, 11, 15, 11, 7, 12, 10, 3, 7, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 3, 7, 2, 5, 5, 3, 3, 5, 5, 5, 5, 7, 6, 6, 6, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 7, 10, 2, 2, 2, 5, 5, 5, 5, 3, 3, 3, 3, 3, 5, 5, 10, 9, 11, 8, 7, 12, 8, 9, 7, 6, 13, 11, 6, 13, 7, 9, 9, 4, 4, 4, 4, 4, 6, 10, 7, 8, 13, 8, 8, 9, 14, 7, 8, 10, 7, 7, 7, 9, 6, 9, 7, 2, 12, 5, 3, 3, 13, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 1, 7, 6, 4, 12, 3, 3, 3, 3, 3, 8, 7, 3, 3, 3, 3, 3, 3, 4, 4, 11, 14, 2, 8, 3, 5, 5, 8, 10, 8, 6, 4, 7, 17, 7, 4, 5, 2, 6, 3, 2, 2, 12, 5, 5, 3, 15, 13, 8, 11, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 3, 3, 3, 3, 4, 18, 2, 12, 5, 3, 3, 3, 3, 3, 5, 16, 8, 8, 9, 6, 6, 4, 4, 4, 4, 31, 6, 6, 10, 11, 21, 10, 9, 7, 10, 7, 7, 2, 4, 4, 4, 4, 6, 5, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 2, 2, 2, 5, 3, 3, 3, 7, 7, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 8, 2, 3, 3, 3, 3, 3, 5, 9, 11, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 5, 10, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 11, 10, 10, 10, 10, 10, 11, 10, 11, 10, 11, 10, 9, 9, 11, 3, 3, 3, 3, 3, 3, 5, 3, 7, 8, 8, 7, 6, 6, 11, 4, 4, 4, 7, 8, 9, 9, 2, 3, 7, 4, 4, 2, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 2, 2, 5, 5, 5, 5, 5, 3, 3, 5, 5, 5, 7, 7, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 6, 9, 12, 3, 7, 10, 7, 2, 2, 3, 3, 3, 3, 3, 4, 3, 3, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 8, 8, 6, 6, 8, 6, 7, 4, 4, 4, 4, 4, 4, 6, 7, 5, 5, 20, 19, 8, 10, 9, 7, 10, 6, 8, 11, 6, 6, 6, 6, 13, 12, 8, 6, 7, 14, 11, 9, 2, 5, 3, 6, 2, 3, 2, 2, 2, 2, 2, 2, 2, 5, 4, 3, 7, 6, 4, 7, 4, 3, 6, 4, 7, 2, 7, 7, 7, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 9, 10, 10, 11, 7, 8, 20, 7, 8, 9, 8, 12, 6, 6, 6, 8, 9, 8, 12, 6, 6, 8, 13, 10, 12, 6, 6, 7, 7, 9, 6, 4, 4, 4, 4, 4, 4, 10, 6, 6, 6, 7, 14, 11, 10, 7, 8, 10, 8, 11, 14, 11, 11, 9, 7, 9, 8, 11, 9, 17, 10, 9, 2, 2, 2, 9, 3, 3, 3, 3, 15, 14, 9, 5, 5, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 12, 22, 19, 17, 18, 18, 19, 21, 7, 16, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 7, 16, 11, 11, 7, 7, 7, 7, 17, 7, 8, 12, 15, 9, 19, 7, 19, 8, 21, 11, 12, 19, 14, 22, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 16, 19, 24, 12, 7, 14, 7, 12, 7, 8, 10, 10, 13, 7, 12, 12, 7, 7, 10, 18, 15, 12, 16, 7, 14, 12, 17, 10, 16, 17, 12, 17, 25, 7, 7, 7, 13, 6, 9, 6, 9, 18, 6, 6, 11, 20, 10, 6, 6, 6, 6, 6, 6, 17, 6, 6, 6, 15, 6, 6, 6, 6, 6, 8, 14, 11, 12, 11, 15, 13, 19, 17, 21, 7, 18, 8, 13, 13, 8, 12, 8, 6, 6, 13, 6, 15, 15, 16, 6, 6, 16, 6, 6, 6, 14, 6, 18, 6, 6, 6, 17, 18, 9, 13, 15, 8, 19, 8, 15, 15, 18, 14, 16, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 11, 10, 11, 6, 21, 23, 12, 17, 12, 11, 14, 13, 22, 15, 15, 11, 12, 14, 12, 7, 12, 8, 12, 14, 12, 18, 10, 8, 16, 19, 17, 12, 14, 15, 8, 19, 17, 12, 13, 13, 15, 18, 13, 23, 24, 23, 21, 17, 24, 8, 21, 8, 14, 14, 16, 20, 14, 8, 8, 15, 20, 8, 19, 21, 9, 8, 13, 12, 13, 15, 11, 8, 11, 9, 9, 8, 11, 8, 21, 14, 21, 15, 15, 13, 7, 19, 7, 7, 7, 7, 7, 7, 16, 12, 17, 18, 7, 7, 11, 11, 7, 9, 9, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 10, 10, 7, 9, 7, 7, 7, 6, 8, 6, 6, 6, 6, 6, 6, 6, 7, 6, 8, 6, 6, 9, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 8, 9, 8, 7, 8, 7, 8, 10, 7, 5, 5, 5, 5, 5, 5, 3, 9, 7, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 6, 9, 11, 13, 7, 8, 9, 9, 5, 5, 5, 7, 8, 6, 6, 6, 6, 6, 6, 6, 7, 8, 9, 7, 10, 9, 10, 7, 8, 5, 5, 5, 5, 5, 5, 7, 7, 9, 8, 7, 7, 6, 6, 6, 6, 6, 6, 10, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 10, 4, 4, 4, 4, 8, 7, 7, 10, 10, 9, 8, 8, 15, 9, 8, 8, 8, 8, 8, 9, 10, 9, 10, 7, 8, 13, 5, 5, 5, 5, 5, 3, 3, 7, 7, 8, 6, 6, 6, 4, 4, 11, 9, 7, 8, 9, 10, 7, 5, 5, 5, 5, 5, 3, 3, 7, 6, 6, 13, 7, 9, 8, 7, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 7, 8, 7, 8, 13, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 6, 6, 6, 6, 7, 6, 7, 6, 6, 9, 7, 4, 4, 4, 4, 4, 4, 4, 7, 8, 7, 8, 9, 8, 8, 8, 7, 10, 7, 8, 5, 5, 5, 5, 5, 5, 5, 5, 3, 7, 7, 7, 7, 9, 7, 10, 9, 6, 6, 6, 6, 6, 8, 8, 6, 6, 6, 7, 6, 6, 6, 9, 9, 4, 4, 13, 7, 10, 9, 9, 12, 7, 8, 8, 10, 8, 8, 8, 8, 8, 8, 5, 5, 5, 5, 3, 7, 7, 11, 7, 9, 8, 8, 6, 6, 10, 6, 8, 8, 8, 6, 7, 6, 6, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 8, 8, 16, 8, 9, 8, 7, 5, 5, 5, 5, 5, 3, 3, 7, 7, 7, 10, 15, 8, 9, 8, 9, 9, 6, 6, 6, 6, 6, 6, 7, 4, 8, 7, 8, 8, 7, 8, 11, 8, 5, 5, 5, 5, 5, 3, 7, 7, 6, 11, 16, 7, 6, 4, 4, 4, 4, 9, 9, 8, 8, 8, 13, 12, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 7, 8, 8, 9, 13, 7, 7, 7, 9, 8, 8, 9, 12, 7, 12, 7, 12, 8, 7, 10, 12, 9, 9, 6, 6, 8, 8, 6, 6, 6, 6, 6, 6, 6, 9, 8, 9, 11, 8, 6, 6, 6, 6, 6, 12, 7, 6, 6, 6, 9, 7, 7, 6, 6, 6, 6, 6, 11, 9, 6, 6, 6, 6, 6, 7, 9, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 7, 7, 7, 7, 7, 11, 7, 7, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 7, 7, 11, 11, 7, 12, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 13, 12, 8, 8, 8, 8, 7, 7, 7, 9, 5, 5, 5, 5, 5, 5, 5, 3, 3, 7, 7, 11, 7, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 10, 11, 6, 7, 9, 4, 4, 4, 4, 4, 4, 9, 9, 8, 9, 8, 8, 8, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 11, 7, 7, 7, 9, 6, 6, 11, 8, 10, 6, 6, 6, 12, 8, 8, 7, 6, 6, 8, 7, 4, 4, 4, 4, 4, 4, 4, 4, 9, 10, 9, 9, 8, 10, 9, 11, 8, 5, 5, 5, 7, 6, 6, 8, 7, 4, 4, 4, 4, 8, 7, 7, 8, 7, 8, 8, 5, 5, 5, 5, 7, 7, 8, 8, 8, 6, 6, 6, 6, 6, 10, 8, 9, 13, 6, 7, 6, 6, 8, 7, 8, 4, 4, 4, 4, 11, 8, 8, 8, 10, 5, 5, 8, 7, 8, 13, 8, 7, 6, 8, 6, 9, 7, 8, 7, 5, 5, 5, 5, 5, 5, 3, 3, 7, 8, 9, 6, 4, 8, 10, 10, 8, 12, 9, 13, 2, 7, 5, 5, 5, 5, 5, 7, 7, 10, 6, 6, 6, 6, 6, 6, 6, 8, 4, 4, 9, 8, 8, 8, 14, 8, 8, 8, 9, 8, 5, 5, 5, 5, 5, 3, 3, 9, 6, 6, 6, 6, 10, 12, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 11, 8, 7, 8, 8, 8, 5, 5, 3, 3, 3, 3, 7, 7, 6, 8, 6, 8, 11, 7, 6, 6, 6, 7, 4, 8, 11, 9, 10, 5, 5, 5, 3, 3, 3, 7, 7, 8, 9, 8, 15, 9, 6, 6, 6, 6, 6, 6, 11, 11, 4, 4, 4, 4, 4, 7, 9, 9, 10, 8, 7, 5, 5, 5, 5, 5, 5, 3, 3, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 7, 4, 4, 4, 4, 4, 9, 9, 8, 8, 10, 13, 5, 5, 5, 3, 17, 7, 7, 7, 7, 7, 8, 6, 8, 13, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 9, 10, 8, 8, 8, 5, 5, 5, 5, 3, 7, 7, 7, 8, 8, 6, 6, 6, 8, 8, 8, 9, 10, 8, 4, 8, 10, 9, 8, 8, 8, 9, 13, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 7, 8, 9, 9, 7, 7, 7, 10, 9, 9, 8, 9, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 8, 8, 9, 9, 10, 8, 9, 7, 7, 5, 5, 5, 5, 5, 5, 3, 7, 8, 7, 6, 6, 8, 6, 6, 10, 4, 7, 8, 9, 12, 8, 7, 7, 5, 5, 5, 5, 5, 5, 3, 3, 7, 14, 7, 9, 8, 8, 6, 6, 8, 12, 12, 6, 6, 7, 7, 10, 4, 4, 4, 4, 4, 9, 9, 14, 9, 13, 8, 7, 5, 5, 5, 6, 6, 6, 7, 4, 8, 7, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 7, 7, 7, 8, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 4, 4, 9, 9, 8, 8, 11, 7, 7, 7, 5, 5, 5, 3, 9, 8, 6, 6, 7, 4, 4, 4, 4, 4, 4, 8, 8, 11, 5, 5, 5, 7, 7, 7, 9, 6, 6, 6, 6, 6, 6, 9, 8, 4, 4, 4, 4, 7, 12, 9, 8, 8, 8, 7, 10, 10, 5, 5, 5, 5, 5, 5, 5, 3, 11, 14, 8, 7, 8, 8, 6, 6, 6, 6, 6, 8, 7, 6, 6, 6, 7, 6, 8, 9, 4, 4, 4, 7, 8, 9, 7, 9, 7, 7, 9, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 3, 9, 7, 7, 12, 14, 8, 6, 6, 12, 11, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 15, 7, 4, 4, 4, 16, 9, 9, 9, 8, 9, 9, 9, 9, 9, 8, 8, 8, 13, 11, 8, 5, 5, 5, 5, 3, 7, 6, 6, 8, 8, 8, 6, 6, 7, 10, 7, 4, 4, 4, 4, 9, 7, 8, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 7, 7, 7, 9, 6, 6, 6, 6, 6, 8, 8, 7, 7, 9, 6, 6, 6, 7, 6, 6, 6, 6, 6, 15, 4, 4, 4, 4, 4, 8, 8, 7, 8, 12, 9, 8, 8, 8, 8, 8, 9, 8, 8, 10, 8, 8, 8, 8, 16, 9, 10, 2, 5, 5, 5, 5, 5, 5, 5, 9, 7, 6, 8, 9, 4, 4, 4, 4, 4, 7, 8, 8, 8, 9, 8, 11, 10, 5, 5, 5, 5, 3, 7, 8, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 4, 12, 10, 12, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 3, 3, 7, 7, 10, 8, 9, 7, 6, 10, 7, 6, 6, 4, 4, 8, 9, 7, 9, 9, 9, 9, 8, 8, 8, 8, 10, 5, 5, 5, 5, 5, 5, 8, 7, 6, 6, 6, 10, 6, 7, 10, 7, 4, 4, 4, 4, 4, 4, 4, 12, 9, 10, 7, 7, 10, 8, 10, 5, 12, 9, 6, 6, 6, 6, 6, 7, 6, 4, 4, 4, 10, 9, 9, 8, 7, 7, 5, 5, 5, 5, 5, 5, 3, 3, 13, 7, 7, 9, 7, 7, 7, 8, 9, 9, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 13, 9, 15, 15, 4, 4, 4, 4, 4, 10, 10, 9, 8, 9, 8, 8, 9, 7, 8, 7, 8, 5, 5, 7, 6, 6, 6, 4, 4, 4, 7, 8, 11, 8, 5, 5, 5, 5, 5, 5, 5, 7, 6, 6, 6, 6, 6, 6, 9, 11, 10, 7, 4, 4, 4, 9, 8, 8, 5, 5, 5, 5, 5, 9, 9, 6, 6, 6, 6, 6, 6, 6, 9, 9, 4, 4, 4, 4, 8, 8, 8, 9, 9, 8, 8, 8, 13, 2, 4, 2, 7, 5, 5, 5, 5, 5, 5, 9, 9, 6, 6, 6, 6, 10, 8, 8, 8, 6, 6, 6, 4, 4, 9, 8, 10, 8, 9, 8, 8, 8, 9, 8, 8, 5, 3, 3, 3, 11, 6, 6, 6, 7, 6, 6, 6, 4, 4, 9, 8, 5, 5, 5, 5, 5, 3, 11, 8, 6, 6, 6, 6, 6, 9, 7, 4, 4, 14, 10, 9, 8, 12, 8, 8, 8, 11, 15, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 10, 10, 7, 7, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 7, 11, 7, 7, 11, 11, 7, 8, 9, 10, 7, 7, 9, 9, 9, 9, 7, 7, 10, 8, 13, 8, 8, 8, 8, 11, 10, 6, 6, 8, 10, 11, 14, 14, 6, 6, 6, 6, 6, 6, 9, 11, 7, 7, 6, 8, 12, 11, 11, 6, 6, 10, 6, 6, 6, 6, 6, 10, 7, 7, 6, 6, 11, 6, 6, 6, 11, 8, 9, 7, 6, 10, 11, 9, 10, 11, 7, 11, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 6, 6, 8, 9, 10, 9, 6, 6, 6, 10, 6, 6, 6, 6, 11, 10, 11, 10, 9, 8, 7, 7, 7, 7, 11, 14, 8, 10, 9, 9, 8, 8, 7, 11, 8, 8, 8, 11, 11, 10, 10, 9, 10, 8, 11, 10, 8, 11, 9, 12, 8, 10, 8, 11, 8, 9, 9, 11, 11, 10, 11, 13, 8, 7, 8, 8, 9, 7, 8, 8, 8, 8, 7, 8, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 8, 6, 4, 4, 4, 11, 7, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 3, 3, 3, 3, 8, 7, 7, 8, 8, 4, 8, 7, 7, 7, 9, 7, 8, 9, 8, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 3, 3, 3, 3, 3, 3, 4, 5, 5, 3, 3, 8, 8, 6, 9, 4, 4, 10, 7, 3, 3, 3, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 2, 2, 2, 3, 3, 3, 3, 3, 4, 10, 2, 3, 3, 3, 3, 3, 3, 3, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 5, 2, 4, 2, 6, 2, 2, 9, 5, 5, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 9, 8, 7, 9, 6, 6, 11, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 7, 7, 11, 8, 8, 6, 5, 11, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 3, 3, 3, 3, 3, 3, 6, 4, 4, 4, 4, 3, 3, 3, 3, 5, 7, 2, 3, 3, 3, 3, 3, 8, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 4, 4, 4, 4, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 6, 3, 3, 8, 10, 3, 4, 4, 1, 1, 1, 1, 1, 1, 1, 8, 9, 10, 7, 7, 1, 14, 18, 13, 18, 13, 10, 10, 16, 13, 18, 16, 13, 16, 18, 13, 22, 16, 16, 16, 14, 21, 16, 9, 14, 16, 9, 9, 14, 10, 10, 14, 12, 14, 19, 12, 11, 18, 13, 17, 15, 15, 15, 15, 16, 14, 13, 19, 18, 15, 19, 18, 12, 18, 12, 11, 20, 14, 15, 10, 17, 17, 16, 19, 20, 21, 15, 13, 16, 15, 15, 15, 1, 1, 3, 8, 7, 7, 8, 8, 8, 1, 6, 1, 1, 6, 3, 3, 4, 7, 3, 3, 5, 5, 4, 4, 4, 4, 4, 2, 7, 7, 8, 12, 3, 4, 5, 1, 3, 4, 4, 10, 4, 3, 3, 3, 8, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 9, 20, 7, 5, 5, 5, 9, 13, 5, 5, 5, 5, 5, 3, 3, 3, 16, 5, 5, 5, 13, 7, 8, 8, 11, 8, 7, 9, 7, 11, 12, 9, 9, 8, 8, 11, 10, 14, 7, 12, 10, 11, 13, 7, 9, 11, 17, 17, 14, 13, 7, 8, 7, 10, 10, 7, 16, 13, 7, 8, 17, 12, 9, 8, 6, 7, 10, 6, 6, 12, 6, 8, 10, 8, 8, 8, 6, 8, 6, 14, 6, 6, 6, 13, 6, 10, 6, 6, 7, 14, 8, 6, 6, 10, 11, 10, 9, 9, 7, 7, 6, 6, 6, 9, 9, 7, 9, 10, 9, 13, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 8, 6, 8, 9, 10, 9, 7, 10, 10, 8, 7, 8, 7, 10, 12, 9, 8, 15, 8, 7, 8, 8, 7, 7, 15, 13, 7, 10, 9, 14, 18, 16, 7, 24, 7, 8, 10, 11, 16, 8, 14, 7, 9, 9, 9, 13, 19, 14, 15, 14, 11, 7, 13, 9, 10, 7, 13, 9, 10, 11, 12, 8, 9, 2, 3, 5, 8, 7, 4, 4, 15, 10, 5, 3, 3, 3, 3, 3, 5, 4, 4, 4, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 12, 5, 3, 8, 10, 15, 6, 7, 2, 3, 2, 5, 5, 12, 2, 5, 5, 5, 5, 2, 2, 5, 5, 12, 9, 5, 2, 2, 9, 5, 5, 12, 12, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 12, 5, 8, 8, 9, 5, 5, 5, 8, 19, 7, 16, 15, 14, 9, 9, 9, 9, 7, 11, 11, 11, 7, 14, 10, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 12, 9, 9, 12, 12, 12, 15, 7, 11, 7, 14, 11, 18, 13, 8, 18, 15, 18, 12, 14, 12, 8, 8, 8, 8, 9, 9, 9, 12, 7, 10, 10, 8, 8, 12, 12, 12, 7, 12, 12, 9, 7, 7, 7, 7, 7, 8, 15, 12, 9, 10, 10, 7, 10, 10, 13, 11, 10, 9, 22, 11, 9, 8, 8, 8, 8, 8, 13, 18, 13, 9, 15, 19, 9, 7, 7, 10, 7, 7, 7, 11, 8, 13, 17, 7, 7, 10, 10, 10, 7, 20, 16, 7, 7, 7, 7, 7, 7, 11, 21, 12, 12, 13, 11, 14, 16, 8, 8, 13, 11, 7, 7, 13, 7, 7, 14, 15, 15, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 10, 18, 6, 6, 6, 6, 6, 6, 6, 6, 6, 11, 8, 8, 12, 12, 11, 11, 8, 12, 9, 9, 9, 13, 13, 9, 9, 9, 9, 9, 9, 6, 10, 12, 6, 6, 6, 6, 17, 11, 7, 7, 7, 7, 14, 14, 12, 6, 7, 7, 6, 6, 15, 10, 13, 10, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 13, 9, 9, 15, 13, 6, 12, 12, 6, 19, 11, 10, 7, 7, 16, 8, 19, 17, 9, 9, 9, 9, 9, 6, 6, 6, 10, 8, 16, 8, 6, 6, 9, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 14, 6, 6, 6, 6, 20, 6, 9, 6, 14, 9, 9, 9, 6, 9, 8, 8, 12, 9, 8, 8, 8, 8, 7, 8, 12, 7, 8, 8, 8, 6, 8, 6, 6, 6, 6, 6, 6, 6, 9, 8, 8, 6, 6, 13, 9, 12, 13, 12, 14, 13, 12, 11, 11, 6, 8, 8, 8, 6, 13, 12, 11, 11, 12, 6, 11, 12, 11, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 15, 6, 6, 6, 6, 6, 6, 6, 13, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 6, 18, 6, 12, 13, 13, 13, 9, 10, 15, 9, 12, 6, 6, 6, 6, 6, 6, 6, 6, 9, 15, 10, 9, 10, 13, 9, 19, 8, 18, 17, 10, 10, 8, 8, 6, 6, 6, 6, 6, 6, 10, 14, 8, 16, 16, 9, 8, 15, 8, 8, 10, 12, 14, 7, 7, 8, 8, 7, 7, 7, 7, 8, 13, 13, 11, 9, 9, 9, 12, 10, 17, 8, 11, 9, 7, 7, 14, 8, 14, 14, 7, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 10, 10, 8, 14, 7, 7, 7, 7, 8, 8, 8, 8, 8, 17, 9, 7, 15, 7, 8, 12, 7, 9, 14, 7, 7, 7, 9, 13, 8, 14, 7, 16, 18, 13, 15, 14, 12, 13, 10, 15, 9, 7, 7, 7, 10, 13, 15, 15, 9, 9, 9, 9, 19, 11, 7, 11, 11, 13, 8, 8, 8, 8, 7, 12, 19, 17, 9, 9, 13, 7, 7, 7, 9, 7, 7, 7, 12, 13, 15, 10, 8, 8, 14, 15, 12, 13, 13, 8, 12, 14, 7, 11, 7, 14, 15, 13, 12, 8, 8, 8, 8, 11, 13, 15, 15, 8, 13, 12, 8, 8, 8, 13, 10, 16, 14, 11, 8, 8, 12, 12, 9, 15, 15, 12, 12, 13, 8, 8, 9, 12, 13, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, 12, 11, 7, 14, 7, 13, 13, 13, 12, 18, 16, 7, 12, 11, 10, 10, 15, 9, 9, 9, 21, 7, 7, 7, 11, 16, 8, 8, 11, 11, 7, 7, 7, 7, 7, 19, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 8, 9, 12, 14, 11, 9, 9, 9, 22, 12, 3, 3, 4, 8, 8, 15, 4, 2, 2, 5, 5, 3, 3, 3, 3, 3, 3, 6, 6, 4, 4, 4, 12, 7, 10, 2, 3, 3, 3, 3, 3, 3, 3, 6, 7, 3, 7, 5, 14, 4, 4, 7, 8, 10, 4, 1, 3, 3, 6, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 2, 2, 5, 3, 4, 2, 2, 2, 2, 2, 2, 11, 5, 5, 5, 11, 5, 5, 3, 5, 5, 5, 5, 11, 14, 13, 9, 11, 9, 12, 8, 11, 11, 8, 11, 16, 9, 9, 7, 10, 9, 12, 8, 15, 6, 7, 6, 6, 13, 10, 8, 11, 8, 6, 6, 6, 12, 16, 6, 11, 7, 8, 9, 18, 6, 6, 9, 4, 4, 6, 13, 6, 6, 6, 6, 8, 8, 9, 16, 7, 7, 14, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 15, 13, 7, 10, 7, 7, 10, 12, 16, 15, 7, 9, 9, 14, 11, 11, 10, 9, 10, 8, 12, 7, 8, 7, 7, 10, 12, 7, 12, 8, 7, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 3, 5, 5, 5, 10, 4, 8, 7, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 7, 4, 5, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 8, 2, 2, 2, 8, 12, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 7, 11, 9, 8, 8, 8, 7, 8, 9, 7, 7, 9, 7, 7, 7, 10, 7, 7, 10, 9, 10, 6, 6, 6, 6, 6, 6, 15, 7, 8, 9, 9, 8, 6, 6, 10, 9, 6, 8, 13, 9, 7, 6, 6, 6, 6, 6, 6, 12, 6, 6, 7, 6, 7, 6, 6, 6, 10, 10, 7, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 14, 6, 6, 7, 7, 9, 6, 6, 6, 6, 9, 9, 8, 9, 10, 9, 8, 9, 12, 7, 7, 7, 8, 7, 10, 12, 11, 9, 10, 7, 7, 7, 9, 10, 10, 8, 12, 9, 7, 7, 9, 8, 8, 8, 10, 7, 7, 8, 9, 9, 7, 7, 7, 8, 2, 4, 6, 3, 4, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 5, 8, 6, 4, 7, 3, 3, 3, 3, 3, 3, 3, 12, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 5, 3, 4, 7, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 6, 4, 3, 4, 2, 2, 2, 5, 3, 3, 3, 3, 3, 5, 4, 4, 4, 4, 7, 6, 8, 9, 2, 2, 2, 2, 3, 3, 3, 5, 7, 2, 3, 3, 8, 7, 7, 2, 2, 8, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 8, 8, 7, 7, 6, 10, 6, 9, 7, 11, 4, 6, 8, 8, 7, 8, 4, 5, 5, 5, 5, 3, 3, 11, 8, 9, 6, 6, 8, 7, 4, 4, 7, 8, 7, 2, 2, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 7, 2, 2, 5, 3, 3, 2, 3, 3, 3, 3, 3, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 12, 5, 5, 3, 3, 3, 5, 10, 12, 6, 15, 4, 6, 6, 7, 14, 9, 3, 3, 3, 3, 3, 8, 2, 2, 3, 5, 5, 3, 3, 3, 3, 3, 3, 8, 8, 8, 7, 5, 8, 4, 6, 11, 2, 2, 6, 7, 3, 3, 2, 9, 8, 5, 5, 3, 3, 3, 5, 5, 7, 7, 6, 6, 10, 6, 8, 6, 8, 9, 7, 4, 4, 4, 4, 7, 6, 6, 7, 7, 10, 9, 8, 11, 8, 3, 3, 3, 3, 3, 4, 4, 2, 3, 3, 3, 3, 3, 7, 6, 2, 5, 6, 7, 6, 4, 8, 9, 11, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 5, 3, 3, 3, 3, 3, 9, 9, 6, 4, 8, 7, 7, 5, 9, 8, 6, 2, 8, 7, 8, 5, 5, 5, 5, 5, 3, 3, 3, 16, 8, 7, 7, 7, 8, 7, 7, 7, 7, 9, 6, 9, 6, 10, 7, 7, 7, 6, 10, 8, 9, 11, 11, 8, 4, 4, 10, 8, 8, 6, 9, 6, 11, 8, 8, 8, 15, 7, 8, 9, 5, 3, 3, 3, 3, 3, 5, 11, 2, 2, 3, 8, 9, 10, 3, 2, 2, 2, 2, 2, 2, 3, 6, 4, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 3, 3, 3, 3, 3, 3, 11, 5, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 4, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 12, 7, 4, 12, 4, 6, 5, 4, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 11, 10, 6, 4, 6, 10, 8, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 5, 3, 4, 4, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 7, 8, 8, 7, 13, 12, 10, 10, 8, 8, 7, 7, 9, 12, 11, 6, 6, 8, 8, 9, 7, 7, 7, 10, 15, 10, 4, 4, 4, 4, 4, 11, 8, 8, 9, 7, 9, 14, 14, 12, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 12, 5, 5, 5, 11, 10, 7, 9, 3, 8, 7, 3, 15, 13, 11, 4, 4, 2, 2, 2, 19, 7, 5, 5, 3, 3, 3, 3, 3, 3, 3, 5, 22, 18, 6, 14, 17, 4, 4, 19, 16, 18, 2, 3, 3, 7, 2, 3, 2, 3, 3, 6, 4, 2, 3, 3, 2, 5, 3, 3, 3, 3, 3, 3, 3, 9, 9, 2, 3, 2, 2, 2, 3, 3, 3, 5, 7, 14, 7, 7, 12, 9, 13, 6, 11, 6, 10, 9, 7, 7, 8, 12, 12, 8, 8, 8, 10, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 5, 8, 10, 7, 8, 11, 8, 12, 9, 4, 14, 7, 7, 9, 13, 2, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 1, 2, 2, 3, 3, 3, 3, 3, 3, 5, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 4, 4, 4, 3, 2, 3, 3, 3, 3, 5, 2, 2, 2, 2, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 12, 9, 8, 8, 9, 8, 6, 17, 6, 6, 6, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 4, 4, 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 7, 8, 8, 8, 10, 7, 13, 10, 8, 9, 3, 3, 5, 13, 3, 3, 3, 3, 3, 7, 7, 6, 6, 10, 13, 11, 11, 8, 8, 9, 8, 9, 9, 10, 10, 10, 11, 10, 10, 13, 13, 16, 15, 11, 12, 9, 9, 10, 9, 11, 10, 9, 9, 14, 7, 8, 3, 10, 7, 7, 3, 2, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 11, 6, 7, 4, 6, 2, 2, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 6, 4, 4, 2, 2, 2, 3, 3, 3, 3, 4, 4, 6, 6, 6, 6, 5, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 11, 6, 10, 9, 12, 7, 7, 11, 14, 9, 7, 12, 3, 3, 7, 12, 11, 12, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 5, 5, 5, 5, 5, 5, 5, 5, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 10, 3, 3, 3, 11, 3, 5, 9, 11, 8, 12, 14, 9, 7, 8, 7, 7, 11, 11, 7, 7, 10, 9, 8, 10, 9, 7, 7, 7, 7, 7, 7, 8, 8, 7, 11, 8, 8, 8, 7, 7, 10, 8, 7, 13, 12, 7, 17, 10, 8, 8, 11, 7, 11, 11, 14, 7, 11, 7, 8, 6, 9, 20, 8, 7, 9, 16, 7, 10, 6, 11, 10, 8, 9, 7, 16, 11, 11, 9, 8, 9, 8, 8, 8, 11, 8, 15, 8, 8, 9, 7, 8, 8, 11, 10, 7, 5, 7, 10, 10, 15, 7, 7, 7, 8, 7, 8, 8, 10, 11, 10, 10, 10, 11, 11, 7, 8, 6, 8, 8, 8, 10, 6, 8, 6, 6, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 16, 6, 15, 6, 7, 11, 11, 7, 9, 10, 11, 13, 10, 6, 16, 8, 10, 12, 11, 6, 6, 6, 6, 6, 6, 6, 10, 6, 10, 7, 7, 7, 7, 11, 7, 11, 6, 6, 6, 6, 6, 6, 17, 7, 7, 6, 6, 12, 22, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 7, 6, 6, 5, 6, 6, 8, 11, 6, 9, 14, 11, 9, 11, 7, 7, 8, 6, 6, 6, 8, 10, 9, 6, 6, 6, 6, 9, 7, 6, 6, 6, 6, 6, 15, 6, 4, 4, 4, 6, 4, 17, 8, 11, 6, 6, 9, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 10, 6, 10, 6, 6, 6, 6, 12, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 6, 6, 6, 18, 6, 6, 6, 8, 9, 10, 7, 8, 9, 10, 11, 7, 13, 6, 8, 8, 6, 6, 14, 7, 7, 7, 7, 10, 7, 14, 9, 6, 6, 9, 15, 9, 7, 14, 6, 11, 14, 13, 7, 12, 8, 7, 7, 7, 7, 7, 12, 7, 10, 9, 16, 6, 8, 6, 5, 17, 6, 8, 10, 4, 6, 4, 10, 15, 17, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 11, 7, 4, 4, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 19, 17, 6, 10, 11, 6, 6, 6, 6, 18, 6, 6, 11, 4, 4, 4, 5, 6, 6, 6, 9, 5, 6, 4, 6, 6, 4, 6, 6, 6, 6, 10, 6, 6, 4, 6, 6, 10, 6, 10, 6, 6, 6, 6, 11, 6, 6, 10, 6, 6, 8, 6, 6, 6, 8, 6, 11, 4, 11, 9, 10, 9, 11, 4, 8, 4, 11, 12, 7, 9, 8, 6, 7, 7, 8, 12, 12, 11, 13, 10, 11, 7, 7, 7, 9, 7, 11, 10, 7, 7, 7, 16, 11, 10, 11, 17, 9, 9, 8, 8, 7, 7, 7, 9, 7, 7, 7, 14, 7, 13, 9, 11, 10, 14, 10, 10, 12, 11, 10, 7, 10, 5, 14, 8, 8, 8, 9, 7, 8, 7, 7, 9, 8, 7, 8, 7, 7, 7, 7, 7, 7, 7, 11, 8, 10, 8, 7, 8, 14, 11, 8, 9, 9, 9, 8, 24, 10, 10, 12, 7, 7, 15, 11, 8, 8, 12, 11, 8, 9, 9, 7, 8, 9, 10, 11, 10, 11, 7, 12, 7, 7, 11, 9, 8, 14, 13, 12, 8, 11, 10, 8, 8, 7, 7, 14, 9, 10, 8, 9, 11, 7, 14, 8, 8, 13, 8, 8, 12, 7, 10, 14, 14, 11, 9, 10, 9, 9, 7, 7, 11, 11, 13, 9, 13, 5, 5, 5, 7, 9, 5, 11, 12, 14, 8, 7, 7, 11, 10, 9, 7, 8, 8, 7, 10, 11, 11, 5, 5, 7, 5, 5, 5, 7, 7, 15, 7, 7, 8, 7, 15, 12, 12, 10, 7, 8, 7, 11, 7, 7, 7, 23, 11, 8, 8, 11, 10, 7, 8, 11, 7, 19, 7, 7, 6, 9, 9, 9, 11, 3, 4, 7, 8, 6, 6, 4, 10, 8, 2, 2]);
|
|
1788
|
-
var edgeChild = /* @__PURE__ */ new Uint16Array([0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 1, 1, 1, 17, 1, 1, 1, 12, 1, 12, 1, 12, 13, 1, 1, 1, 1, 12, 1, 12, 1, 1, 1, 1, 1, 14, 21, 1, 1, 1, 1, 1, 1, 1, 19, 12, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 16, 18, 1, 1, 15, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 22, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 12, 12, 12, 12, 1, 32, 0, 0, 0, 1, 1, 1, 1, 35, 34, 1, 1, 1, 1, 1, 33, 1, 1, 1, 1, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 12, 1, 1, 12, 1, 1, 1, 1, 43, 44, 44, 44, 43, 44, 43, 43, 45, 44, 43, 44, 43, 43, 43, 43, 43, 43, 45, 43, 43, 43, 43, 43, 43, 44, 46, 46, 44, 43, 43, 43, 43, 43, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 49, 51, 49, 49, 49, 51, 49, 50, 49, 52, 49, 50, 50, 49, 49, 49, 50, 52, 50, 52, 49, 50, 50, 12, 54, 54, 53, 55, 50, 52, 49, 49, 47, 48, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 59, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 66, 1, 12, 1, 1, 65, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 12, 1, 1, 1, 1, 88, 1, 90, 1, 1, 1, 1, 1, 1, 1, 1, 93, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 96, 96, 1, 1, 12, 1, 99, 1, 1, 1, 1, 1, 1, 1, 97, 1, 98, 1, 100, 1, 1, 1, 1, 1, 101, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 109, 110, 1, 1, 1, 1, 1, 1, 112, 112, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 120, 121, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 121, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 121, 1, 1, 1, 1, 1, 1, 1, 1, 1, 125, 122, 124, 119, 1, 123, 1, 1, 113, 1, 1, 1, 1, 116, 1, 126, 1, 1, 1, 1, 1, 1, 118, 1, 107, 1, 108, 1, 12, 127, 105, 1, 111, 1, 1, 1, 1, 1, 106, 114, 1, 12, 12, 12, 117, 115, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 12, 12, 1, 1, 1, 1, 1, 12, 133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 135, 1, 1, 1, 1, 1, 1, 1, 1, 136, 137, 12, 12, 134, 132, 44, 44, 139, 49, 49, 138, 141, 140, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 1, 0, 143, 131, 1, 0, 1, 1, 12, 12, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 147, 146, 20, 1, 1, 12, 12, 1, 20, 12, 12, 1, 1, 1, 1, 1, 133, 1, 1, 151, 1, 1, 1, 1, 152, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 1, 135, 1, 1, 151, 1, 1, 1, 1, 152, 1, 1, 133, 1, 1, 1, 151, 1, 1, 1, 1, 152, 1, 1, 133, 1, 1, 1, 1, 1, 1, 1, 1, 133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 159, 1, 1, 1, 151, 1, 1, 1, 1, 1, 152, 1, 1, 159, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 133, 1, 1, 1, 1, 151, 1, 1, 1, 1, 152, 1, 1, 1, 133, 1, 1, 151, 1, 1, 1, 1, 163, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 166, 1, 1, 159, 1, 1, 1, 1, 1, 151, 1, 1, 1, 1, 1, 152, 1, 1, 159, 1, 1, 1, 1, 1, 151, 1, 1, 1, 1, 1, 152, 1, 153, 157, 157, 12, 1, 12, 165, 1, 1, 1, 1, 1, 157, 157, 157, 153, 1, 1, 1, 156, 157, 160, 164, 1, 1, 1, 1, 156, 156, 1, 1, 155, 153, 153, 156, 169, 155, 169, 1, 1, 167, 1, 155, 154, 156, 1, 1, 1, 1, 156, 1, 158, 1, 1, 1, 12, 1, 161, 1, 161, 1, 1, 1, 161, 160, 162, 168, 155, 153, 1, 1, 1, 1, 1, 1, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 171, 172, 171, 171, 171, 171, 173, 173, 171, 172, 171, 172, 171, 171, 12, 1, 12, 12, 12, 12, 1, 12, 12, 12, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 195, 1, 1, 1, 1, 12, 201, 202, 203, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 150, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 198, 1, 1, 1, 185, 1, 1, 1, 1, 209, 1, 1, 206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 176, 192, 1, 1, 1, 188, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 183, 1, 1, 1, 1, 1, 1, 1, 193, 1, 1, 1, 1, 197, 1, 1, 1, 1, 170, 1, 1, 191, 1, 1, 1, 194, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 181, 1, 12, 1, 1, 12, 1, 1, 1, 1, 184, 1, 1, 1, 190, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 210, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 196, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 175, 12, 1, 1, 1, 178, 12, 1, 1, 1, 1, 1, 1, 1, 200, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 177, 1, 1, 1, 1, 1, 1, 1, 205, 1, 1, 1, 182, 1, 1, 1, 189, 1, 12, 1, 186, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 193, 1, 1, 1, 1, 180, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 174, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 187, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 207, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 208, 1, 1, 12, 1, 1, 1, 1, 179, 1, 1, 1, 187, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 199, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 204, 1, 1, 12, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 220, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 1, 225, 1, 1, 1, 0, 226, 223, 224, 1, 1, 1, 1, 1, 1, 231, 1, 233, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 229, 1, 1, 1, 1, 1, 235, 1, 1, 12, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 234, 1, 1, 1, 12, 1, 1, 1, 1, 230, 1, 1, 1, 228, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 232, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 241, 13, 1, 1, 1, 12, 12, 238, 239, 1, 1, 1, 1, 240, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 242, 1, 1, 12, 16, 1, 1, 1, 1, 1, 1, 243, 1, 1, 1, 12, 12, 1, 1, 1, 1, 1, 1, 243, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 256, 256, 1, 0, 0, 0, 0, 0, 1, 12, 0, 0, 0, 0, 0, 0, 0, 0, 171, 261, 262, 1, 12, 1, 1, 1, 1, 12, 264, 1, 1, 263, 1, 1, 266, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 270, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 12, 0, 281, 0, 0, 282, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 59, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 324, 324, 325, 324, 0, 187, 1, 1, 13, 320, 1, 318, 0, 0, 0, 0, 0, 0, 0, 321, 1, 1, 326, 1, 206, 1, 1, 1, 1, 319, 1, 316, 1, 322, 1, 314, 1, 323, 1, 315, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 12, 317, 317, 1, 1, 1, 185, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 12, 1, 1, 1, 1, 313, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 329, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 266, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 369, 369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 337, 348, 1, 1, 336, 371, 1, 342, 1, 1, 334, 366, 1, 1, 352, 333, 338, 1, 1, 1, 345, 376, 354, 1, 1, 1, 1, 1, 1, 355, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 364, 368, 0, 0, 78, 1, 1, 0, 362, 339, 375, 340, 343, 350, 1, 365, 0, 1, 0, 78, 359, 357, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 378, 1, 1, 349, 1, 78, 1, 0, 1, 1, 1, 381, 1, 0, 0, 78, 356, 0, 1, 335, 1, 1, 1, 0, 1, 1, 358, 1, 0, 1, 1, 1, 0, 1, 383, 346, 1, 1, 0, 1, 0, 0, 374, 0, 1, 1, 1, 78, 367, 1, 1, 363, 360, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 341, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 373, 0, 78, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 377, 1, 1, 1, 0, 0, 380, 0, 0, 0, 1, 353, 1, 0, 78, 379, 1, 0, 0, 0, 0, 382, 1, 1, 0, 0, 1, 0, 1, 0, 351, 0, 347, 0, 1, 1, 1, 0, 1, 1, 0, 370, 344, 372, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 12, 1, 1, 1, 12, 398, 398, 1, 1, 12, 12, 1, 398, 1, 1, 12, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 410, 1, 1, 0, 1, 1, 1, 1, 206, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 428, 428, 1, 1, 0, 0, 314, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 441, 1, 440, 1, 1, 1, 1, 1, 1, 1, 1, 1, 445, 1, 12, 12, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 453, 1, 1, 1, 455, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 452, 1, 447, 1, 1, 1, 1, 434, 1, 1, 1, 1, 1, 1, 1, 1, 448, 12, 1, 1, 1, 1, 454, 1, 1, 1, 449, 443, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 314, 1, 431, 1, 1, 12, 451, 1, 1, 314, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 436, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 454, 1, 1, 1, 1, 314, 1, 450, 1, 1, 1, 444, 438, 1, 1, 1, 1, 1, 439, 1, 456, 442, 1, 1, 1, 1, 1, 437, 1, 1, 1, 1, 1, 1, 1, 1, 1, 432, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 446, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 435, 1, 1, 1, 1, 1, 433, 1, 220, 457, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 12, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 463, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 12, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 467, 467, 467, 467, 467, 467, 467, 0, 467, 467, 467, 467, 467, 1, 467, 467, 467, 0, 467, 467, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, 471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, 0, 0, 479, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 489, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 200, 200, 1, 493, 1, 1, 1, 492, 1, 1, 1, 1, 488, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 490, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 494, 1, 1, 491, 1, 1, 1, 1, 1, 1, 1, 1, 369, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 495, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 12, 1, 508, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 59, 1, 1, 12, 12, 12, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 527, 1, 1, 1, 1, 1, 1, 1, 528, 1, 1, 1, 1, 1, 1, 1, 526, 1, 1, 12, 1, 1, 530, 239, 1, 1, 12, 12, 1, 1, 12, 1, 12, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 540, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 131, 1, 12, 545, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 106, 1, 1, 12, 1, 1, 1, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 550, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 143, 1, 1, 1, 228, 1, 1, 12, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 575, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 220, 1, 325, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 580, 1, 1, 1, 1, 0, 582, 0, 78, 0, 581, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 12, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 584, 584, 0, 588, 586, 584, 584, 584, 584, 584, 590, 584, 584, 594, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 591, 588, 584, 584, 588, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 586, 584, 584, 584, 584, 584, 592, 584, 584, 584, 584, 584, 584, 0, 0, 0, 1, 593, 1, 1, 1, 1, 587, 1, 1, 1, 1, 1, 585, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 598, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 12, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 64, 278, 304, 409, 536, 0, 4, 67, 236, 254, 280, 305, 331, 385, 411, 0, 500, 520, 537, 600, 9, 0, 60, 87, 395, 407, 427, 578, 0, 498, 519, 533, 615, 0, 30, 6, 0, 462, 501, 605, 563, 69, 0, 7, 283, 255, 386, 464, 414, 539, 78, 601, 0, 579, 307, 416, 466, 9, 104, 286, 507, 6, 30, 0, 309, 78, 388, 78, 484, 10, 6, 130, 248, 273, 0, 616, 510, 0, 566, 0, 63, 6, 6, 251, 94, 2, 430, 396, 408, 599, 0, 6, 0, 6, 284, 102, 6, 564, 502, 541, 0, 465, 387, 271, 285, 8, 70, 103, 602, 544, 389, 310, 298, 417, 145, 73, 288, 548, 511, 604, 567, 332, 327, 480, 6, 74, 148, 11, 0, 249, 523, 549, 568, 515, 553, 573, 614, 36, 6, 260, 293, 330, 302, 218, 30, 529, 556, 218, 41, 216, 265, 294, 303, 404, 421, 482, 272, 0, 72, 565, 0, 401, 415, 297, 78, 247, 78, 0, 583, 547, 505, 290, 419, 78, 390, 384, 0, 0, 0, 9, 558, 574, 217, 0, 422, 405, 532, 517, 576, 618, 84, 218, 42, 295, 393, 423, 572, 0, 512, 291, 274, 78, 215, 79, 28, 387, 30, 6, 391, 328, 301, 607, 595, 525, 552, 514, 0, 258, 80, 30, 403, 420, 0, 30, 424, 0, 219, 596, 518, 9, 406, 425, 218, 248, 85, 222, 597, 577, 560, 483, 426, 394, 250, 227, 86, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 128, 0, 0, 83, 551, 0, 0, 0, 0, 0, 0, 0, 27, 0, 554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, 504, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 0, 620, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 0, 0, 0, 485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, 279, 0, 0, 0, 0, 0, 531, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 458, 0, 0, 0, 312, 0, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 571, 0, 0, 0, 0, 603, 522, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 460, 0, 0, 481, 0, 0, 0, 0, 0, 61, 0, 0, 0, 267, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 277, 613, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 0, 276, 0, 0, 0, 0, 0, 0, 570, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 503, 0, 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 487, 0, 486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 538, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 609, 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 521, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 499, 0, 617, 0, 0, 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 546, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 29, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 214, 0, 0, 0, 0, 0, 0, 561, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 412, 418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, 0, 311, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 535, 0, 0, 0, 413, 0, 0, 399, 0, 0, 0, 0, 0, 0, 606, 0, 0, 0, 542, 0, 0, 89, 0, 543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 509, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 621, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 626, 626, 626, 626, 626, 626, 626, 625, 627]);
|
|
1789
|
-
var labelText = "orgmilcomschnetedugovdrrformsfeedbackofficialaccoorgmilschnetgovmagazinemediaunioncargopilotgroupcaarespressworksaerodromeworkinggroupair-traffic-controlaircraftaccident-preventioneducatormarketplaceambulanceinsurancecateringairportrepbodyenginesoftwaremodellingair-surveillanceconsultingchartertrainermaintenanceservicesdesignflightskydivingfreightassociationstudentgroundhandlingdgcafuelclubtaxicrewshowballooningexpresstraderbrokerauthoragentsairtrafficjournalistsafetyconsultantmicrolightaccident-investigationparachutingequipmentproductionfederationrecreationscientistnavigationengineertradingglidingleasingresearchpassenger-associationentertainmentparaglidinghangglidingaerobaticrotorcraftemergencycertificationgovernmentaeroclubexchangelogisticschampionshiphomebuiltcouncilconferencecontrolairlinecivilaviationjournalorgcomnetedugovcoorgcomnomnetobjofforgcomnetuwukiloappsframerorgmilcomnetedugovcoradioorgcomnetcommuneedogpbcoitgvorgedugov*spreviewfrontendrelayononstagingupid*mtls*privatelinktypedreamdeveloperbravemochawindsurfaivenmirenupsunwnextbegetngrokclerkwale2bwebcsbrunputerflutterflowspawnbaseshiptodaymagicpatternsnetlifyondigitaloceanrailwayhostedclaudehasurabotdashvercelgithubluyanigadgetreplitcloudflaretelebitedgecomputeevervaultexponyatnoopencrpplxzeaburwasmerframerzeropsrocketpreviewconvexmedusajsspritesonherculeseasypanelstreamlitsnowflakemesserliloginlinehackclubcodepennorthflankbase44corespeedleapcellngrok-freeclerkstagelovableon-fleek*us-west-3ap-south-2us-central-2us-central-1eu-central-1ap-south-1us-west-2us-east-2eu-north-1ap-north-1us-west-1us-east-1*rcloudintsegorgmilcomgobbetnetintedugovturmusicasenasamutualcoopip6uriurnin-addre164homeirisgovdixdaemoncloudnssthwien*inexexkunden4accogvormymyspreadshop4lima2ixortsinfofuturecmsfuturehosting12hpprivfuturemailinglima-cityfunkfeuer123webseitednshomemelmyspreadshopcloudletswasantqldvicactnswtascatholicwasaqldvictasidwasantozqldorgcomvicasnactnetedugovnswtasconfcomairflowlambda-urltransfer-webappairflowtransfer-webapptransfer-webapptransfer-webapp-fipstransfer-webappeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1privatenotebookstudiolabelingnotebookstudionotebooknotebook-fipslabelingnotebookstudionotebook-fipsnotebookstudio-fipsnotebook-fipsnotebookstudionotebook-fipsnotebookstudioeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2experimentsus-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1onrepostsagemakercopporgmilcompronetintedugovbiznameinfoshoprsorgmilcomnetedugovbrendlyresolvenzauscotvstoreorgcomnetedugovbizinfoidacaicoittvorgmilcomschnetedugovinfocloudezproxyacmymyspreadshopkuleuvenwebhostingtransurl123websitecloudnsinterhostsolutionsddns5476103298edgfacbmlonihkjutwvqpsryxzbarsycoororgcomedumyftpno-iporxcloud-ipfor-somemmafanfor-morewebhopselfipjozidyndnscloudnsdscloudfor-thefor-betteractivetrailcoeconorestooteorgcomeconeteduassurmoneyafricaarchitectesrestaurantloisirstourismavocatsinfoagrounivcoorgcomnetedugoviatvdeportesaludtksatorgmilcomwebgobnetinteducienciaboliviarevistacooperativaempresanombreindustriamusicapatriamedicinademocraciapoliticapuebloindigenaplurinacionalarteblogwikiinfoagrotransportenoticiasprofesionalacademiaeconomiaecologiamovimientotecnologianaturalsimplesitecepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesmscepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesms*biaamfmtcmptvfeirasampajampanatalbelemananiradiog12medindfndbmdtrdthepoaggfjdfdefinfenflegsegongengcngorgzlgslglogppgmillelqslcimcomnomadmjabimbbibbsbabcrectecsjcetcpscpvhudieticriapipsiecnbiorioecogeoteoodoproatoartfstmatvetdetbetnetcntnotfotgrueduajuespappreptmpemparqsrvadvdevgovntrturagrjorfarjusmusdesvixxyzcozfozslzbhzmaringasantamariacampinagrandegoianiasorocabafloripasaobernardocuritibaboavistarecifeaparecidasaogoncasalvadorcuiabamorenamacapalondrinacontagemsocialfortalmaceioleilaoosascoriobranconiteroi9guacutcheblogflogvlogwikitaxicoopmanauspalmascaxiasjoinvillebaruericampinassantoandreribeiraoriopretoweorgcomnetedugovv0windsurfshiptodaycloudsitecoaccoorgnetgovofmilcomgovmediatechzacoorgcomnetedugsjgovmydnspenfnlabnbmbgcbcqconcontnuyksknsmyspreadshopno-ipawdevboxbarsyonidatemfuinabusavinstanceseceuguukussryzespawncsxcloud-ipmyphotosfantasyleaguetwmailcleverappsscrappingccwucloudnsftpaccessgame-serverccgovobjectsrmalpgcust*svcalp1aeappenginermalpgmyspreadshop4lima2ixsquare7cloudscale123websitefirenet12hpflowgotdnslinkyard-cloudcloudnslima-citydnskingobjectstorageedaccogoorusorgcomnetintedua\xE9roportxn--aroport-byaassogouvcomilgobgovcloudnses-1eu-west-1us-east-1euvipit1eurarubait1s3lbwebsites3websiteru-spbru-mskelasticcsrunstnukukcaukusnl-ams-1fr-par-1fr-par-2functionsnodess3ddlwhmrdbfnck8sifrs3-websitecockpitscblmgdbdtwhkafkpubprivs3ddlwhmrdbk8sifrs3-websitecockpitscblmgdbdtwhkafks3ddlrdbk8sifrs3-websitecockpitscblmgdbdtwhkafkk8sscalebookpl-wawfr-parnl-amsbaremetalsmartlabelinginstancesdechk2kuleuvenlaravelvoorloperurownoxazapscwhstgrvaporonline-serverobservablehqelementorantagonistreclaimjoteluluencowaydiademjelasticmatlabmagentositetrendhostingaxarnetperspectajenv-arubajelejoteravendbemergenttrafficplexconvexkeliwebserveboltbegetcdnstaticson-rancherprimetelonstackitunison-servicesdnshomelinkyardbarsyjelecloudnscocomnetgovmycn-northwest-1cn-north-1s3s3-accesspoints3-websites3s3-accesspointrdsdualstacks3-deprecatedemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspoints3s3-accesspointrdsdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicn-northwest-1cn-north-1cn-northwest-1ebcomputeelbcn-north-1airflowcn-northwest-1cn-north-1oncn-northwest-1cn-north-1amazonawssagemakeramazonwebservicesdirectasgdsdhehahljlnmhbacscahqhshhihnlnynsnmofjbjzjxjtjhkcqtwgsjssxnxjxgxxzgz\u7DB2\u7D61\u7F51\u7EDC\u516C\u53F8orgmilcomnetedugovxn--55qx5dcanva-appsxn--io0a7iquickconnectcanvasitekhsjxn--od0algcanva-codemyqnapcloudsrvrlessclustersrealtimestorageleadpagescarrdcrdorgmilcomnomnetedugovhidnssupabaserdpareplmypiumsoxmitotaplpagesfirewalledreplitowodevwebview-assetsvfswebview-assetss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecateds3-websites3-object-lambdaexecute-apis3s3-accesspoints3-websites3-accesspoint-fipss3-fipss3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9vfss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1us-northeast-1ap-southeast-1me-south-1af-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1mrapaccesspoints3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3eu-west-3ap-south-2eu-south-2computes3-ap-northeast-2elbrdss3-ap-east-1s3-sa-east-1s3-us-gov-west-1s3-eu-central-1s3-ca-central-1eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3s3-website-us-west-2s3-website-eu-west-1s3-external-1eu-central-1me-central-1ca-central-1il-central-1s3-us-west-1s3-eu-west-1s3-website-sa-east-1s3-website-ap-southeast-2ap-northeast-1ap-southeast-1s3-us-west-2s3-eu-west-2me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2s3-website-ap-southeast-1s3-1s3-globals3-ap-northeast-3eu-north-1airflowap-southeast-2s3-us-gov-east-1s3-fips-us-gov-east-1s3-me-south-1s3-ap-south-1ap-northeast-2s3-website-us-west-1ap-southeast-5s3-eu-north-1s3-ap-southeast-1s3-website-us-gov-west-1compute-1s3-eu-west-3us-gov-west-1s3-website-ap-northeast-1us-gov-east-1s3-fips-us-gov-west-1s3-website-us-east-1s3-ap-southeast-2ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3-us-east-2s3-ap-northeast-1authauthauth-fipsauth-fipseu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1rframeservicesbuilderstg-builderdev-builder*ociocpocsazuregcpawsdemoinstanceeu-west-3eu-south-2ap-southeast-3ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1previeweu-4us-4us-1eu-1us-2eu-2us-3eu-3appscomputepaasrag-cloudrag-cloud-chjcloudjcloud-ver-jpcdemonodebalancermembersipeuxvsoncillaocelotonzayalilynxsphinxfentigercustomercaracalo365cloudstaticxendevapp001testcode-builder-stgplatformmediasiteprojedrydpagesjsx0desazacncoitrueu4uhkukgrbrushatenadiarymyspreadshopfrom-flfrom-wvwebspace-hosttheworkpchatenablogcursorusercontentservesarcasmapplinzisakuratanwixsiteappchizigiizeis-into-carsdnsiskinkyadobeaemcloudis-a-therapistpgfogmyvncdojinis-an-actress1kappfldrvkozowqa2jpnmexprgmrfirewall-gatewaydynnscafjsfbsbxooguyfrom-gawoltlab-demois-a-anarchistwiardwebteaches-yogadattowebtb-hostinglive-websiteservegamegotpantheonfrom-nhsubsc-payfrom-ohvipsinaappfrom-cadyndns-officehomelinuxfrom-mahercules-appservebbsstreakusercontentfrom-okfrom-wyfastly-terrariumis-a-llamaqualyhqportalserveexchangeon-vaporvivenushopciscofreakgrayjayleaguesmetaaiusercontentfrom-iais-a-libertariansaves-the-whalestaveusercontentyolasiteoperaunitepoint2thisis-a-catererclaudeusercontentlinodeusercontentfrom-vagithubusercontentsells-for-lesshosteurcanva-appsplaystation-cloudddnsfreefrom-pafrom-prfrom-waddnskingoutsystemscloudhotelwithflightmydattois-a-nascarfanmydbserverminiserverdamnserverservehumouris-a-playerfrom-nvfrom-nmemergentagentgentappsamplifyappfrom-kyis-an-accountantnfshostserveircfrom-akpythonanywherestackhero-networkpostman-echolikescandydyndns-mailobservableusercontentserveftpfreeboxosfrom-utcdn77-storageamazonawsneat-urldyndns-serverlinodeis-a-teacherfrom-vtgleezemythic-beastsus1-pleniteu1-plenitla1-plenitpaywhirlservecounterstrikejdevcloudhealth-carereformis-into-animegoogleapisis-a-painterafricaisa-hockeynutatmetais-an-actora2hostedis-a-democratdatadetectest-le-patrondigitaloceanspacesis-a-designeris-a-hunterlinodeobjectstemp-dnsissmarterthanyoufrom-arsimplesiteevennodetownnews-stagingis-a-liberalgooglecodejelasticservemp3qualyhqpartnerdyndns-free1cooldnsest-a-la-masiondrayddnsdynuddnsfrom-orfrom-miis-a-bloggerfrom-himydobisscanvacodeis-an-engineerest-a-la-maisonupsunappdevinappswafflecellmyasustorwpenginepoweredfrom-ctservep2psame-appmyshopblocksthingdustdatalikes-piediscordsezis-with-thebandlpusercontentis-leetshopitsite3utilitiesis-a-personaltrainersinaappladeskis-a-cheflogoipselfipbase44-sandboxnospamproxyalibabacloudcsmesswithdnsauthgearappsiamallamawithgooglelutrausercontentmochausercontentframercanvasmytabitdyndns-homew-credentialless-staticblitzcpserverdiscordsaysis-a-nurseappspotatlassian-isolated-3premotewdfrom-mtwixstudiocode0emm180rmyactivedirectoryawsappsmytuleapdnsabrpolyspaceqbuserrenderbuiltwithdarkboutirgotdnsabrdnsdopaascanva-hosted-embedawsglobalacceleratorhomesecuritypcmyiphostditchyouripclever-clouddyndns-ipon-aptibleis-a-musicianhosted-by-filessecuritytacticsappspaceusercontenthomeunixstrapiappsame-previewcf-ipfsmycloudnaselasticbeanstalkis-certifieddontexistkasserverik-serverdrive-platformatlassian-3pfirebaseappherokuappawsapprunnerbarsycenteris-a-cubicle-slaveservehttpmyshopifyis-a-guruquicksytessiiitesorsitesmagicpatternsappis-a-cpameteorappfrom-wiis-a-rockstarbumbleshrimpdattolocaldatabricksappsreadthedocs-hostedfrom-rifamilydsdyndns-picsplesknsbplaceddnsaliasdynaliasdyndns-remotedoomdnsip-ddnsblogdnsis-a-doctorroutingthecloudamazoncognitobarsyonlinedsmynasddnsgurucloudflare-ipfsdeus-canvasfrom-idsmushcdnpagespeedmobilizerdyndns-at-homeunusualpersonhosted-by-previderis-a-republicandyn-o-saurstreamlitappworkisboringonthewificprapidqualifioappis-uberleetis-slickgetmyipwpdevcloudtypeformdyndns-at-workgentlentapismynascloudw-corp-staticblitzfrom-ingeekgalaxyservebeerfrom-mdonrenderspace-to-rentaivencloudappspacehostedwafaicloudcodespotblogspotatlassian-3p-us-gov-modfrom-ndfrom-msis-a-techieis-a-studentcustomer-ociis-a-photographerdurumisfrom-ksmassivegriddyndns-wikiis-an-entertaineris-a-hard-workermysecuritycamerafrom-mnrackmazedyndns-blogis-a-bulls-fanwritesthisblogfreemyipsimple-urlfrom-sdreservdauthgear-stagingest-mon-blogueuris-into-gamesrice-labsxtooldevicesakurawebis-an-anarchistoraclecloudappsdyndns-worksells-for-urhcloudfrom-dcfastvps-serverwpmucdnis-a-geekscrysecfrom-txis-into-cartoonsmodelscapetrycloudflarelocaltonetstreak-linkbalena-devicesfrom-njforgeblocksfreebox-oswebadorsitefrom-ncdoesntexisthobby-sitestreaklinkshomesecuritymacownprovidertuleap-partnersdattorelaywphostedmailservequakeis-a-socialistservehalflifepivohostingdynuhostingquipelementsw-staticblitzdyndns-webfrom-deproject-studyaliases121is-not-certifiedhercules-devis-a-financialadvisorservepicsis-a-greenloseyouripfrom-ilwithyoutubemwcloudnonprodwiredbladehostingdnsdojofrom-tnpixolinomyqnapcloudis-an-artisthostedpiis-a-landscaperauiusercontentoaiusercontenton-forgeis-a-conservativedreamhostersnet-freaksapps-1and1is-goneencoreapifastly-edgefrom-nesalesforcefrom-scdeployagentoraclegovcloudappsfrom-alis-a-lawyercechirevultrobjectsstufftoreadisa-geekddnsgeeklovableprojecttry-snowplowfrom-moblogsyteis-a-bookkeepernogmyforumravendbmyboxdeelementoredsaacficogoorinforgcomgobnatneteduidstoreorgcomnetintedudevnomepublorgcomneteduathgovtestscalculatorspaynowinfoquizzesresearchedcloudnsfunnelsassessmentsjscaleforcetmacltdorgmilcompronetgovbizpresseklogesrsccloudcustomfltusrcloude4corealmgovmunicontentproxy9metacentrumdyndyndyndnsdynpagespages-researchitionoccustomercomymyspreadshopipv64diskussionsbereich4limacomrub2ixfirewall-gatewayddnssspdnsbarsykeymachinesquare7myhome-serverspeedpartnercommunity-proschuldockxenonconnectg\xFCnstigliefernbwcloud-os-instancedyndnssecmy-routerxn--gnstigliefern-wobin-butterl-o-g-i-nisteingeekin-dslin-berlinin-brbfuettertdasnetzleitungsenin-vpnlcube-serverdyn-ip24logoipdyn-berlinruhr-uni-bochum12hpgoipsrvdnsfruskygit-repossvn-reposinternet-dnsg\xFCnstigbestellenhome-webserverxn--gnstigbestellen-zvbbplacedheimdnscosidnswebspaceconfiglima-citydyndns1istmeinvirtualuserschulplattformmy-gatewayddnsseclebtimnetztest-iservmein-iservvirtual-userhome64iservschuletaifun-dnstraeumtgeradeschulserverdynamisches-dns123webseitednshomehs-heilbronndnsupdaterbssgraphicdwadpdwdaepeweaawapaafpfwfabwbpbacwcpcciwebuserapiobjectsidsiskospockkimodorikerbonesteamsparisjanewaypicardglobaltarpitreedpikekiraworfsulukirkarchertuckerhackercanarywesleystagingprereleaset3r2lpbravepanelngrokiservstglclcrmerpflypagesbarsyvivenushoplocalcertlocalplayerbearbloggatewaydeno-stagingis-not-ais-a-goodbotdashvercelmocha-sandboxplatter-appreplitgithubpreviewworkersinbrowserevervaultis-ahrsndenoxmitmodxmyaddrstorageapipayloadgrebedocruncontainersstgstagelclstageloginlineis-a-fullstackcodepenleapcellngrok-freeis-coolstoragewebharemediatechlibp2pdiscourseimaginecomyspreadshopstoreregbiz123hjemmesidefirmcoorgcomnetedugovsldorgmilcomwebgobartnetedugovtmorgpolcomsocartnetedugovassoagrondiscoodontk12medcuegyecpaabgengorgmilgalsaltulcomadmesmgobpubdocmonfindgnriouioproartlatvetnetfotedulojgovntrturibrbarxxxofficialbasechefprofmktgpsictechinfoarqtcontdentrrpppsiqgit-pagesritmedfieorgcomlibprieduaipgovriikmeactvsportorgmilcomscieunnetedugovnameinfopintouchtawktotawkmyspreadshoporgcomnomgobedu123miwebcomputeorgcomnetedugovbiznameinfocognito-idpeusc-de-east-1onjelasticnxaspdnsbarsydirectwpdeuxfleurstransurldogadoprvwcloudnsamazonwebservicesdnshomeuserpartycokoobinmkmfidymyspreadshopalandkapsiikixn--hkkinen-5wacloudplatformh\xE4kkinen123kotisivuidacorgmilcompronetedugovbiznameinforadioorgcomneteduuserexperts-comptablestmmyspreadshopgretaprdcomnomynhccifbxoshuissier-justicenotairesaeroportfreeboxoson-webavocatassoportgouvkdnschirurgiens-dentistes-en-franceavouesfbx-os123sitewebveterinairechirurgiens-dentistespharmacienchambagrimedecinfreebox-osdediboxgoupilemszicpyicpvicppleysheezypagesedugovcnpyorgcomcybllcpvtnetedugovtnxonlineschooldaemond6atcopanelorgnetplybotdashstackitkaasorgmilcomnetedugovbizmodltdorgcomedugovcoorgcomneteduappwriteacorgcomnetedugovcloudtranslateusercontentorgcomnetedumobiassoorgcomnetedugovbarsysimplesitediscourseindorgmilcomgobneteduorgcomwebnetedugovguaminfonxhra\u6559\u80B2\u654E\u80B2\u7DB2\u7D61\u7F51\u7D61\u7EC4\u7E54\u7D44\u7E54\u7F51\u7EDC\u7DB2\u7EDC\u7EC4\u7EC7\u7D44\u7EC7\u516C\u53F8\u653F\u5E9C\u500B\u4EBA\u4E2A\u4EBA\u7B87\u4EBAltdorgcomincneteduidvgovxn--uc0ay4axn--55qx5dxn--mk0axixn--io0a7ixn--uc0atvxn--zf0avxxn--lcvr32dxn--od0algxn--wcvs22dxn--gmqw5axn--od0aq3bxn--mxtq1mxn--ciqpnxn--tn0agxn--gmq050iorgmilcomgobneteduiservwp2tempurlmircloudfreesitewpmudevmyfastgadgetcloudaccessjelehalfboltfastvpsemergenteasypanelopencraftizcombrendlynamefromrtpersoadultmedorgpolrelcomproartnetedufirminfoassoshopcoopgouvtmcomediahotelforumvideosportorgsexagrargameslakaseroticaerotikatozsdereklamcasino2000filmsuliinfoboltshopprivnewsszexcityutazasjogaszkonyveloingatlaneacaicogoormy\u1B29\u1B2E\u1B36milwebschnetkopbizzonedesaponpesxn--9tfkymyspreadshopgovmytabittabitorderravpageaccok12idforgnetgovmuniltdplcaccotttvorgcomnetmeca6g5gpgamubacaicniocoukuptverdruscsdelhiindorgmilcomwebnicfingenpronetintedugovresbizbiharbarsyinternetbusinessschooltravelsupabasealumnigujaratfirminfoaeropostbankcoopindevscloudnsno-ipbarsybarrell-of-knowledgebarrel-of-knowledgensupdategroks-thisdnsupdatefor-ourknowsitalldvrcammittwalddynamic-dnsv-infowebhopselfipdyndnshere-for-moreilovecollegemayfirstforumzcloudnsmittwaldservertypo3servergroks-theeusekd1cdndyndnsidrawsainaueuapjpusstagemocksysdevicesclientcustreservdcustdevdisrecprodtestingcobeebyteutwenteboxfusebravepstmndedynngrokorgmilcomnomnetedugovqcxqzzbarsythingdustmo-siemensrb-hostingfh-muenstergitbookbluebitecloudbeesusercontentnodeartkiloappsforgerockdarklangresinstagingapigeebubbleb-datascryptedhypernodedappnodepantheonsitegitlabgithubkeeneticvirtualservercleverappshostyhostingon-rioedugitticketstelebitwixstudioon-k3sicp0icp12038jeleqotolairbubbleappsmyaddrstolosmyrdbxwebflowdrive-platformbeagleboardhasura-applolipopdefinimavaporcloudmusicianwebflowtestazurecontainerresindevicereadthedocsloginlineeditorxmoonscalesandcatsbasicserverwebthingsbrowsersafetymarkbeebyteappbitbucketidaccovistablogorgschnetgovxn--mgba3a4f16axn--mgba3a4fraarvanedge\u0627\u064A\u0631\u0627\u0646\u0627\u06CC\u0631\u0627\u0646jclaspeziapdudcefegelemeperetevebacanatavaparasabgagfgogrgpgalclblimfmrmcbmbvbfclcmcvcrcpcchlimifibicivipirisimncnbnanenrnpntnnolomobocoaogorosopotoptvtatctbtmtltotpusulunutpspapaqsvpvvvtvavvrtrsrprgrfrcrbrarorkrvstsssbscsmsispzczbzbozen-suedtirolmyspreadshopxn--bulsan-sdtirol-nsbxn--valledaoste-ebbtrentinoaltoadigetrentin-sued-tirolxn--forlcesena-c8axn--forl-cesena-fcbxn--bozen-sdtirol-2obtriestetrentinsuedtiroltrentino-s-tirollecceudineaostesienaparmaluccapaviagenoapaduaaostamonzaabruzzoternirietiturinmilanbozenlaziofermoleccocuneonuoropratola-speziavdataaligfvgpugmolcalcamlomumbsicpmnvenvaoedugovabrsarmaremrbastoslazibxosfirenzetrentinos\xFCdtirolval-d-aostavalle-aostamessinacremonaravennatoscanatrentin-suedtirolbolognacalabriaurbinopesarofriuli-v-giuliaogliastraxn--valle-aoste-ebblaquilaandriatranibarlettasyncloudxn--valle-d-aoste-ehbaostavalleyvalled-aostatrentino-alto-adigevallee-d-aostexn--balsan-sdtirol-nsbpistoiasicilialucaniacataniaiserniaperugiabresciaveneziagorizialiguriaimperiabulsan-suedtirolbalsan-suedtirolbarlettatraniandriaxn--trentino-sdtirol-szbforl\xEC-cesenatuscanyvall\xE9e-d-aostemantovavall\xE9e-aostecasertapiemontevalleaostaval-daostafriulivgiuliatrevisoforli-cesenavall\xE9edaosteferrarapescaravald-aostatrentino-altoadigefriuli-vegiuliavallee-aostecarboniaiglesiastarantomediocampidanovalleedaostetrentinosud-tirolcampobassotrentins\xFCd-tiroltrentinos\xFCd-tirolmonzabrianzatrentino-s\xFCdtirolxn--trentino-sd-tirol-c3bpotenzacosenzavicenzaemiliaromagnavenicefrosinonemarchepordenonetrentinosued-tirolvaresemolisevall\xE9eaostefriuli-veneziagiuliabasilicatalatinaanconasavonaveronamodenabiellabolzano-altoadigepugliafoggiaumbriatrentino-stirolgenovapadovamateranovararagusapiacenzatrentinostirolvalleeaostetempio-olbiasudsardegnatrentinsudtirolmassa-carrarafriuliveneziagiuliatrentinosuedtirolandria-barletta-tranitrapanixn--cesenaforl-i8amaceratacaltanissettaascoli-picenobrindisicarraramassacagliaririmininapolivibo-valentiachietibulsan-sudtirolbalsan-sudtiroltrentino-a-adigebulsanbalsaniglesiascarboniamilanotorinoteramodell-ogliastraarezzotrentinoalto-adigerovigotrentovenetoiglesias-carboniatrentino-sud-tirolaltoadigereggio-emiliareggio-calabriasardegnatranibarlettaandriapiedmontxn--sdtirol-n2amedio-campidanotrentino-s\xFCd-tirolfriuli-vgiuliafriuli-ve-giuliaromeennaromapisa32-b16-b64-blodiastibarineencomonaplesforlicesenailiadboxosalessandriasicilytrani-barletta-andriaxn--trentin-sdtirol-7vbpesarourbinotrentinsued-tirolcesena-forliforl\xECcesenaemilia-romagnamonzaebrianzaxn--trentinsdtirol-nsbtrentinos-tiroltrentins\xFCdtirolvalledaostaolbia-tempiocampidanomediovibovalentiasassarivalle-daostalombardysud-sardegnafriulivegiuliareggioemiliamonzaedellabrianzaalto-adigevercellitrentin-sudtiroltraniandriabarlettatrentino-sudtirolascolipicenobozen-s\xFCdtirolfriulive-giuliaflorencexn--cesena-forl-mcbcarbonia-iglesiasaosta-valleycarrara-massadellogliastratrentinoa-adigexn--valleaoste-e7apesaro-urbinoxn--trentinosdtirol-7vbxn--trentin-sd-tirol-rzbxn--trentinsd-tirol-6vbtrani-andria-barlettatrentin-s\xFCd-tirolxn--trentinosd-tirol-rzbgrossetomonza-e-della-brianzas\xFCdtirolreggiocalabriatrentinoaadigetrentin-s\xFCdtirolverbano-cusio-ossolafriuliv-giuliaverbaniacampaniatrentino-aadigefriulivenezia-giuliasardiniaandriabarlettatranibarletta-trani-andriacatanzarooristanourbino-pesarocesena-forl\xECvalle-d-aostacampidano-medio123homepagesiracusatempioolbiasuedtirollombardiaavellinocesenaforl\xECtrentinofriuli-venezia-giuliabozen-sudtirolandria-trani-barlettabulsan-s\xFCdtirolbalsan-s\xFCdtirolmonza-brianzabolzanotrentino-sued-tirolbellunosalernolivornocrotonesondriodnshometrentinsud-tirolmassacarraratrentin-sud-tiroltrentino-suedtirolviterbobergamocesenaforliolbiatempiopalermobeneventoagrigentoofcoorgnetfmaitvphdengorgmilcomschnetedugovperagrikanieasukehandachitatokaiaisaikonanoharuamaobuhigashiuraowariasahiinuyamatobishimaiwakurashitarainazawatoyonegamagorimihamatoyotataharakariyayatomioguchikomakimiyoshinishiotokonamekiyosuchiryutoyohashiokazakiisshikikasugaikotakiratoeianjotogofusosetohazutsushimashinshirotakahamanisshinshikatsuhekinantoyokawaichinomiyatoyoakeodateogataakitaikawakyowahonjoogayurihonjonoshirokamiokakatagamimitanegojomeyokotekosakadaisenkazunonikahohonjyomoriyoshimisatohappoukamikoanihachirogatahigashinarusesembokufujisatokitaakitaitayanagiowanitakkomutsutsurutahirosakigonoheoirasetowadamisawanohejiaomorishingohiranairokunohehashikamitsugarushichinohehachinohenakadomarisannohekuroishisakaeisumiasahiotakiinzaiabikomatsudoyachiyomutsuzawakujukuriomigawakashiwatoganemihamanaritasakuranagaramobarahanamigawachoshishiroichoseikozakishisuikatorimidorichonankyonanfuttsuonjukufunabashinagareyamanodasosatakochuotohnoshourayasukimitsuyokaichibayotsukaidosodegauratateyamakamagayayokoshibahikariyachimatakatsuuratomisatokisarazukamogawaichikawanarashinoichinomiyashimofusaminamibososhirakoichiharaoamishirasatoikatahonaiainansaijoseiyoiyoozuuwajimaniihamanamikatamasakiuchikokihokutobetoonshikokuchuomatsuyamaimabarikamijimakumakogenyawatahamamatsunosabaeikedaobamasakaifukuiohionotsurugamihamawakasaminamiechizeneiheijikatsuyamatakahamaechizensoedaukihaomutaokawanishiogoribuzenonojosueumiokiotochikugosasagurisaigawamizumakishinyoshitomikurumekurateyamadakasuganakamamiyamanogatatakatahakataiizukakawaratagawakasuyaashiyainatsukimunakataminamitsuikishonaikurogifukuchikeisenhigashimiyakoshinguyukuhashiokagakiyamekogaongausuikahotohochuotoyotsumiyawakadazaifuhisayamatachiaraiyanagawanakagawahirokawachikujochikushinochikuhochikuzennamieotamaokumashowateneiiwakikoorinangoononishigoshimogoomotegomishimafukushimaasakawakagamiishishirakawaiitatefutabahiratayugawahanawakitakatakawamatakunimiyabukibandaihigashihironoyamatomiharuyamatsuriaizubangedatesomaaizuwakamatsuyanaizuaizumisatonishiaizuizumizakikitashiobarataishinkaneyamakoriyamainawashirotanagurafurudonosamegawasukagawaishikawatamakawaikedaogakitaruiginanenahashimahichisonakatsugawaibigawashirakawamizunamiminokamomitakekawauesekigaharatomikasakahogikitagatayamagatatajimianpachimotosuyaotsukakamigaharahidakanisekitokigujominogodoyorogifukasamatsutakayamawanouchihigashishirakawakasaharashimonitatsumagoichiyodakannakanrashowameiwakiryuotaoratomiokafujiokaitakuranaganoharahigashiagatsumatakasakishibukawaminakamikatashinatsukiyonokawabanumataannakaoizumimidorishintoisesakiuenoyoshiokakusatsutakayamanakanojonanmokutamamuratatebayashimaebashiotakekaitadaiwahongofuchukuietajimashobaramiharahatsukaichihigashihiroshimamiyoshikumanokurenakasakaseraseranishiasaminamifukuyamashinichionomichiosakikamijimajinsekikogentakeharaotobenanaeikedatohmaozoraobiraabirakyowaeniwataikibibaisharirebunerimohiroooketootarupippunishiokoppechitosefurubirahakodateshiranukakitahiroshimakushiroobihironanporoiwamizawaniikappukunneppufukushimanakasatsunaitoyourakuromatsunaiakabirakamisunagawashibechaurakawakamifuranonakatombetsuasahikawashimokawakayabeokoppebiratoriabashirisaromaatsumanumatahidakabifukamukawamikasahorokanaitoyotomisarufutsuhigashikawaishikarikitamiyoichiesashiiwanaitomariminamifuranoakkeshifuranotoyakoyakumootoineppushikaoishiraoinemuronayorohaboroashorobihororishirifujiutashinaihokutotakasuebetsuurausuassabukikonaishimamakinaiedatetoyabieinikiesanuryuoumuteshikagarikubetsuashibetsukimobetsuaibetsutobetsusobetsuembetsushimizuchippubetsurishirihokuryuhoronobeshintokutsubetsushibetsuhonbetsumombetsutsukigatakuriyamakoshimizushiriuchikutchanmurorannoboribetsukamishihorowassamushinshinotsukembuchiwakkanaikamoenaikiyosatotakinoueshikabesunagawafukagawanakagawatakikawakamikawahigashikagurahamatonbetsumatsumaemoseushirankoshishakotanimakanemashikeotofuketomakomaisandatambaitamiawajikasaiasagoshisoonoakoyashirotoyookaminamiawajiinagawafukusakitakasagokamigorikasugaharimayokawaashiyahimejiakashitaishiaogakisannantakinosumototakarazukanishinomiyashingugoshikinishiwakiyokatakaaioimikisayoyabukawanishiamagasakisasayamashinonsenkakogawaichikawakamikawatatsunotsukubaiwamaogawaasahisakaitokaioaraiitakobandodaigosuifuinaamikasumigaurakashimaomitamayachiyoshimodatetomobetoridehitachinakainashikisakuragawakasamayawaramoriyahitachiomiyanamegatayamagatahitachikamisuushikutakahagiibarakitonekoganakasowayukimihojosomitoryugasakishimotsumafujishirotsuchiurachikuseihitachiotashirosatotamatsukuriuchiharashikahakuinanaotsubatawajimakahokukawakitatsurugikaganominotosuzuuchinadakomatsuanamizunakanotohakusannonoichikanazawaiwateshiwafudaikawaimoriokaofunatohanamakikuzumakikitakamininohekunoheyamadayahabasumitaichinosekitanohatahiraizumirikuzentakatajobojiotsuchihironomiyakoiwaizumikarumaiichinohenodakujitonooshushizukuishifujisawamizusawakamaishikanegasakimannoutazukotohiraayagawazentsujihigashikagawauchinomikanonjisanukimarugamemitoyotakamatsutadotsunaoshimatonoshoakuneamamiizumihiokiyusuikinkoisasookouyamanakatanekagoshimakanoyaisenkawanabeminamitanemakurazakitarumizunishinoomotematsumotosatsumasendaioimatsudaayaseebinamiurazushinakaiodawaraiseharasagamiharahakoneaikawakaiseiatsugitsukuihadanoyamatoyamakitazamaoisochigasakininomiyayokosukakamakuraminamiashigarafujisawasamukawakiyokawahiratsukayugawaraokawaumajikochitsunootoyoakiinonishitosayasudahidakamiharasakawaniyodogawahigashitsunokagamigeiseisusakiotsukinaharisukumomurototosakamiochitoyotosashimizumotoyamanankokunakamurakitagawayusuharaogunichoyoukiasoutoozugyokutoamakusamifunetakamoriyamagaminamataminamiogunikikuchisumotoyamatonagasumashikiaraokumamotokamiamakusanishiharayatsushiroayabeseikasakyoideineujinakagyokameokakyotangokyotanabekyotambaminamiyamashiroyamashinatanabeyawatawazukaminaminantanmiyazuhigashiyamafukuchiyamakitamukokamojoyokizumaizuruujitawaraoyamazakinagaokakyokumiyamakawagoeinabeshimameiwaasahitaikiudonoisetsukisosakikuwanamihamamiyamasuzukatamakimisuginabarikumanokomonominamiisewataraitobakiwatakikihotadomatsusakayokkaichikameyamaureshinoishinomakishichikashukuohirataiwaosakizaohigashimatsushimashikamaiwanumashibataogawaraonagawakawasakiseminemarumoriminamisanrikukakudamuratawakuyatomiyanatoriwataritagajomisatotomekamirifushiroishimatsushimayamamotoshiogamafurukawahyugaebinotsunosaitoayakushimanobeokakitauramiyazakitakazakigokaseshiibamimatashintomikunitomikitakatakobayashikawaminamitakaharukijotakanabemiyakonojonishimeranichinankitagawakadogawamorotsukakisofukushimaminamimakisakaeobuseikedaogawamiasaokayaasahiotakiotarichinoinaomichikumakomaganechikuhokukaruizawayasuokaooshikaikusakaminamiaikitogakushimatsukawakawakamitateshinatakamorikitaaikishiojirimiyadahakubaiizunaiijimaiiyamamiyotasuzakayasakatoguraookuwanagawaminowahirayayamagataminamiminowafujimiomachisakakitakaginaganonakanosakuhokomoronagisoshinanomachiwadauedaiidaharasuwatomiachiaokianankisosakunozawaonsenagematsutakayamashimosuwamatsumotoyamanouchinakagawamochizukiazuminotatsunoobamaomuraseihiunzenosetofutsuikichijiwanagasakiisahayahasamisaikaikawatanasasebohiradokuchinotsugototogitsutsushimashimabarashinkamigotomatsuurayamazoekashibaikomakawaitenrioyodosangokoryoudaojiikarugayamatokoriyamatenkawakatsuragikurotakikawakamimiyakemitsuetakatorikamikitayamayamatotakadahegurishinjokanmakisakuraitawaramotogoseoudanarasoniandokawanishishimoichihigashiyoshinokashiharashimokitayamanosegawayoshinomintsivorytopazsakuragehirnsumomoaseinetopalmail-boxmokurenyoitamuikaojiyagosensanjoaganomyokoseiroagaomishibataniigatanagaokamurakamiuonumayuzawakariwatagamitainaitsunanminamiuonumatochioyahikojoetsuseiroukamosadoizumozakitokamachiitoigawasekikawakashiwazakitsubamemitsukekokonoesaikiusukibeppuusahimeshimakunisakihasamataketatsukumihitaoitahijikusuyufukujukamitsuebungoonobungotakadaibaraniimibizentsuyamaokayamakasaokahayashimayakagemaniwaakaiwamisakishinjotamanotakahashikibichuowakesojanagishookumenannishiawakurakurashikiasakuchisetouchikagaminosatoshotomigusukunakagusukuyaeseizenaurumaiheyaaguniogiminanjokinminamidaitokitanakagusukuyonaguniokinawaishigakikunigamiurasoekadenataramahiraraginozataketomishimojizamamitonakiitomanhigashimotobuyonabarugushikamionnanahanagohaebarukumejimakitadaitonakijinnishiharayomitanginowantokashikiishikawaikedasuitaminohizuminishisakaikananabenodaitoosakasayamayaokishiwadatadaokakaizukatondabayashichihayaakasakakumatorikadomasayamahigashiosakashijonawatehirakatataishimisakitajirihannansennankatanotoyonominatosettsuhigashiyodogawaibarakinosekitachuohigashisumiyoshifujiiderakashiwaraizumiotsutoyonakamatsubaramoriguchiizumisanoshimamototakatsukineyagawahabikinotakaishikawachinaganoyoshinogarikamiminearitaouchiimarihizenogikashimaariakekiyamafukudomikitagatakitahataomachigenkaikanzakinishiaritakyuragisagataratosutakushiroishikaratsuhamatamakouhokukawagoeyoshidasatteogoseirumaasakaurawaogawaniizaomiyayoriiotakishikihonjooganohannohanyuinasaitamaokegawaarakawayoshikawayokozehasudasayamahidakafukayachichibuiwatsukiryokamiyoshimikamiizumifujimiwarabiranzanmiyoshiminanoyashiosakadosugitomisatohigashichichibutodasokakukiyonokazoshiraokakasukabekounosukawajimatsurugashimamiyashirokitamotohatoyamamoroyamahatogayakumagayakawaguchinagatorokamisatomatsubushinamegawatokigawakamikawafujiminohigashimatsuyamakoshigayatokorozawas3isk01isk02ryuohkoseikonanaishorittotakashimamaibarahikonetorahimenishiazaikokagamokotoyasuotsukusatsunagahamamoriyamatoyosatotakatsukinotogawaomihachimanhigashiomiakagiunnanizumogotsuamayatsukakakinokimatsuehamadamasudahikawahikimiokuizumoyasugiyakumomisatotamayuohdahigashiizumookinoshimanishinoshimatsuwanoshimaneshimadafujiedayoshidashimodagotembaiwataatamikosaiyaizuitoizumishimahaibaramakinoharaomaezakikawanehonkannamisusonohigashiizufukuroinumazukawazufujiaraishizuokahamamatsushimizuizunokunimatsuzakimorimachiminamiizunishiizukikugawakakegawafujikawafujinomiyaujiietsugaoyamayaitaohiranikkoashikagakuroisokanumasakurashioyakarasuyamamotegiichikaikaminokawatochigihagamokanogisanobatonasumibunasushiobaranishikatautsunomiyaiwafunemashikoshimotsukeohtawaratakanezawaitanokomatsushimatokushimaichibaminamiaizumiwajikikainanmiyoshinarutomimamugiananmatsushigesanagochishishikuinakagawamachidachiyodakomaefussainagitaitochofufuchuomeotahigashiyamatotoshimaokutamaaogashimakodairaedogawaarakawahachiojishinagawatachikawashibuyasuginamihinodekiyosesumidaoshimanerimamitakahamuraadachinakanomizuhobunkyomegurominatokoganeihigashikurumekokubunjihigashimurayamamusashimurayamatamakitahinochuokotokatsushikakouzushimaogasawaraakishimakunitachishinjukusetagayamusashinohachijoitabashiakirunohinoharachizunanbukotouramisasawakasayonagokogehinoyazutottorinichinansakaiminatokawaharaoyabetairainamiasahinantoimizufuchutakaokakurobeyamadajohanatoyamatonaminyuzenfunahashinakaniikawanamerikawaunazukitogahimiuozufukumitsutateyamakamiichiiwadearidayuasainamitaijikatsuragiaridagawatanabemihamahidakakainankiminomisatoshingushirahamakamitondayurakozakoyagobokitayamawakayamakudoyamahashimotokushimotokozagawahirogawakinokawanachikatsuurarsuseroeoishidasagaeoguniasahinagaitendonanyoobanazawanishikawasakataohkuratozawamikawamamurogawayamagatafunagatatakahatashonaishinjokahokuiideyuzakawanishitsuruokakaminoyamayamanobeshiratakamurayamanakayamakaneyamahigashineyonezawasakegawamitouubeyuuabushimonosekitabuseoshimatoyotaiwakunihikarishunannagatohagihofukudamatsutokuyamashowadoshitsurunanbukoshukaiminami-alpsnirasakikosugeotsukioshinohokutominobuyamanashifuefukichuokofuichikawamisatoyamanakakonakamichitabayamanishikatsuranarusawafujikawahayakawafujiyoshidafujikawaguchikouenohara\u9577\u91CE\u4EAC\u90FD\u5C90\u961C\u5927\u962A\u4E09\u91CD\u7FA4\u99AC\u5343\u8449\u6ECB\u8CC0\u4F50\u8CC0\u5948\u826Fadednelgaccogogror\u79CB\u7530\u611B\u77E5\u9AD8\u77E5\u57FC\u7389\u6C96\u7E04\u6803\u6728\u718A\u672C\u5CA9\u624B\u9752\u68EE\u5C71\u68A8\u65B0\u6F5F\u5CF6\u6839\u9CE5\u53D6\u9577\u5D0E\u9999\u5DDD\u5BAE\u57CE\u77F3\u5DDD\u5927\u5206\u5BAE\u5D0E\u8328\u57CE\u5C71\u53E3\u5175\u5EAB\u5C71\u5F62\u5FB3\u5CF6\u5E83\u5CF6\u798F\u5CF6\u798F\u5CA1\u5CA1\u5C71\u5BCC\u5C71\u9759\u5CA1\u611B\u5A9B\u798F\u4E95\u6771\u4EACxn--4it168dhatenadiaryxn--vgu402ckawaiishophatenablogcocottenamaste\u5317\u6D77\u9053penneehimeiwateversestabachibashigagonnagunmapermahaccaakitaosakauh-ohblushkochiaichifukuikuroncapooitigohyogotokyokyotopunyuthickcheap0t00g00j0mie2-ddaapyawjg0amfemsubxiiboomoobutchueekpgwrgrherskrboyrdyupperunderflierchipsmydnsheavyangryhippygirlyrulez\u795E\u5948\u5DDD\u9E7F\u5150\u5CF6\u548C\u6B4C\u5C71bambinaxn--nit225kokayamasaitamaxn--k7yn95exn--1lqs03nsapporoparasitelolipopmcxn--efvn9sniigatafukuokatokushimafukushimahiroshimakagoshimafakefurokinawaxn--8pvr4ucoolblogxn--0trq7p7nnkawasakinagasakimiyazakichilloutxn--8ltr62kxn--klty5xpeeweezombiecutegirlxn--rny31hxn--uuwu58axn--ntso0iqx3axn--djrs72d6uytoyamanikitanyantakagawamimozanagoyaboyfriendxn--2m4a15egreaterchowderegoismyamagatafashionstorexn--elqq16hxn--pssu33lsendaimiyagixn--rht27zpecoriaomorisaloonwatsonvivianxn--djty4knobushipigboatnaganopinokoxn--f6qx53asadistvelvetsecretxn--5js045dchicappayamanashiibarakidigickgirlfriendxn--1lqs71dmongolianxn--c3s14mxn--qqqt11mtochigixn--5rtq34kparallelo0o0mondkobesagabonadecaoitanarafoolkilldecimainhiholomosblokilociaoundopupugifutankcrapflopnooroopsmodsholyjeezstripperpepperbittershizuokaxn--rht3dkitakyushureadymadeicurusversusmatrixxn--rht61ehungryfloppygloomycrankyhandcraftedlittlestarxn--klt787dxn--kltx9awhitesnowsunnydaytottorilovepoptheshopbuyshopxn--5rtp49cxn--d5qv7z876cwebaccelxn--kbrq7oxn--4pvxsxn--1ctwolovesickkumamotocatfoodxn--tor131oyokohamawakayamatonkotsuxn--ehqz56nxn--uist22hxn--6btw5axn--kltp7dyamaguchifrenchkisspussycatxn--4it797kxn--uisz3gbabybluexn--zbx025dnetgamersxn--7t0a264ckanagawaxn--6orx2rishikawaxn--ntsq17ghalfmoonschoolbusjellybeanxn--mkru45iusercontentlolitapunkxn--32vp30hsakurastoragehokkaidoshimanecandypopbabymilksupersaleweblikeraindropbackdropwebsozaikikirarahateblodaynightmeneacsccogoormobiinfoaeusxxorgmilcomnetedugovorgcomnetedugovbizinfotmprdorgmilcomnomedugovassnotairespresseassocoopgouvveterinairemedecinpharmaciensorgnetedugovtraorgcomedurepgovmeneperekgacscaiiocogoitoresmshsseoulbusanulsandaeguc01milvkimmvchungnamjeonnamjeonbukeliv-dnsgyeonggijejueliv-cdnincheondaejeongangwongyeongbukgwangjuchungbukgyeongnameliv-apicoeduindorgcomembnetedugovorgmilcomnetedugovjcloudorgcomnetintedugovperbnrinfocooyorgcomnetedugovethipfscanvamypepethw3sstorachakeeneticjoinmcinbrowserdwebcyonnftstoragemyfritzaemewphlxachotelltdorgcomwebsocschngonetintedugrpgovassnomgacsccoorgnetedugovbizinfo123websiteidorgmilcomasnnetedugovconfidmedorgcomplcschnetedugovaccoorgnetgovpresstmassoirseproxaccosoundcasthoptocraftvp4c66orgnetedugovitsmcdirmyboxbarsyedgestacksynologylogintoopencloudnohostwebhopdiskstationi234tcp4hoocgroknoipprivmydsddnsdnsforlohmustransipdscloudfilegear-sgbrasiliafilegearframerbarsybarsyonlinecoprdorgmilcomnomedugovinforgcomnetedugovnameacprorgcomartnetedugovpresseinfoassoinstgouvorgnycedugovbarsydscloudjuorgcomnetedugovminisiteaccoororgcomnetgovorgmilcompronetintedugovbizmuseumnameinfoaerocoopaccoorgcomnetintedugovbizcooporgcomgobneteduorgmilcomnetedugovbiznameaccoorgmilneteduadvgovcoorgcomnetaltgovforgotherhiskeeneticispmanagernomassoprod5476132eastasiacentraluswesteuropewestus2eastus2pnortheurope-01newzealandnorth-01southindia-01southcentralus2-01norwaywest-01eastus2-01westus2-01australiaeast-01italynorth-01israelnorthwest-01swedencentral-01westeurope-01centraluseuap-01taiwannorthwest-01uaecentral-01northcentralusstage-01israelcentral-01mexicocentral-01canadacentral-01austriaeast-01germanywestcentral-01francecentral-01ukwest-01denmarkeast-01polandcentral-01eastus-01westus-01swedensouth-01eastus3-01westus3-01brazilsouth-01centralus-01francesouth-01australiacentral-01westindia-01uaenorth-01jioindiacentral-01canadaeast-01belgiumcentral-01spaincentral-01koreacentral-01chilecentral-01qatarcentral-01westcentralus-01eastus2euap-01norwayeast-01southafricanorth-01brazilsoutheast-01germanynorth-01switzerlandnorth-01switzerlandwest-01japanwest-01southafricawest-01japaneast-01eastasia-01indiasouthcentral-01taiwannorth-01centralindia-01uksouth-01southcentralus-01northcentralus-01eastasiastage-01indonesiacentral-01australiacentral2-01australiasoutheast-01malaysiawest-01koreasouth-01southeastasia-01southeastus5-01northeastus5-01jioindiawest-01rucdnwest1-usfra1-desandboxjls-sto1jls-sto3jls-sto2aglobalabglobalsslmapprodfreetlsmapvpslon-1lon-2ny-1fr-1sg-1ny-2paassnwebpaashostingjelasticnordeste-idcsocuserpagescwebfileblobservicebuscoreatlricnjsjelasticwebsitestoragesezagbinruhuukjptsmyspreadshopmynetnameakamaiorigin-stagingfrom-coipv64dynv6cdn77serveblogadobeaemcloudhicamsprytdnsupno-ipownipde5ovhicpfirewall-gatewaysytesmypsxbarsyusgovcloudapimyamazemyradwebakamaihdsaveincloudfastlylbfrom-lasubsc-paysquare7in-the-bandblackbaudcdnhomelinuxoninfernoctfcloudservebbsdns-dynamiccloudfrontakamai-stagingipifonyham-radio-opsenseeringclickrisingcommunity-profrom-nylocalcertgrafana-devedgesuite-stagingcloudflareanycasteating-organicatlassian-devmydattofeste-iplocaltotorprojectknx-serveredgekeycloudflareglobalcloudyclustercasacamserveftpakamaized-stagingakamaiorigindns-cloudmyeffectboomlabotdashbuyshousestwmailhetemlazure-mobilein-dslthruhereredirectmedynuddnsbouncemesupabaseluyanicloudappakamaicloudfunctionsdebiannhlfanpgafanstatic-accessin-vpnmysynologymafeloappudohomeftptrafficmanagersiteleafseidatmemsetcloudflarecloudaccesskeyword-onazure-apiis-a-chefdoes-itgets-itwebhopselfiphomeipkicks-assedgesuitewindowsserver-ontunnelmolemydissentscrapper-sitecloudflarecnuni5srcfggffiobbzabchrsndenodynuopikddnsvpndnsakadnselastxkinghostvps-hostfastlyhomeunixazureedgeshopselectdontexistmyfritzcloudjiffyalwaysdatasells-itsquaresbroke-itazurefddattolocalat-band-campmeinforumfamilydsazurestaticappsdefinimabplaceddnsaliasdynaliasnow-dnsblogdnsroutingthecloudendofinternetdsmynasakamaiedgemymediapcadobeio-staticakamaiedge-stagingakamaihd-stagingddns-ipprivatizehealthinsurancelive-onkrellianschokokeksmassivegridmysecuritycamerarackmazeserveminecraftfrom-azis-a-geekakamaizedmoonscaleoffice-on-theusgovtrafficmanageradobeioruntimeedgekey-stagingreserve-onlinechannelsdvrdnsdojousgovcloudappcdn77-sslapps-1and1podzoneazurewebsitesdynathomescaleforceyandexcloudvusercontentisa-geekcdn-edgescoaemalcesappwriteazimuthtlonarvobuiltwithrocketnoticeablestorecomwebrecnetperotherfirminfoartslgdloncogoiltdorgmilcolcomplcschgenngonetedugovbiznamefirmmobiacincoorgmilcomnomwebgobnetintedubizinfocomyspreadshopdemongovtransurl123websitehosting-clusterkhplaycistrongsnesosvalerv\xE5lerxn--vler-qoaossandeheroysandeher\xF8yb\xF8boheroyher\xF8yxn--hery-iraxn--b-5gavalerb\xF8boxn--b-5gasandesandexn--hery-iraxn--vler-qoav\xE5lerh\xE5re\xE5laahavaofsfvfhlolnlalrlhmfmtmahcostntbu\xE5strmreigersundmyspreadshopg\xE1ls\xE1eidsvolltingvollgildeskalflor\xF8vads\xF8vard\xF8vanylvenxn--bhccavuotna-k7astrandaxn--kvnangen-k0axn--sknland-fxaxn--mosjen-eyarakkestadhyllestadnannestadvevelstadvaapstenordre-landsondre-lands\xF8ndre-landtjieltexn--vrggt-xqads\xF8r-aurdalsor-aurdalheradstordmoldefordef\xF8rdeseljefedjeryggehemnexn--krehamn-dxasognegranes\xF8gnebrynetjomevallebykletokkegiskedovretj\xF8mehob\xF8lvoldasaudatolgas\xF8mnaviknad\xF8nnasomnadonnatranafrananesnaraumasmolatr\xE6nafr\xE6nalesjasm\xF8la\xF8rstaorstahitrafloraaukraloppafr\xF8yarissasnasahalsagalsaromsaraisar\xE1isafroyasn\xE5sagronghobolfjelltydal\xE5rdalardalaskimharamkraanghkekr\xE5anghkesorumbarumhurumb\xE6rums\xF8rummodums\xE1l\xE1tb\xE1l\xE1tfrognbjugnv\xE5ganvagangulenskienl\xF8tenlotenstrynvefsnxn--merker-kuaskaunsveiob\xF8mlobomloskj\xE5kvardoflorovadsosalatbalats\xE1latkl\xE6buklabuselbubarduulvikskjakkleppris\xF8rxn--nttery-byaefl\xE5eidflahofmilgolholsellomskifetvikdepvgsfhsaskerrisorhamarasnes\xE5snesr\xF8rosrorosxn--slat-5namasoynaroyvaroyluroydyroyaskoyradoyandoyrodoymeloyrad\xF8yand\xF8yr\xF8d\xF8ymel\xF8yask\xF8ylur\xF8ydyr\xF8ym\xE5s\xF8yv\xE6r\xF8yn\xE6r\xF8yhoylandeth\xF8ylandetdivtasvuodnal\xF8renskoglorenskognesoddtangenxn--tjme-hraxn--smla-hraxn--stjrdal-s1aunjargalillehammerunj\xE1rgaxn--hamary-fyadavvenjargaxn--bearalvhki-y4a123hjemmesidegjerdrumxn--brnnysund-m8acxn--tnsberg-q1axn--mlatvuopmi-s4axn--snsa-roaxn--skierv-utaxn--brum-voatysfjordkvafjordeidfjordkv\xE6fjordsongdalenmjondalenmj\xF8ndalenxn--gls-elackragerog\xE1\u014Bgaviikagangaviikas\xF8rreisasorreisas\xF8r-varangersor-varangerxn--risr-iraskiervaxn--frna-woaxn--trna-woakvinesdalleksvikleirvikr\xF8yrvikroyrviksvelvikvenneslaevje-og-hornnessandnessj\xF8enmarnardalvindafjordsandefjordenebakksnillfjordullensvangxn--trany-yuabr\xF8nn\xF8ysundnamsskoganaustevollxn--stjrdalshalsen-sqbnord-aurdalnord-frontr\xF8gstadtrogstadgrimstadflakstadgjerstadxn--sandy-yuaxn--leagaviika-52bnore-og-uvdalvegarsheixn--rlingen-mxaxn--ggaviika-8ya47hveg\xE5rsheikarlsoykvitsoymasfjordenhamaroyinderoyosteroydavvenj\xE1rgasauheradguovdageaidnuxn--vre-eiker-k8abronnoysiellakkr\xF8dsheradkrodsheradkvinnheradbr\xF8nn\xF8yxn--mtta-vrjjat-k7afxn--lrenskog-54akvits\xF8yv\xE1rgg\xE1tkarls\xF8yoster\xF8yinder\xF8yhamar\xF8ybronnoysundxn--aurskog-hland-jnbbahccavuotnab\xE1hccavuotnagiehtavuoatnastor-elvdalmidtre-gauldalxn--gildeskl-g0akarasjokevenassixn--bievt-0qaxn--yer-znalebesbynessebyxn--hbmer-xqamalselvm\xE5lselvxn--unjrga-rtam\xF8re-og-romsdalmore-og-romsdalhareidmeland\xF8rlandorlandstrand\xE5lg\xE5rdsolundalgardafjord\xE5fjorddielddanuorrikautokeinoxn--stre-toten-zcbskodjeaejriestangeliernebamblestokkefauskesn\xE5asesnaasekongsvingerlangevagberlevagxn--flor-jrahattfjelldalostre-toten\xF8stre-totenvestfoldxn--mely-ira\xE1laheadjualaheadjunordreisaxn--troms-zuaxn--lgrd-poacporsangerflatangerstavangerleikangerbremangersamnangergieldakarasjohkaxn--rdy-0nabfrostautsirasnoasatromsaxn--sr-aurdal-l8aflekkefjordj\xF8lsterjolsteraremarkhedmarkn\xE5\xE5mesjevuemienaamesjevuemiexn--vard-jrarollagmer\xE5kermerakerorskog\xF8rskogxn--bdddj-mrabd\xE1k\u014Boluoktaxn--osyro-wuaaknoluoktatrysilskjerv\xF8ymandaljondalbindalrindalmeldalsuldalorkdalsigdalalvdall\xE6rdalhurdalsirdalverdallerdallardaloppdal\xE5seralaseralhadselkrager\xF8divttasvuotnaoverhallasteinkjerxn--hnefoss-q1askedsmokorsettroms\xF8xn--dyry-iravestre-totenmuseumxn--sandnessjen-ogbrahkkeravjufylkesbiblb\xE1jddarbajddarxn--laheadju-7yarennes\xF8yxn--koluokta-7ya57hxn--hgebostad-g3aleirfjordstorfjordbalsfjordb\xE5tsfjordbatsfjordmuos\xE1tbiev\xE1tloab\xE1tk\xE1r\xE1\u0161johkan\xF8tter\xF8yxn--mjndalen-64anordkappl\xE1hppilahppialstahaugsiljanverranr\xF8ykenroykenhaldenlyngenbergenhortenh\xF8nefosshonefosstroandinbeiarnvarggatosoyroos\xF8yrotromsoidrettmuosatbievatruovatloabatvoagattynsetnessetxn--indery-fyask\xE1nitskanitraholtr\xE5holtxn--ystre-slidre-ujbandebusarpsborgbearduxn--karlsy-fyahordalandjorpelandj\xF8rpelanddeatnuringsakers\xF8r-odalsor-odalxn--slt-elabringerikeaudnedalnittedalnissedalhemsedalslattumsurnadalxn--blt-elabelverumstj\xF8rdalnaustdalhjartdalgj\xF8vikfyresdalhasviknarviklarvikgjovikmalvikgamviklenvikporsgrunnstjordalengerdaldrobakdr\xF8bakxn--msy-ula0hvestvagoyxn--vgan-qoaxn--ryken-vuaxn--lten-graxn--stfold-9xaxn--hpmir-xqaxn--lury-iram\xE1latvuopmimalatvuopmitysv\xE6rkirkenesbirkenesmoskenesb\xE1id\xE1rxn--fjord-lraxn--rdal-poabahcavuotnab\xE1hcavuotnaxn--frde-gralind\xE5sbearalvahkixn--hobl-irar\xE1hkker\xE1vjuxn--loabt-0qav\xE5g\xE5\xE1lt\xE1bod\xF8sundlundrader\xE5deetnetimeholeauregrueoddavagavegaranatanaarnasolasulaaltalekafusavangbergkvam\xE5mliamlibokntinnroangranosenoslobodor\xF8stroststat\xE5motamotivgupriv\xF8yeroyerliermossvossxn--nvuotna-hwalusterlunnermarkerh\xE1bmerhabmerhvalerfjalerxn--rholt-mratysvarbaidarfitjargaularh\xE1pmirhapmirmelhusfosnes\xF8ksnesoksnestysneshemnesevenesflesbergeidsbergtonsbergt\xF8nsberglindasxn--sndre-land-0cbnamsosxn--srum-gra\xF8ystre-slidreoystre-slidrevestre-slidretrondheimbalestrandxn--langevg-jxaaustrheimxn--skjk-soavagsoyaveroysandoykarmoyfinnoytranoyvestbytranbysykkylvenxn--hyanger-q1aspjelkavikandasuoloxn--fl-ziaxn--drbak-wuastathellexn--sr-varanger-ggbtelemarkxn--bhcavuotna-s4axn--porsgu-sta26f\u010D\xE1hcesuolocahcesuoloakrehamn\xE5krehamnsand\xF8ykarm\xF8yfinn\xF8ytran\xF8yv\xE5gs\xF8yaver\xF8ynamdalseidxn--lesund-huabadaddjaxn--vegrshei-c0axn--btsfjord-9zagildesk\xE5lporsanguxn--trgstad-r1an\xE1vuotnanavuotnahammerfestxn--sgne-graxn--brnny-wuacibestadharstadnarviikaeven\xE1\u0161\u0161ivestnesgjemnessandnesagdenesrennesoyxn--avery-yuaxn--tysvr-vrabearalv\xE1hkikongsbergspydebergrandabergxn--andy-iradavvesiidaxn--krdsherad-m8apors\xE1\u014Bgufredrikstadbjerkreimringeburennebuaurskog-holandnotteroyxn--vgsy-qoa0jxn--rmskog-byaskierv\xE1ivelandbyglandfrolandaurlandforsandxn--bjddar-ptamidsund\xE5lesundalesundfetsundfarsundovre-eiker\xF8vre-eikerakershusxn--moreke-juas\xF8rfold\xF8stfoldostfoldsorfoldh\xF8yangerhoyangerlevangerorkangertanangerxn--vestvgy-ixa6olillesandulsteinxn--rennesy-v1agranvinskjervoyxn--klbu-woalavagisxn--h-2faxn--ryrvik-byakafjordk\xE5fjordseljordfolkebiblxn--gjvik-wuajevnakerxn--kfjord-iuabudejjuxn--kranghke-b0axn--davvenjrga-y4axn--rland-uuaxn--ldingen-q1axn--mlselv-iuaxn--rady-iraxn--linds-prabrumunddalxn--ygarden-p1amo-i-ranaeidskogr\xF8mskogromskoghjelmelandxn--finny-yuaxn--sr-odal-q1axn--skjervy-v1aballangenkvanangenkv\xE6nangengratangenxn--hmmrfeasta-s4acvossevangensuohkanxn--rde-ulaxn--mli-tlaxn--ksnes-uuanordlandskanlandsk\xE5nlandsortlandfuoiskuxn--rros-graxn--hcesuolo-7ya35bxn--eveni-0qa01gagaivuotnag\xE1ivuotnaxn--seral-lradrammenmodalenmosjoenjan-mayentorskensteigengloppenxn--snes-poamatta-varjjatxn--sr-fron-q1aomasvuotnajessheimb\xE5d\xE5ddj\xE5xn--krager-gyaxn--kvfjord-nxaxn--asky-iraxn--snase-nraxn--bidr-5nacholt\xE5lenxn--vads-jraxn--jlster-byamosj\xF8enxn--rst-0nastavernxn--ostery-fyaxn--oppegrd-ixaxn--sknit-yqaxn--risa-5naoppeg\xE5rdskiptvetrendalenholtalenxn--mot-tlaxn--lhppi-xqaxn--holtlen-hxaxn--srreisa-q1akopervikxn--muost-0qaxn--bmlo-grahokksundkvalsundegersundxn--karmy-yuaullensakerxn--hylandet-54axn--kvitsy-fyaxn--bod-2nalangev\xE5gberlev\xE5gkristiansandxn--rsta-frahornindalstj\xF8rdalshalsenstjordalshalsensandnessjoenh\xE1mm\xE1rfeastaxn--lrdal-sras\xF8r-fronsor-fronnord-odalkristiansundm\xE1tta-v\xE1rjjatvestv\xE5g\xF8ynesoddennotoddenbuskerud\xF8ygardenoygardensalangenlavangenralingenr\xE6lingenlodingenl\xF8dingenlea\u014Bgaviikalaakesvuemieleangaviikauenorgexn--srfold-byaaskvollxn--rskog-uuaxn--nry-yla5gxn--vry-yla5ghammarfeastaxn--rhkkervju-01afxn--givuotna-8yakommunekrokstadelvanedre-eikerhagebostadh\xE6gebostadxn--berlevg-jxakviteseidxn--s-1faxn--l-1faxn--nmesjevuemie-tcbafuosskomo\xE5rekemoarekexn--lt-liacxn--jrpeland-54asvalbardoppegardholmestrandtvedestrandsogndalsokndalarendalsunndalfolldalxn--krjohka-hwab49jlyngdaletnedalnorddalsaltdalgausdalskedsmovaksdalgjesdalstordalxn--frya-hraaarbortedrangedalxn--smna-graaurskog-h\xF8landxn--vg-yiabtjeldsundhaugesundlindesnesxn--mre-og-romsdal-qqbxn--dnna-gradyntmpheremerseineshacknetenterprisecloudmineaccomaorim\u0101oriorgmilcriiwigennetschoolhealthkiwigovtgeekxn--mori-qsacloudnsparliamentcomedorgcompronetedugovmuseumwebsitekinservicebarsywebsitebuildereerobookheimdnsleapcelleero-stagetechcrscsslorigingohomecdbedeeeiemesecabgngilnlalplchfisiincnnoroptatitmtltruauhulumkdkukskjplvtrgrfrkrhrusesismycynzcznetinteduassoososcloudstgbetaaezaeuhkusjshatenadiarycdn77hoptozaptois-a-knightmyftpno-ipjpnddnssdpdnsspdnsbarsysweetpepperis-a-bruinsfanis-very-sweetservegameis-a-soxfanhomelinuxcdn77-secureservebbsmisconfusedwebredirectblogsitefreedesktopcouchpotatofriestoolforgeaccesscamis-lostreadmyblogsmall-webfedorapeopleserveftpis-a-celticsfanmywirepotagertwmailin-dslsellsyourhomeread-booksfreeddnscable-modemis-savednflfanufcfanmlbfanstuff-4-saleendoftheinternetin-vpnmy-firewallhomeftpis-localis-a-chefboldlygoingnowherewebhopselfipkicks-assroxatunkcamdvrfedoraprojectgotdnsdvrdnsdyndnspubtlspimientahomeunixdontexistfedorainfracloudwmflabsfspagesbmoattachmentsteckidsfamilydsdnsaliasdynaliasnow-dnscloudnsdoomdnsduckdnsblogdnshomednsroutingthecloudendofinternetdsmynasip-dynamicpoivronhttpbinmyfirewallis-very-evilmysecuritycamerais-a-linux-userwmcloudis-a-geektuxfamilyis-a-candidatedoesntexistis-very-badhobby-sitegame-hostaltervistais-foundis-a-patsfandnsdojohepforgepodzonedynservcollegefanis-very-goodfrom-meis-very-niceisa-geeknerdpolacmedsldingorgcomnomgobabonetedupleskaemhlxmyboxrockyprvcydeuxfleurspdnscodebergheyflowstatichostorgmilcomnomgobneteduorgcomeduiorgmilcomngonetedugovcloudns1337ngrokacorggogfamcomwebgobnetedugokgopgkpgovgosbizpasaugumicsopozpapuwmwsrprusiskwpspkppspkmpspokeoiawsawifoumsdnskokwpmuppuppsppiwwiwoowuzswkzoschrzpisdnwzmiuwwitdpssewsseumigugimoirmpinbwinbwiihupporzgwgriwupowwskrwioswuozstarostwokonsulattmpccopruszkowmyspreadshopostrodakartuzyopolegminamediaustkazgorajgoraolawailawalomzawloclradombytomjaworznotargilubinkoninzagantorunkutnokepnonakloczestsopotsanokturekplockslasksklepzarowlukowmedaidgdaorgmilrelcomnomatmgsmartneteduelkgovwawsossexbiztgorysejnytychypomorzeboleslawiechomesklepsdscloudunicloudzakopanelegnicarawa-mazbydgoszczswidnikkrasnikwloclawekbielawamragowograjeworealestatebeskidykaszubymalopolskaprzeworskswiebodzinlecznadfirmaszkolawarmiagdyniamiastakazimierz-dolnymalborkswidnicadlugolekaostrolekapodlasieelblagtravelsimplesitezachpomormielecszczecinnieruchomosciwalbrzychlezajsklublinbedzinpoznanwielunmielnooleckostarachowicedkontopowiatwroclawrybniksuwalkileborkslupskgdanskostrowwlkptarnobrzegtourismwegrowkrakowglogowyou2pilanysamailwrocinfoagroautobeepshopprivlapypiszlodzcfolksecommerce-shopmazurypulawyskoczowrzeszowpomorskiezgierzkaliszolkuszlowiczostrowiecsosnowiecmazowszewodzislawbialowiezazgorzeleckatowicepabianicejelenia-gorawolominkarpaczsieradznowarudaczeladzkonskowolaskierniewiceswinoujscieturystykabieszczadycieszynketrzynolsztynbialystokbabia-goraprochowicewarszawastalowa-wolapolkowicegorlicegliwiceponiatowalimanowalubartowaugustowkobierzyceopocznognieznoszczytnokolobrzegshoparenapodhalebielskoklodzkostargardatwithplayitownnamecoorgnetedugovacorgcomproestnetedugovbiznameislaprofinforechtngrokmedaaaacacpaenglawjurbarbarsykeeneticavocatacctcloudnsorgcomsecplonetedugov123paginaweborgcomnetintedugovnomepublidkinbarsygovx443cloudnsorgmilcomnetedugovcooporgmilcomschnetedugovnamecomcannetlibassoaemclantmcontstoreorgcomnomrecwwwbarsyfirminfoshopartsstackitmyddnswebspacelima-cityacincooxorgedugovbarsybrendlyhbvpsvpsspectrumlandinghostingacppmordoviamcprecbgorgmilcomspbnetintedumsknovgovbirrasmcdirmytismircloudvladimirnalchikadygeyamarinepyatigorskmyjinobashkiriaeurodirvladikavkazna4ugroznykustanaikalmykiacldmaildagestaniranbuildcloudcanvaliaravalwixdevelopmentappwritemigrationneedleverceldatabasestackitcodereplravendbonporterlovableaccoorgmilnetgovcoopmedorgcompubschnetedugovservicemecomygovorggovtvmedorgcomnetedugovinfoedgfacbmlonihkutwpsryxzbdtmacfhppmyspreadshopbrandpartiorgcomfhvpress123minsidaitcouldbeworlanbibkommunalforbundfhskiopsyskomvuxkomforbnaturbruksgymnloginlineorgcomnetedugovenscaledeuusentsurgebotdaorgmilcomnetgovnowteleporthashbangplatformlovablebarsyshopwarebasehoplixbarsyonlinemsf5gitappgitpagewawamscofigma-govcaffeinefigmacanvasoltstscwputerbarsysupportchatgptsquareomniweopensocialcpanelplaycodenotionnovecorewpsquaredpreviewjelecyonbyensrhtfastvpspieboxconvexjouwwebheyflowplatformshloginlinemadethissourcecraftclouderaorgorgcomartedugouvunivmeorgcomnetedugovsurveysstatichfheiyuxs4allprojectmyfastubervibehostapp-ionosdeployagentmecoorgcomschnetedugovbizcncostoreorgmilcomneteduembaixadaconsuladokiraranohoprincipesaotomeheliohobarsystorebaseshopwaresellfyaiabkhaziavologdamordoviapenzalenugsochinavoiexnetspbmsknovnorth-kazakhstanashgabadkareliaarmeniageorgiavladimirnalchikivanovobukharaadygeyakhakassiakalugakrasnodarjambylaktyubinsktroitskbryanskobninskkurganazerbaijanpokrovskbashkiriatselinogradvladikavkazmurmansktulatuvamangyshlaktashkentchimkentgroznykaragandatermezarkhangelskkustanaikalmykiabalashoveast-kazakhstankaracoldagestantogliattibarsyredorgcomgobedumirenknightpointaccoorgjelasticdiscoursecleverappsschacmiincogoornetonlineshopcogoorgmilcomwebnicnetintedugovbiznametestcoorgmilcomnomnetedugovorangecloudpersoindorgcomfinnatnetgovensmincomtourismintlinfox0611oyaorgmilcomnetedugovquickconnectvpnplusnettprequalifymeaddrmyaddrntdllwadlnctvavdrk12orgmilpolbeltelcomwebgennetedutskkepgovbbsbiznameinfocoorgmilcompronetedugovbiznameinfobetter-thanworse-thansakurafromdyndnson-the-webmymailerorgmilurlcomneteduidvgovmydnsgameclubebizmeneacsccogotvorhotelmilmobiinfovodteiflgplkmsmsbcckhincndnvncoztltmkckppzpdprvcvkvlvcrkrkscxuzchernovtsyrivneyaltaodesavolynrovnolutskltdinforgcomnetedugovbizvinnicazhitomirternopilpoltavakropyvnytskyizaporizhzhiasevastopolsebastopoluzhgoroduzhhorodkharkovkharkivvinnytsiakhmelnytskyizaporizhzhecrimeaodessazhytomyrnikolaevcherkassydonetskluganskluhanskkirovogradivano-frankivskchernivtsikrymkievkyivlvivsumyzakarpattiamykolaivcherkasychernigovkhersonchernihivdnipropetrovskdnepropetrovskkhmelnitskiyneacsccogoorusorgmilcomedugovmyspreadshopadimono-ipbarsybarsyonlinelayershiftnh-servretrosnubapicampaignservicelugaffinitylotteryweeklylotteryraffleentrygluglugsmeaccoindependent-inquestnimsitecopropymntltdorgplcschnetgovnhsbarsyindependent-commissionindependent-reviewpolicepublic-inquiryindependent-panelconnhospindependent-inquiryroyal-commissionoraclegovcloudappscck12libaws-govccphxcclibpvtparochchtrcck12libcceatonk12coglibtecgendstmusann-arborwashtenawcck12glghcck12sealibforksolympiabainbridge-islkeyporthoquiamyarrow-pointcentraliaport-townsendsequimport-ludlowrentonsilverdalebremertonredmondsheltonbellevueport-orchardport-angeleskingstonchehalisaberdeengig-harborseattlepoulsboidmdndsddemenegacalamaiavawapailalflnmdcncscohnhmihiviwiriinmntnmocoutvtctmtgunjokakwvnvprarorasmskstxwynykyazisadninsnngosrvis-bymircloudservernamepointtoenscaledland-4-salefreeddnsstuff-4-saleazure-apinoipdatabricksappscloudnsgolffanheliohostazurewebsitesgvorgmilcomgubneteducoorgcomnetd0egvorgmilcomnetedugovmydnsiacostoree12orgmilcomnomwebgobbibrectecnetintedugovraremprendefirminfoartseducok12orgcomnethidnsidacaiiosonlahanamhanoicamauhueorgcompronetintedugovbizbacninhtayninhhoabinhnamdinhtravinhhaiphongvinhlonghaiduongquangnamquangtrithuathienhuequangninhbacgianghaugiangquangbinhsoctrangbentrethanhphohochiminhdanangkontumhatinhkhanhhoathanhhoahealthgialailaocaiyenbaibackanngheanlonganphuyenphuthocanthodaklakdongnainameinfovinhphucdongthapkiengiangtiengiangquangngailaichaulangsonlamdongdaknonghagiangangiangcaobangbinhduongninhthuanbinhthuanbaclieuthaibinhninhbinhbinhdinhtuyenquanghungyenbaria-vungtauthainguyendienbienbinhphuocschbizputerimagine-proxyorgcomnetedugovcloud66advisormypetsdyndnsxn--8dbq2axn--4dbgdty6cxn--5dbhl8dxn--hebda8bxn--80auxn--d1atxn--c1avgxn--o1acxn--o1achxn--90azhxn--55qx5dxn--uc0atvxn--od0algxn--wcvs22dxn--gmqw5axn--mxtq1mxn--12c1fe0brxn--h3cuzk1dixn--12co0c3b4evaxn--12cfi8ixb8lxn--o3cyx2axn--m3ch0j3axn--j1adpxn--90amcxn--90a1afxn--h1ahnxn--j1ael8bxn--h1alizxn--c1avgxn--j1aefxn--80aaa0cvacxn--41acaffeineexeopentunnelbotdashtelebitorgtmaccoagricorgmilnomwebnicngonetaltedugovlawnisschoolgrondaraccoorgmilcomschnetedugovbizinfoprg1-zeropstritonstackitlimazeropsaccoorgmilgov\u044F\u0441\u043F\u0431\u043E\u0440\u0433\u043A\u043E\u043C\u043C\u0441\u043A\u0431\u0438\u0437\u043C\u0438\u0440\u0441\u0430\u043C\u0430\u0440\u0430\u043A\u0440\u044B\u043C\u0441\u043E\u0447\u0438\u0430\u043A\u043E\u0434\u043F\u0440\u043E\u0440\u0433\u043E\u0431\u0440\u0443\u043F\u0440\u05E6\u05D4\u05DC\u05DE\u05DE\u05E9\u05DC\u05D9\u05E9\u05D5\u05D1\u05D0\u05E7\u05D3\u05DE\u05D9\u05D4\u0E2D\u0E07\u0E04\u0E4C\u0E01\u0E23\u0E18\u0E38\u0E23\u0E01\u0E34\u0E08\u0E23\u0E31\u0E10\u0E1A\u0E32\u0E25\u0E28\u0E36\u0E01\u0E29\u0E32\u0E17\u0E2B\u0E32\u0E23\u0E40\u0E19\u0E47\u0E15\u6559\u80B2\u7DB2\u7D61\u7D44\u7E54\u516C\u53F8\u653F\u5E9C\u500B\u4EBA\uB2F7\uB137\uD55C\uAD6D\u6FB3\u95E8\u65B0\u95FB\u6FB3\u9580\u8054\u901A\u5BB6\u96FB\u5609\u91CC\u62DB\u8058\u901A\u8CA9\uB2F7\uCEF4\uC0BC\uC131\u30B3\u30E0\u10D2\u10D4\u0431\u0433\u0440\u0444\u0435\u044Eadcdbdgdidmdsdtdaebedeeegeiejekemenepereseveyegabacalamanauavapaqasazacfbfafgfnfpfwftfbgcgagggegkgngmgsgpgvgtgugilmlnlalclglplsltlhmimjmkmmmomambmcmdmfmgmzmpmsmtmgbbblbsbecccacnclcmcvctcscmhkhghchbhthphshlinikifigiaibicivisikninhnmncnbngnsnpnvntnjoionomobocoaofodorosotoptstttytatbtetgtithtmtltrusuvuaucueuguhulumunufjdjbjtjsjlkmkhkfkdkcktkukskpkgpmpnpkpjpgqaqmqiqsvtvcvbvmvlvrwpwtwzwbwcwawgwkwmwtrsrprgrfrercrbrarnrmrlrkrirhrwsusrssspsgsesbsaslsmsissxmxaxcxuypysylymykygybycyuztzsznzmzkzdzczbzaz\u03B5\u03BB\u03B5\u03C5\u4E16\u754C\u53F0\u7063\u8D2D\u7269\u516C\u76CA\u70B9\u770B\u81FA\u7063\u7F51\u7EDC\u66F8\u7C4D\u5728\u7EBF\u7F51\u7AD9\u624B\u673A\u673A\u6784\u5927\u62FF\u6E38\u620F\u4FE1\u606F\u53F0\u6E7E\u8C37\u6B4C\u6148\u5584\u5546\u6807\u9999\u6E2F\u4E2D\u56FD\u9910\u5385\u7F51\u5740\u4E2D\u570B\u5546\u57CE\u98DF\u54C1\u5FAE\u535A\u653F\u52A1\u79FB\u52A8\u96C6\u56E2\u516C\u53F8\u516B\u5366\u5546\u5E97\u5065\u5EB7\u7F51\u5E97\u653F\u5E9C\u65F6\u5C1A\u4F5B\u5C71\u4E2D\u4FE1\u5A31\u4E50\u5E7F\u4E1C\u4F01\u4E1Ahomedepotengineering\u0627\u0645\u0627\u0631\u0627\u062Arepublicankuokgroupversicherungchannelcitadelxn--pgbs0dhxn--b4w605ferdstatebankwebsitexn--mgb9awbf\u4E9A\u9A6C\u900A\u6DE1\u9A6C\u9521alibabaxn--ngbc5azdxn--mgbbh1axn--45br5cyltoshibabuildworldcloudtradeguideplacespacedancemoviephoneprimesmilebiblestyleappleazurestoreskypegripexn--l1accdrivelottehorsehouseleasechasereisestadahondaomegaaetnaamicaninjanokiamediadeltavodkaedekaosakapizzaslingemailgmailtirolshelltmallfinallegaltotalhotelamfamforumrehabmusicciticricohcoachwatchboschearthfaithirishmiamiarchidubaiguccipraxi\u307F\u3093\u306A\u30B9\u30C8\u30A2\u30BB\u30FC\u30EBcanonsalononionnikonepsonkoelngreensevencrownikanoradioaudioweiboglobopromogalloyahoociscorodeovideomangobingotokyovolvolottokyotophotosmartsportquesttrusthyattjetztadultcymrubaidutushuxn--kprw13dubankclickblackmerckgroupsharpcheapnowtvxn--h2brj9c\u05E7\u05D5\u05DD\u0570\u0561\u0575\u043E\u0440\u0433\u0441\u0440\u0431\u043C\u043E\u043D\u043A\u043E\u043C\u0431\u0435\u043B\u043C\u043A\u0434\u049B\u0430\u0437\u0440\u0443\u0441\u0443\u043A\u0440\u0645\u0635\u0631\u0642\u0637\u0631\u0639\u0631\u0628\u0643\u0648\u0645dadcfdmedwedredphdthdbidpidkrdmsdltdiceonewmeglemoerwecfageacbanbambaaaammakianraspacpaaxawtfbcgaegongingaigvigorgdogdhlmilrilonlaolloluoljllcalgalnflafltelsrlfrllplkimibmcamcombommomifmabbjcbscbwebcabnabtabmlbpubabcbbcnecincpncllcstcwtcpwcnyckfhbzhovhmoiskiobisbitcifyituipinvinwinxincbnbcnmanfangdnmenrenkpnmtnyunrunfununobiojioriohbogmofooboooooacoecoceongoproartistottnttbbtcateatlatvetpetbetnethktmitfitintjothotgotdotbotprueduicujnjyouinknhktdkappsapgapmapdnptopgopllpjmpzipvipripesqtrvdtvitvdevmovgovhivnrwlawsewnewbmwwownowhowdvrftrmtrsfrbarcartvscrseusawsupsubssbsadsddsldssasbmsmlsxxxboxfoxgmxtjxsextaxbuyflydiysoyjoyskypaydaygayxyzanzbizwebersenerpokerlameractortatarsolar\u0EA5\u0EB2\u0EA7\u0E04\u0E2D\u0E21\u0E44\u0E17\u0E22tourslocusnexuslexusgiftsbeatsboatspartspressglassswiss\u0915\u0949\u092E\u0928\u0947\u091Ftiresgivescodeshomesgamestunesshoescardswalesloansvegastoolsdealsautosparis\u30D5\u30A1\u30C3\u30B7\u30E7\u30F3workssucksrocksxeroxforexfedexpartylillymoneystudyrugbytoraytoday\u4E2D\u6587\u7F51xn--unup4y\u5929\u4E3B\u6559\u98DE\u5229\u6D66\u65B0\u52A0\u5761enterprises\u6211\u7231\u4F60\u5609\u91CC\u5927\u9152\u5E97christmasxn--fct429kholdingsxn--8y0a063axn--mgbx4cd0ablifestyleabogadoallstatenetbank\u0643\u0627\u062B\u0648\u0644\u064A\u0643xn--s9brj9cxn--gk3at1ebestbuycharityxn--55qx5dmicrosoftpropertybasketballhomegoodscorsicajewelrygallerygrocerysurgerycountrybrusselsverisignferreroxn--czr694bhdfcbankcommbanksoftbank\u067E\u0627\u0643\u0633\u062A\u0627\u0646\u067E\u0627\u06A9\u0633\u062A\u0627\u0646nextdirect\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0647\u0627\u0644\u0639\u0644\u064A\u0627\u0646xn--h2brj9c8cxn--80adxhksshikshaxn--mgbai9azgqp6jcuisinellabarclayscatholicxn--kpry57dcompanyxn--xhq521bblackfridayxn--mgba3a3ejtsandvikxn--d1acj3bacademydownload\u0645\u0644\u064A\u0633\u064A\u0627xn--j1amhxn--w4r85el8fhu5dnraipirangaathletaxn--fhbeixn--mgbqly7cvafrzuerichxn--c2br7g\u0B87\u0BB2\u0B99\u0BCD\u0B95\u0BC8contractorsxn--io0a7igraphicsinsurancetemasekxn--xkc2al3hye2amotorcyclesphotographydirectoryplumbingxn--vhquvclothingtrainingcleaningwilliamhilllightingxn--mgba3a4f16ashoppingcateringeducationokinawapicturesventuresproductionsxn--9et52uwalmart\u0D2D\u0D3E\u0D30\u0D24\u0D02supportrealestatecapitalonexn--nqv7fs00emaauspostfloristdentistxn--qxamgodaddybradescobargainsmitsubishikerryhotelsxn--9dbq2axn--3pxu8kimmobilienxn--fjq720axn--mgbtx2bholidaymckinseymadridbusinessbuildershelsinkixn--4gbrim\u043C\u043E\u0441\u043A\u0432\u0430\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u0629coffeedegreelacaixapartnersalsaceofficeabbvievoyageorangegeorgeonlinechromemobilekindlegoogleoraclecircleschulesecureinsurexn--mgba7c0bbn0aestatexn--mgbc0a9azcgcruisehangoutxn--vuq861bxn--42c2d9arexrothfirestoneuniversityxn--nnx388alifeinsuranceextraspace\u043E\u043D\u043B\u0430\u0439\u043Dverm\xF6gensberatersoftwarexn--fiqs8sxn--mgbab2bdxn--w4rs40ltienda\u092D\u093E\u0930\u0924\u092E\u094Dafricatoyotaotsukasakuracameracreditcardnagoyaconsultingnetworkjunipertheatermonsterprogressivepioneerxn--55qw42gracingdatingvotingvikinglivinggivingxn--bck1b9a5dre4cbrotherweatherjoburg\u0641\u0644\u0633\u0637\u064A\u0646lplfinancialxn--clchc0ea0b2g2a9gcdfutbolschoolsocialglobaldentalwoodsidechanelairtelmatteltravelrealtorwebcamstream\u0C2D\u0C3E\u0C30\u0C24\u0C4Dunicomalstomxn--nodexn--6frz82gmuseumfurniturexn--rvc1e0am3exn--mix891faccenturexn--11b4c3dismailineustardiscountquebeccomsecclinicservicesxn--y9a3aqxn--c1avgswatchchurchsearch\u0627\u0644\u0627\u0631\u062F\u0646marketingcontacthealthmonashshoujisanofitaipeiamericanexpresssuzuki\u30A2\u30DE\u30BE\u30F3\u30AF\u30E9\u30A6\u30C9\u30DD\u30A4\u30F3\u30C8bharti\u30B0\u30FC\u30B0\u30EBxn--mgberp4a5d4armemorialxn--1qqw23alondonmormoninstitutevisionbostonnortoncouponmaisonamazonvirginberlindesigndurbanolayannissananquanxihuanhitachikaufengardenreisenbayerntechnologydatsunxn--90a3aclatinocasinostudiophysioxn--ngbe9e0apharmacytattootaobaoaramcoexpertreportabbottdirectselectimamatfairwindspictettargetmarketintuittravelersinsurancecreditdupontryukyusuppliesxn--tckwebnpparibasschmidtmerckmsdyodobashirestaurantbridgestonecricketxn--fpcrj9c3dbostikbroadwayattorneylefrakemerckxn--fiq228c5hscareersfarmerswinnersflowersxn--wgbh1cguitarsxn--54b7fta0ccxn--p1acfmakeupgalluplandroverxn--kcrx77d1x4agoldpointbauhausxn--mgbayh7gpahiphopplaystationxn--mgba3a4fraxn--eckvdtc9dhyundaixn--gckr3f0fistanbulticketsmarketsflightschintaireviewsxn--3e0b707ewindowsxn--fiqz9sfinancialxn--fzys8d69uvgm\u0627\u0628\u0648\u0638\u0628\u064Adiscoverreview\u09AC\u09BE\u0982\u09B2\u09BExn--5su34j936bgsgmoscowobserverapartments\u0434\u0435\u0442\u0438\u0627\u0631\u0627\u0645\u0643\u0648\u0441\u0430\u0439\u0442eurovisionxn--i1b6b1a6a2exn--xkc2dl3a5ee0h\u062A\u0648\u0646\u0633\u0645\u0648\u0642\u0639\u0628\u0627\u0631\u062A\u0680\u0627\u0631\u062A\u0634\u0628\u0643\u0629\u0639\u0645\u0627\u0646\u0628\u064A\u062A\u0643\u0639\u0631\u0627\u0642readkredbondlandbandfundfoodprodgoldfordtubecafesafelifeggeeieeefreefagepagegugezonewinememenamegamesaleablebikenikelikecarecbreherefiresaveloveliveblueartedatesitevotecaseluxebofamodaltdaasdatiaayogasinavanashiaasiajavabbvatevavivadatazaraarpacasavisasncfprofmaifsurfgolfdvagsongbingpingwangkpmggoogblogpohlfailcooldellcalldeallidlsarlfilmteamroomfarmimdbarabclubhdfcicbchsbcgmbhrichtechfishdishcashminiernikddiaudiwikimobitaxicitikiwidesiqponskinloanakdnwienopenporncerntownimmolimoolloinfonicofidolegosaxozeroaerovivoautovotomotofastbestresthostpostnextlgbtchatseatgiftmeetdietreitmintrentgentspotscotguruitausohumenucyoubanklinkpinkdclktalksilkbookseekworkrsvpaarpjeepshopcoophelpcamppccwshowbeerstarruhrflirweirhaircarsparsjprshausplusnewstipstoysjobskidsfanspicsdocsxboxamexsexynavycitysonyarmyallybabyplaydeliverybuzzgbizlamborghiniphilips\u0DBD\u0D82\u0D9A\u0DCF\u0CAD\u0CBE\u0CB0\u0CA4fitnessexpresslanxesspfizercenterwalterlawyersoccercareerkosherbrokerlockerdealerdoctorauthorxn--mgbqly7c0a67fbcverm\xF6gensberatungjaguarxn--pssy2uxn--hxt814eflickrrepairrogersairbusxn--mgbai9a5eva00beventsyachtsxn--t60b56a\u09AD\u09BE\u09F0\u09A4\u09AD\u09BE\u09B0\u09A4\u092D\u093E\u0930\u0924\u092D\u093E\u0930\u094B\u0924viajeshermeshughesxn--j1aef\u0938\u0902\u0917\u0920\u0928villas\u0B2D\u0B3E\u0B30\u0B24claimshotels\u0AAD\u0ABE\u0AB0\u0AA4zapposphotosjuegoscondostatamotorsgratistennis\u0A2D\u0A3E\u0A30\u0A24tkmaxxtjmaxxschaeffleryandexxn--80aswgrealtysafetybeautyluxuryxn--3ds443gsupplyfamilyxn--o3cw4hhockeysydneyxn--90aenissayalipayenergycomputeragencyxn--rovu88b\u96FB\u8A0A\u76C8\u79D1xn--gecrj9cstatefarmaccountantaquarelleolayangroup\u9999\u683C\u91CC\u62C9xn--p1ai\u7EC4\u7EC7\u673A\u6784xn--1ck2e1bxn--mgbt3dhdschwarz\u0645\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u0627abudhabinowruzkomatsufujitsuhospitalxn--80asehdbxn--mgbtf8flxn--j6w193gxn--yfro4i67oprudentialxn--flw351ecruisescoursesrecipesxn--e1a4cferrarixn--ses554gxn--wgbl6awatchesstaplessinglesxn--mgbcpq6gpa1axn--otu796dpropertiescreditunionxn--mgbah1a3hjkrdstockholmhisamitsu\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629stcgroupdomainsoriginscouponsbloombergclubmedfroganslimitedxn--80aqecdr1aexposedinternationalequipmentbarclaycardxn--q7ce6axn--mgbi4ecexpprotectionassociatesconstructionxn--cck2b3bxn--45q11candroidfoundation\u05D9\u05E9\u05E8\u05D0\u05DCxn--mgbca7dzdocliniqueboutiqueengineerxn--qxa6asystemsfirmdalefashionauctionxn--nqv7finfinitirentalsreliancetradingweddingfishinghostinggentingbookingcookingxn--3hcrj9cgraingerxn--czrs0tdemocratsamsungyokohamaxn--h2breg3evexn--nyqy26alundbeckmelbournevacationssolutionsfrontierxn--vermgensberatung-pwbmanagementxn--cg4bkixn--mgb2ddeslincolnhamburgsandvikcoromantblockbusterairforcebarefootxn--4dbrk0ceinvestmentsfeedbackcommunityxn--ngbrx\u0627\u0644\u0628\u062D\u0631\u064A\u0646diamondsamsterdamhealthcareredumbrellaxn--mxtq1mxn--2scrj9cagakhanxn--mgbpl2fh\u043A\u0430\u0442\u043E\u043B\u0438\u043Acaravan\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCDrichardlimortgageamericanfamilyxn--fzc2c9e2cscholarshipssaarlandxn--imr513nvlaanderensamsclubgoodyearkitchen\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBEweatherchannelallfinanzxn--kput3i\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u06C3xn--90aisxn--efvy88h\u0627\u0644\u062C\u0632\u0627\u0626\u0631xn--mgbaam7a8hexchangejpmorganxn--tiq49xqyjfidelitysecurityxn--mk1bu44cwanggouxn--fiq64bxn--6qq986b3xlxn--mgbbh1a71exn--80ao21amarshallsxn--5tzm5gtravelerspanasoniclatrobeyoutubeaccountantsxn--rhqv96gxn--cckwcxetdanalyticsxn--ygbi2ammx\u0628\u0627\u0632\u0627\u0631\u0628\u06BE\u0627\u0631\u062A\u0633\u0648\u0631\u064A\u0629organicfresenius\u0633\u0648\u0631\u064A\u0627xn--9krt00axn--qcka1pmcxn--jlq480n2rgdeloittesciencefinancexn--jvr189mxn--30rr7yhomesensehotmailbaseballfootballleclercboehringerxn--q9jyb4cxn--mix082f\u0627\u0644\u064A\u0645\u0646\u0647\u0645\u0631\u0627\u0647politie\u0633\u0648\u062F\u0627\u0646\u0627\u064A\u0631\u0627\u0646\u0627\u06CC\u0631\u0627\u0646netflixyamaxunxn--lgbbat1ad8jcollegestoragecapetowncolognekerrypropertiesxn--mgbgu82axn--ogbpf8flxn--czru2dwhoswhociprianilasallexn--g2xx48cforsalebanamexaudiblexn--vermgensberater-ctbxn--zfr164bericssonvanguardxn--45brj9cindustriestheatremarriottxn--3bst00mcomparexn--mgberp4a5d4a87gcapitaldigital\u0627\u0644\u0645\u063A\u0631\u0628barcelonashangrilaxn--d1alfcalvinkleinwwwcitysapporokawasakinagoyasendaikobekitakyushuyokohamackjp";
|
|
1790
|
-
var rulesRoot = 624;
|
|
1791
|
-
var exceptionsRoot = 628;
|
|
1792
|
-
|
|
1793
|
-
// ../../node_modules/.pnpm/tldts@7.4.15/node_modules/tldts/dist/es6/src/suffix-trie.js
|
|
1794
|
-
var numberOfNodes = nodeFlags.length;
|
|
1795
|
-
var numberOfEdges = edgeLength.length;
|
|
1796
|
-
var edgeOffset = new Uint32Array(numberOfEdges);
|
|
1797
|
-
var edgeHash = new Uint32Array(numberOfEdges);
|
|
1798
|
-
var wildcardEdge = new Int32Array(numberOfNodes).fill(-1);
|
|
1799
|
-
for (let node = 0, offset = 0; node < numberOfNodes; node += 1) {
|
|
1800
|
-
for (let edge = edgeStart[node]; edge < edgeStart[node + 1]; edge += 1) {
|
|
1801
|
-
edgeOffset[edge] = offset;
|
|
1802
|
-
const end = offset + edgeLength[edge];
|
|
1803
|
-
let hash = 5381;
|
|
1804
|
-
for (let i = end - 1; i >= offset; i -= 1) {
|
|
1805
|
-
hash = hash * 33 ^ labelText.charCodeAt(i);
|
|
1806
|
-
}
|
|
1807
|
-
edgeHash[edge] = hash >>> 0;
|
|
1808
|
-
if (edgeLength[edge] === 1 && labelText.charCodeAt(offset) === 42) {
|
|
1809
|
-
wildcardEdge[node] = edge;
|
|
1810
|
-
}
|
|
1811
|
-
offset = end;
|
|
1812
|
-
}
|
|
1813
|
-
}
|
|
1814
|
-
var matchNode = -1;
|
|
1815
|
-
var matchStart = 0;
|
|
1816
|
-
var matchEnd = 0;
|
|
1817
|
-
function labelEquals(edge, hostname, start, length) {
|
|
1818
|
-
if (edgeLength[edge] !== length) {
|
|
1819
|
-
return false;
|
|
1820
|
-
}
|
|
1821
|
-
const offset = edgeOffset[edge];
|
|
1822
|
-
for (let i = 0; i < length; i += 1) {
|
|
1823
|
-
if (labelText.charCodeAt(offset + i) !== hostname.charCodeAt(start + i)) {
|
|
1824
|
-
return false;
|
|
1825
|
-
}
|
|
1826
|
-
}
|
|
1827
|
-
return true;
|
|
1828
|
-
}
|
|
1829
|
-
function findEdge(node, hash, hostname, start, length) {
|
|
1830
|
-
let lo = edgeStart[node];
|
|
1831
|
-
let hi = edgeStart[node + 1];
|
|
1832
|
-
while (lo < hi) {
|
|
1833
|
-
const mid = lo + hi >>> 1;
|
|
1834
|
-
const value = edgeHash[mid];
|
|
1835
|
-
if (value < hash) {
|
|
1836
|
-
lo = mid + 1;
|
|
1837
|
-
} else if (value > hash) {
|
|
1838
|
-
hi = mid;
|
|
1839
|
-
} else {
|
|
1840
|
-
for (let e = mid; e >= lo && edgeHash[e] === hash; e -= 1) {
|
|
1841
|
-
if (labelEquals(e, hostname, start, length))
|
|
1842
|
-
return e;
|
|
1843
|
-
}
|
|
1844
|
-
for (let e = mid + 1; e < hi && edgeHash[e] === hash; e += 1) {
|
|
1845
|
-
if (labelEquals(e, hostname, start, length))
|
|
1846
|
-
return e;
|
|
1847
|
-
}
|
|
1848
|
-
return -1;
|
|
1849
|
-
}
|
|
1850
|
-
}
|
|
1851
|
-
return -1;
|
|
1852
|
-
}
|
|
1853
|
-
function walk(hostname, root, allowedMask) {
|
|
1854
|
-
let node = root;
|
|
1855
|
-
let end = hostname.length;
|
|
1856
|
-
let hash = 5381;
|
|
1857
|
-
matchNode = -1;
|
|
1858
|
-
for (let i = hostname.length - 1; i >= 0; i -= 1) {
|
|
1859
|
-
const code = hostname.charCodeAt(i);
|
|
1860
|
-
if (code === 46) {
|
|
1861
|
-
const start = i + 1;
|
|
1862
|
-
let edge2 = findEdge(node, hash >>> 0, hostname, start, end - start);
|
|
1863
|
-
if (edge2 === -1) {
|
|
1864
|
-
edge2 = wildcardEdge[node];
|
|
1865
|
-
}
|
|
1866
|
-
if (edge2 === -1) {
|
|
1867
|
-
return matchNode !== -1;
|
|
1868
|
-
}
|
|
1869
|
-
node = edgeChild[edge2];
|
|
1870
|
-
if ((nodeFlags[node] & allowedMask) !== 0) {
|
|
1871
|
-
matchNode = node;
|
|
1872
|
-
matchStart = start;
|
|
1873
|
-
matchEnd = end;
|
|
1874
|
-
}
|
|
1875
|
-
end = i;
|
|
1876
|
-
hash = 5381;
|
|
1877
|
-
} else {
|
|
1878
|
-
hash = hash * 33 ^ code;
|
|
1879
|
-
}
|
|
1880
|
-
}
|
|
1881
|
-
let edge = findEdge(node, hash >>> 0, hostname, 0, end);
|
|
1882
|
-
if (edge === -1) {
|
|
1883
|
-
edge = wildcardEdge[node];
|
|
1884
|
-
}
|
|
1885
|
-
if (edge !== -1) {
|
|
1886
|
-
node = edgeChild[edge];
|
|
1887
|
-
if ((nodeFlags[node] & allowedMask) !== 0) {
|
|
1888
|
-
matchNode = node;
|
|
1889
|
-
matchStart = 0;
|
|
1890
|
-
matchEnd = end;
|
|
1891
|
-
}
|
|
1892
|
-
}
|
|
1893
|
-
return matchNode !== -1;
|
|
1894
|
-
}
|
|
1895
|
-
function suffixLookup(hostname, options, out) {
|
|
1896
|
-
if (fast_path_default(hostname, options, out)) {
|
|
1897
|
-
return;
|
|
1898
|
-
}
|
|
1899
|
-
const allowedMask = (options.allowPrivateDomains ? 2 : 0) | (options.allowIcannDomains ? 1 : 0);
|
|
1900
|
-
if (walk(hostname, exceptionsRoot, allowedMask)) {
|
|
1901
|
-
out.isIcann = (nodeFlags[matchNode] & 1) !== 0;
|
|
1902
|
-
out.isPrivate = (nodeFlags[matchNode] & 2) !== 0;
|
|
1903
|
-
out.publicSuffix = hostname.slice(matchEnd + 1);
|
|
1904
|
-
return;
|
|
1905
|
-
}
|
|
1906
|
-
if (walk(hostname, rulesRoot, allowedMask)) {
|
|
1907
|
-
out.isIcann = (nodeFlags[matchNode] & 1) !== 0;
|
|
1908
|
-
out.isPrivate = (nodeFlags[matchNode] & 2) !== 0;
|
|
1909
|
-
out.publicSuffix = hostname.slice(matchStart);
|
|
1910
|
-
return;
|
|
1911
|
-
}
|
|
1912
|
-
out.isIcann = false;
|
|
1913
|
-
out.isPrivate = false;
|
|
1914
|
-
const lastDot = hostname.lastIndexOf(".");
|
|
1915
|
-
out.publicSuffix = lastDot === -1 ? hostname : hostname.slice(lastDot + 1);
|
|
1916
|
-
}
|
|
1917
|
-
|
|
1918
|
-
// ../../node_modules/.pnpm/tldts@7.4.15/node_modules/tldts/dist/es6/index.js
|
|
1919
|
-
var RESULT = getEmptyResult();
|
|
1920
|
-
function parse(url, options) {
|
|
1921
|
-
return parseImpl(url, 5, suffixLookup, options, getEmptyResult());
|
|
1922
|
-
}
|
|
1923
|
-
function getPublicSuffix(url, options) {
|
|
1924
|
-
resetResult(RESULT);
|
|
1925
|
-
return parseImpl(url, 2, suffixLookup, options, RESULT).publicSuffix;
|
|
1926
|
-
}
|
|
1927
|
-
|
|
1928
|
-
// ../api/src/ads-google/criteria.ts
|
|
1929
|
-
import { z as z3 } from "zod";
|
|
1930
|
-
var AGE_RANGES = [
|
|
1931
|
-
"AGE_RANGE_18_24",
|
|
1932
|
-
"AGE_RANGE_25_34",
|
|
1933
|
-
"AGE_RANGE_35_44",
|
|
1934
|
-
"AGE_RANGE_45_54",
|
|
1935
|
-
"AGE_RANGE_55_64",
|
|
1936
|
-
"AGE_RANGE_65_UP",
|
|
1937
|
-
"AGE_RANGE_UNDETERMINED"
|
|
1938
|
-
];
|
|
1939
|
-
var GENDERS = ["MALE", "FEMALE", "UNDETERMINED"];
|
|
1940
|
-
var PARENTAL_STATUSES = ["PARENT", "NOT_A_PARENT", "UNDETERMINED"];
|
|
1941
|
-
var INCOME_RANGES = [
|
|
1942
|
-
"INCOME_RANGE_0_50",
|
|
1943
|
-
"INCOME_RANGE_50_60",
|
|
1944
|
-
"INCOME_RANGE_60_70",
|
|
1945
|
-
"INCOME_RANGE_70_80",
|
|
1946
|
-
"INCOME_RANGE_80_90",
|
|
1947
|
-
"INCOME_RANGE_90_UP",
|
|
1948
|
-
"INCOME_RANGE_UNDETERMINED"
|
|
1949
|
-
];
|
|
1950
|
-
var BRAND_SUITABILITY_LABELS = [
|
|
1951
|
-
"BRAND_SUITABILITY_CONTENT_FOR_FAMILIES",
|
|
1952
|
-
"BRAND_SUITABILITY_GAMES_FIGHTING",
|
|
1953
|
-
"BRAND_SUITABILITY_GAMES_MATURE",
|
|
1954
|
-
"BRAND_SUITABILITY_HEALTH_SENSITIVE",
|
|
1955
|
-
"BRAND_SUITABILITY_HEALTH_SOURCE_UNDETERMINED",
|
|
1956
|
-
"BRAND_SUITABILITY_NEWS_RECENT",
|
|
1957
|
-
"BRAND_SUITABILITY_NEWS_SENSITIVE",
|
|
1958
|
-
"BRAND_SUITABILITY_NEWS_SOURCE_NOT_FEATURED",
|
|
1959
|
-
"BRAND_SUITABILITY_POLITICS",
|
|
1960
|
-
"BRAND_SUITABILITY_RELIGION"
|
|
1961
|
-
];
|
|
1962
|
-
var CONTENT_LABELS = [
|
|
1963
|
-
"SEXUALLY_SUGGESTIVE",
|
|
1964
|
-
"BELOW_THE_FOLD",
|
|
1965
|
-
"PARKED_DOMAIN",
|
|
1966
|
-
"JUVENILE",
|
|
1967
|
-
"PROFANITY",
|
|
1968
|
-
"TRAGEDY",
|
|
1969
|
-
"VIDEO",
|
|
1970
|
-
"VIDEO_RATING_DV_G",
|
|
1971
|
-
"VIDEO_RATING_DV_PG",
|
|
1972
|
-
"VIDEO_RATING_DV_T",
|
|
1973
|
-
"VIDEO_RATING_DV_MA",
|
|
1974
|
-
"VIDEO_NOT_YET_RATED",
|
|
1975
|
-
"EMBEDDED_VIDEO",
|
|
1976
|
-
"LIVE_STREAMING_VIDEO",
|
|
1977
|
-
"SOCIAL_ISSUES",
|
|
1978
|
-
...BRAND_SUITABILITY_LABELS
|
|
1979
|
-
];
|
|
1980
|
-
var ACCOUNT_ONLY_CONTENT_LABELS = new Set(BRAND_SUITABILITY_LABELS);
|
|
1981
|
-
var CAMPAIGN_ONLY_CONTENT_LABELS = /* @__PURE__ */ new Set(["VIDEO"]);
|
|
1982
|
-
var PROXIMITY_RADIUS_UNITS = ["KILOMETERS", "MILES"];
|
|
1983
|
-
var WEBPAGE_OPERANDS = ["URL", "CATEGORY", "PAGE_TITLE", "PAGE_CONTENT", "CUSTOM_LABEL"];
|
|
1984
|
-
var WEBPAGE_OPERATORS = ["EQUALS", "CONTAINS"];
|
|
1985
|
-
var SCHEDULE_MINUTES = ["ZERO", "FIFTEEN", "THIRTY", "FORTY_FIVE"];
|
|
1986
|
-
var refSchema = z3.union([
|
|
1987
|
-
z3.string().regex(RESOURCE_NAME_REGEX, "expected a customers/\u2026/\u2026/\u2026 resource name"),
|
|
1988
|
-
z3.string().regex(NUMERIC_ID_REGEX, "expected a numeric id"),
|
|
1989
|
-
z3.string().regex(TEMP_REF_REGEX, "expected a g_temp_* reference")
|
|
1990
|
-
]);
|
|
1991
|
-
var existingRefSchema = z3.union([
|
|
1992
|
-
z3.string().regex(RESOURCE_NAME_REGEX, "expected a customers/\u2026/\u2026/\u2026 resource name"),
|
|
1993
|
-
z3.string().regex(NUMERIC_ID_REGEX, "expected a numeric id")
|
|
1994
|
-
]);
|
|
1995
|
-
function constantSchema(collection) {
|
|
1996
|
-
return z3.union([z3.string().regex(new RegExp(`^${collection}/\\d+$`)), z3.string().regex(NUMERIC_ID_REGEX)]);
|
|
1997
|
-
}
|
|
1998
|
-
var bidModifierSchema = z3.number().min(0).max(10).refine((v) => v === 0 || v >= 0.1, {
|
|
1999
|
-
message: "bid modifier must be 0 (exclude the device) or between 0.1 and 10.0"
|
|
2000
|
-
});
|
|
2001
|
-
function isPlacementSite(url) {
|
|
2002
|
-
const host = parse(url);
|
|
2003
|
-
return !/\s/.test(url) && host.isIcann === true && host.domain !== null;
|
|
2004
|
-
}
|
|
2005
|
-
var criterionBidModifierSchema = z3.number().min(0.1, "bid modifier must be between 0.1 and 10.0 \u2014 only a device takes 0").max(10);
|
|
2006
|
-
var bid = { bidModifier: criterionBidModifierSchema.optional() };
|
|
2007
|
-
var deviceBid = { bidModifier: bidModifierSchema.optional() };
|
|
2008
|
-
var criterionSchemas = [
|
|
2009
|
-
z3.strictObject({
|
|
2010
|
-
criterionType: z3.literal("location"),
|
|
2011
|
-
geoTargetConstant: z3.union([z3.string().regex(GEO_TARGET_CONSTANT_REGEX), z3.string().regex(NUMERIC_ID_REGEX)]),
|
|
2012
|
-
...bid
|
|
2013
|
-
}),
|
|
2014
|
-
z3.strictObject({
|
|
2015
|
-
criterionType: z3.literal("language"),
|
|
2016
|
-
languageConstant: z3.union([z3.string().regex(LANGUAGE_CONSTANT_REGEX), z3.string().regex(NUMERIC_ID_REGEX)])
|
|
2017
|
-
}),
|
|
2018
|
-
z3.strictObject({
|
|
2019
|
-
criterionType: z3.literal("adSchedule"),
|
|
2020
|
-
dayOfWeek: z3.enum(DAYS_OF_WEEK),
|
|
2021
|
-
startHour: z3.number().int().min(0).max(23),
|
|
2022
|
-
startMinute: z3.enum(SCHEDULE_MINUTES).default("ZERO"),
|
|
2023
|
-
endHour: z3.number().int().min(0).max(24),
|
|
2024
|
-
endMinute: z3.enum(SCHEDULE_MINUTES).default("ZERO"),
|
|
2025
|
-
...bid
|
|
2026
|
-
}),
|
|
2027
|
-
z3.strictObject({ criterionType: z3.literal("device"), device: z3.enum(DEVICE_TYPES), ...deviceBid }),
|
|
2028
|
-
/** A radius around a point (latitude/longitude in degrees) or around an address. */
|
|
2029
|
-
z3.strictObject({
|
|
2030
|
-
criterionType: z3.literal("proximity"),
|
|
2031
|
-
latitude: z3.number().min(-90).max(90).optional(),
|
|
2032
|
-
longitude: z3.number().min(-180).max(180).optional(),
|
|
2033
|
-
address: z3.strictObject({
|
|
2034
|
-
streetAddress: z3.string().min(1).optional(),
|
|
2035
|
-
cityName: z3.string().min(1).optional(),
|
|
2036
|
-
postalCode: z3.string().min(1).optional(),
|
|
2037
|
-
countryCode: z3.string().length(2)
|
|
2038
|
-
}).optional(),
|
|
2039
|
-
radius: z3.number().positive(),
|
|
2040
|
-
radiusUnits: z3.enum(PROXIMITY_RADIUS_UNITS),
|
|
2041
|
-
...bid
|
|
2042
|
-
}),
|
|
2043
|
-
/** A website, app or YouTube page the ads show on (`example.com`, `example.com/news`). */
|
|
2044
|
-
z3.strictObject({
|
|
2045
|
-
criterionType: z3.literal("placement"),
|
|
2046
|
-
url: z3.string().min(1).refine(isPlacementSite, {
|
|
2047
|
-
error: 'a placement is a website address with a real domain ending, like example.com or example.com/news \u2014 Google refuses any other ("Placement URL has wrong format")'
|
|
2048
|
-
}),
|
|
2049
|
-
...bid
|
|
2050
|
-
}),
|
|
2051
|
-
/** A mobile app by Google's id: `1-<appStoreId>` for iOS, `2-<packageName>` for Android. */
|
|
2052
|
-
z3.strictObject({
|
|
2053
|
-
criterionType: z3.literal("mobileApp"),
|
|
2054
|
-
appId: z3.string().regex(/^[12]-.+$/, "appId is 1-<App Store id> for iOS or 2-<package name> for Android"),
|
|
2055
|
-
...bid
|
|
2056
|
-
}),
|
|
2057
|
-
z3.strictObject({
|
|
2058
|
-
criterionType: z3.literal("mobileAppCategory"),
|
|
2059
|
-
mobileAppCategoryConstant: constantSchema("mobileAppCategoryConstants"),
|
|
2060
|
-
...bid
|
|
2061
|
-
}),
|
|
2062
|
-
z3.strictObject({ criterionType: z3.literal("youtubeChannel"), channelId: z3.string().min(1), ...bid }),
|
|
2063
|
-
z3.strictObject({ criterionType: z3.literal("youtubeVideo"), videoId: z3.string().min(1), ...bid }),
|
|
2064
|
-
z3.strictObject({ criterionType: z3.literal("topic"), topicConstant: constantSchema("topicConstants"), ...bid }),
|
|
2065
|
-
z3.strictObject({ criterionType: z3.literal("ageRange"), ageRange: z3.enum(AGE_RANGES), ...bid }),
|
|
2066
|
-
z3.strictObject({ criterionType: z3.literal("gender"), gender: z3.enum(GENDERS), ...bid }),
|
|
2067
|
-
z3.strictObject({ criterionType: z3.literal("parentalStatus"), parentalStatus: z3.enum(PARENTAL_STATUSES), ...bid }),
|
|
2068
|
-
z3.strictObject({ criterionType: z3.literal("incomeRange"), incomeRange: z3.enum(INCOME_RANGES), ...bid }),
|
|
2069
|
-
z3.strictObject({ criterionType: z3.literal("ipBlock"), ipAddress: z3.string().min(1) }),
|
|
2070
|
-
z3.strictObject({ criterionType: z3.literal("contentLabel"), contentLabel: z3.enum(CONTENT_LABELS) }),
|
|
2071
|
-
z3.strictObject({ criterionType: z3.literal("carrier"), carrierConstant: constantSchema("carrierConstants") }),
|
|
2072
|
-
z3.strictObject({
|
|
2073
|
-
criterionType: z3.literal("operatingSystem"),
|
|
2074
|
-
operatingSystemVersionConstant: constantSchema("operatingSystemVersionConstants")
|
|
2075
|
-
}),
|
|
2076
|
-
/** Pages of the advertiser's own site, for Dynamic Search Ads targeting or URL exclusions. */
|
|
2077
|
-
z3.strictObject({
|
|
2078
|
-
criterionType: z3.literal("webpage"),
|
|
2079
|
-
name: z3.string().min(1).max(255),
|
|
2080
|
-
conditions: z3.array(
|
|
2081
|
-
z3.strictObject({
|
|
2082
|
-
operand: z3.enum(WEBPAGE_OPERANDS),
|
|
2083
|
-
operator: z3.enum(WEBPAGE_OPERATORS).optional(),
|
|
2084
|
-
argument: z3.string().min(1)
|
|
2085
|
-
})
|
|
2086
|
-
).min(1).max(3)
|
|
2087
|
-
}),
|
|
2088
|
-
/** A BRANDS shared set (`keyword-lists create --type BRANDS`), attached as an inclusion or exclusion. */
|
|
2089
|
-
z3.strictObject({ criterionType: z3.literal("brandList"), sharedSet: refSchema }),
|
|
2090
|
-
/** A member of a BRANDS list: Google's brand entity id (`/g/11txzrylsb`, from `baker ads google brands`). */
|
|
2091
|
-
z3.strictObject({ criterionType: z3.literal("brand"), entityId: z3.string().regex(/^\/[a-z]\/\w+$/) }),
|
|
2092
|
-
z3.strictObject({ criterionType: z3.literal("userList"), userList: refSchema, ...bid }),
|
|
2093
|
-
z3.strictObject({ criterionType: z3.literal("userInterest"), userInterest: existingRefSchema, ...bid }),
|
|
2094
|
-
z3.strictObject({ criterionType: z3.literal("customAudience"), customAudience: existingRefSchema, ...bid }),
|
|
2095
|
-
/** A Demand Gen ad group's one combined audience (the `audiences/{id}` resource). */
|
|
2096
|
-
z3.strictObject({ criterionType: z3.literal("audience"), audience: existingRefSchema }),
|
|
2097
|
-
/** An ACCOUNT_LEVEL_NEGATIVE_KEYWORDS list applied to the whole account (account exclusions only). */
|
|
2098
|
-
z3.strictObject({ criterionType: z3.literal("negativeKeywordList"), sharedSet: refSchema }),
|
|
2099
|
-
/** A Performance Max search theme (asset-group signal only). */
|
|
2100
|
-
z3.strictObject({
|
|
2101
|
-
criterionType: z3.literal("searchTheme"),
|
|
2102
|
-
text: z3.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroupSignal.searchThemeTextMax)
|
|
2103
|
-
})
|
|
2104
|
-
];
|
|
2105
|
-
var LOCATION_GROUP_MESSAGE = 'Targeting near business locations (a location group) needs the account\'s location assets, which Baker cannot stage yet. Target a radius instead \u2014 `criterionType: "proximity"` with an address or latitude/longitude and a radius \u2014 or tell the user to add the business locations in Google Ads; carry on with the rest of the job.';
|
|
2106
|
-
var RETIRED_CRITERION_TYPES = {
|
|
2107
|
-
locationGroup: LOCATION_GROUP_MESSAGE,
|
|
2108
|
-
keyword: "Keywords are not criteria here: target them with `baker ads google keywords add`, exclude them with `baker ads google negative-keywords add`, or put them in a list with `baker ads google keyword-lists add`."
|
|
2109
|
-
};
|
|
2110
|
-
var criterionSpecSchema = z3.discriminatedUnion("criterionType", criterionSchemas, {
|
|
2111
|
-
error: (issue) => {
|
|
2112
|
-
const input = issue.input;
|
|
2113
|
-
const type = typeof input?.criterionType === "string" ? input.criterionType : void 0;
|
|
2114
|
-
return type ? RETIRED_CRITERION_TYPES[type] : void 0;
|
|
2115
|
-
}
|
|
2116
|
-
});
|
|
2117
|
-
var CRITERION_TYPES = criterionSchemas.map((schema) => schema.shape.criterionType.value);
|
|
2118
|
-
function criterionSpecIssues(spec) {
|
|
2119
|
-
if (spec.criterionType === "adSchedule" && spec.endHour === 24 && spec.endMinute !== "ZERO") {
|
|
2120
|
-
return [{ path: ["endMinute"], message: "endHour 24 (midnight) cannot have a non-zero endMinute" }];
|
|
2121
|
-
}
|
|
2122
|
-
if (spec.criterionType === "proximity") {
|
|
2123
|
-
const point = spec.latitude !== void 0 || spec.longitude !== void 0;
|
|
2124
|
-
const both = spec.latitude !== void 0 && spec.longitude !== void 0;
|
|
2125
|
-
if (point === (spec.address !== void 0) || point && !both) {
|
|
2126
|
-
return [
|
|
2127
|
-
{
|
|
2128
|
-
path: [],
|
|
2129
|
-
message: "a radius is around either a point (latitude AND longitude) or an address (countryCode plus street, city or postal code) \u2014 give exactly one"
|
|
2130
|
-
}
|
|
2131
|
-
];
|
|
2132
|
-
}
|
|
2133
|
-
}
|
|
2134
|
-
return [];
|
|
2135
|
-
}
|
|
2136
|
-
var BOTH = ["target", "exclude"];
|
|
2137
|
-
var TARGET = ["target"];
|
|
2138
|
-
var EXCLUDE = ["exclude"];
|
|
2139
|
-
var PLACEMENT_LISTS = ["NEGATIVE_PLACEMENTS"];
|
|
2140
|
-
var CRITERION_PLACEMENTS = {
|
|
2141
|
-
location: { label: "location", campaign: BOTH, adGroup: BOTH },
|
|
2142
|
-
language: { label: "language", campaign: TARGET, adGroup: TARGET },
|
|
2143
|
-
adSchedule: { label: "ad schedule", campaign: TARGET },
|
|
2144
|
-
// A device is never excluded: a bid adjustment of 0 is how it stops serving.
|
|
2145
|
-
device: { label: "device", campaign: TARGET },
|
|
2146
|
-
proximity: { label: "radius", campaign: TARGET },
|
|
2147
|
-
placement: { label: "placement", campaign: EXCLUDE, adGroup: BOTH, account: true, sharedSet: PLACEMENT_LISTS },
|
|
2148
|
-
mobileApp: { label: "app", campaign: EXCLUDE, adGroup: BOTH, account: true, sharedSet: PLACEMENT_LISTS },
|
|
2149
|
-
mobileAppCategory: {
|
|
2150
|
-
label: "app category",
|
|
2151
|
-
campaign: EXCLUDE,
|
|
2152
|
-
adGroup: BOTH,
|
|
2153
|
-
account: true,
|
|
2154
|
-
sharedSet: PLACEMENT_LISTS
|
|
2155
|
-
},
|
|
2156
|
-
youtubeChannel: {
|
|
2157
|
-
label: "YouTube channel",
|
|
2158
|
-
campaign: EXCLUDE,
|
|
2159
|
-
adGroup: BOTH,
|
|
2160
|
-
account: true,
|
|
2161
|
-
sharedSet: PLACEMENT_LISTS
|
|
2162
|
-
},
|
|
2163
|
-
youtubeVideo: {
|
|
2164
|
-
label: "YouTube video",
|
|
2165
|
-
campaign: EXCLUDE,
|
|
2166
|
-
adGroup: BOTH,
|
|
2167
|
-
account: true,
|
|
2168
|
-
sharedSet: PLACEMENT_LISTS
|
|
2169
|
-
},
|
|
2170
|
-
topic: { label: "topic", campaign: EXCLUDE, adGroup: BOTH },
|
|
2171
|
-
ageRange: { label: "age", campaign: EXCLUDE, adGroup: BOTH },
|
|
2172
|
-
gender: { label: "gender", campaign: EXCLUDE, adGroup: BOTH },
|
|
2173
|
-
parentalStatus: { label: "parental status", campaign: EXCLUDE, adGroup: BOTH },
|
|
2174
|
-
incomeRange: { label: "household income", campaign: EXCLUDE, adGroup: BOTH },
|
|
2175
|
-
ipBlock: { label: "IP address", campaign: EXCLUDE, account: true },
|
|
2176
|
-
contentLabel: { label: "content type", campaign: EXCLUDE, account: true },
|
|
2177
|
-
carrier: { label: "mobile carrier", campaign: TARGET },
|
|
2178
|
-
operatingSystem: { label: "operating system", campaign: TARGET },
|
|
2179
|
-
webpage: { label: "web pages", campaign: EXCLUDE, adGroup: BOTH },
|
|
2180
|
-
brandList: { label: "brand list", campaign: BOTH, adGroup: TARGET },
|
|
2181
|
-
brand: { label: "brand", sharedSet: ["BRANDS"] },
|
|
2182
|
-
negativeKeywordList: { label: "account negative keyword list", account: true },
|
|
2183
|
-
userList: { label: "audience list", campaign: BOTH, adGroup: BOTH },
|
|
2184
|
-
userInterest: { label: "interest", campaign: BOTH, adGroup: BOTH },
|
|
2185
|
-
customAudience: { label: "custom segment", campaign: BOTH, adGroup: BOTH },
|
|
2186
|
-
audience: { label: "audience", adGroup: TARGET, assetGroup: true },
|
|
2187
|
-
searchTheme: { label: "search theme", assetGroup: true }
|
|
2188
|
-
};
|
|
2189
|
-
var AUDIENCE_SEGMENT_TYPES = /* @__PURE__ */ new Set([
|
|
2190
|
-
"userList",
|
|
2191
|
-
"userInterest",
|
|
2192
|
-
"customAudience"
|
|
2193
|
-
]);
|
|
2194
|
-
var AUDIENCE_SEGMENT_MESSAGE = "Audience lists, interests and custom segments go on a campaign or ad group with `baker ads google audiences attach` (`--user-list`, `--interest` or `--custom-segment`) \u2014 that command reads whether the parent narrows its reach to them (Targeting) or only adjusts bids (Observation) and stages the switch. Use it instead.";
|
|
2195
|
-
var LEVEL_WORDS = {
|
|
2196
|
-
campaign: "a campaign",
|
|
2197
|
-
adGroup: "an ad group",
|
|
2198
|
-
account: "the account's exclusions",
|
|
2199
|
-
sharedSet: "a list",
|
|
2200
|
-
assetGroup: "an asset group signal"
|
|
2201
|
-
};
|
|
2202
|
-
var PAST = { target: "targeted", exclude: "excluded" };
|
|
2203
|
-
function acceptedAt(type) {
|
|
2204
|
-
const placement = CRITERION_PLACEMENTS[type];
|
|
2205
|
-
const where = [];
|
|
2206
|
-
for (const level of ["campaign", "adGroup"]) {
|
|
2207
|
-
const polarities = placement[level];
|
|
2208
|
-
if (polarities) {
|
|
2209
|
-
where.push(
|
|
2210
|
-
`${polarities.length === 2 ? "targeted or excluded" : PAST[polarities[0] ?? "target"]} on ${LEVEL_WORDS[level]}`
|
|
2211
|
-
);
|
|
2212
|
-
}
|
|
2213
|
-
}
|
|
2214
|
-
if (placement.account) {
|
|
2215
|
-
where.push("excluded account-wide");
|
|
2216
|
-
}
|
|
2217
|
-
if (placement.sharedSet) {
|
|
2218
|
-
where.push(`a member of a ${placement.sharedSet.join("/")} list`);
|
|
2219
|
-
}
|
|
2220
|
-
if (placement.assetGroup) {
|
|
2221
|
-
where.push("an asset group signal");
|
|
2222
|
-
}
|
|
2223
|
-
return where.join(", ");
|
|
2224
|
-
}
|
|
2225
|
-
function criterionLevelIssue(spec, level, options = {}) {
|
|
2226
|
-
const type = spec.criterionType;
|
|
2227
|
-
const placement = CRITERION_PLACEMENTS[type];
|
|
2228
|
-
const audience = audienceRouteIssue(type, level, options.viaAudiences === true);
|
|
2229
|
-
if (audience) {
|
|
2230
|
-
return audience;
|
|
2231
|
-
}
|
|
2232
|
-
const polarity = options.negative ? "exclude" : "target";
|
|
2233
|
-
if (levelAllows(placement, level, polarity)) {
|
|
2234
|
-
return spec.criterionType === "contentLabel" ? contentLabelLevelIssue(spec.contentLabel, level) : void 0;
|
|
2235
|
-
}
|
|
2236
|
-
if (type === "device" && options.negative) {
|
|
2237
|
-
return "A device is never excluded \u2014 stage it with bidModifier 0 to stop the ads showing on it.";
|
|
2238
|
-
}
|
|
2239
|
-
const what = withArticle(placement.label);
|
|
2240
|
-
const where = level === "account" || level === "sharedSet" ? `put ${what} in ${LEVEL_WORDS[level]}` : `${polarity} ${what} on ${LEVEL_WORDS[level]}`;
|
|
2241
|
-
return `Google's API cannot ${where} \u2014 ${what} can be ${acceptedAt(type)}.`;
|
|
2242
|
-
}
|
|
2243
|
-
function withArticle(label) {
|
|
2244
|
-
return `${/^[aeiou]/i.test(label) ? "an" : "a"} ${label}`;
|
|
2245
|
-
}
|
|
2246
|
-
function audienceRouteIssue(type, level, viaAudiences) {
|
|
2247
|
-
if (level !== "campaign" && level !== "adGroup" || AUDIENCE_SEGMENT_TYPES.has(type) === viaAudiences) {
|
|
2248
|
-
return void 0;
|
|
2249
|
-
}
|
|
2250
|
-
return viaAudiences ? `\`audiences attach\` takes an audience list, interest or custom segment \u2014 a ${CRITERION_PLACEMENTS[type].label} is a criterion: stage it with \`baker ads google ${level === "campaign" ? "campaign" : "ad-group"}-criteria add\`.` : AUDIENCE_SEGMENT_MESSAGE;
|
|
2251
|
-
}
|
|
2252
|
-
function levelAllows(placement, level, polarity) {
|
|
2253
|
-
switch (level) {
|
|
2254
|
-
case "campaign":
|
|
2255
|
-
case "adGroup":
|
|
2256
|
-
return (placement[level] ?? []).includes(polarity);
|
|
2257
|
-
case "account":
|
|
2258
|
-
return placement.account === true;
|
|
2259
|
-
case "assetGroup":
|
|
2260
|
-
return placement.assetGroup === true;
|
|
2261
|
-
default:
|
|
2262
|
-
return (placement.sharedSet?.length ?? 0) > 0;
|
|
2263
|
-
}
|
|
2264
|
-
}
|
|
2265
|
-
function contentLabelLevelIssue(label, level) {
|
|
2266
|
-
if (level === "campaign" && ACCOUNT_ONLY_CONTENT_LABELS.has(label)) {
|
|
2267
|
-
return `${label} is excluded account-wide only (Google answers CANNOT_EXCLUDE_CRITERION on a campaign) \u2014 stage it with \`baker ads google account-exclusions add\`.`;
|
|
2268
|
-
}
|
|
2269
|
-
if (level === "account" && CAMPAIGN_ONLY_CONTENT_LABELS.has(label)) {
|
|
2270
|
-
return `${label} is excluded per campaign only (Google answers CANNOT_EXCLUDE_CRITERION account-wide) \u2014 stage it with \`baker ads google campaign-criteria add\`.`;
|
|
2271
|
-
}
|
|
2272
|
-
return void 0;
|
|
2273
|
-
}
|
|
2274
|
-
function criterionBidIssue(spec, negative) {
|
|
2275
|
-
if (!("bidModifier" in spec) || spec.bidModifier === void 0) {
|
|
2276
|
-
return void 0;
|
|
2277
|
-
}
|
|
2278
|
-
return negative ? "An exclusion carries no bid adjustment \u2014 Google refuses one on a negative criterion (FIELD_INCOMPATIBLE_WITH_NEGATIVE_TARGETING). Drop bidModifier." : void 0;
|
|
2279
|
-
}
|
|
2280
|
-
var AUDIENCES = ["userList", "userInterest", "customAudience"];
|
|
2281
|
-
var PLACEMENT_TYPES = ["placement", "mobileApp", "mobileAppCategory", "youtubeChannel", "youtubeVideo"];
|
|
2282
|
-
var SEARCH_DEMOGRAPHICS = ["ageRange", "gender", "incomeRange"];
|
|
2283
|
-
var DEMOGRAPHICS = ["ageRange", "gender", "parentalStatus", "incomeRange"];
|
|
2284
|
-
var CAMPAIGN_REACH = ["location", "language", "adSchedule", "device", "proximity"];
|
|
2285
|
-
var BID_AT_CAMPAIGN = ["location", "adSchedule", "device", "proximity"];
|
|
2286
|
-
var PHONE_DEVICES = ["MOBILE", "TABLET", "DESKTOP"];
|
|
2287
|
-
var CRITERIA_BY_CHANNEL = {
|
|
2288
|
-
SEARCH: {
|
|
2289
|
-
campaign: {
|
|
2290
|
-
target: [...CAMPAIGN_REACH, ...AUDIENCES, "brandList"],
|
|
2291
|
-
exclude: [
|
|
2292
|
-
"location",
|
|
2293
|
-
...SEARCH_DEMOGRAPHICS,
|
|
2294
|
-
"ipBlock",
|
|
2295
|
-
"contentLabel",
|
|
2296
|
-
...PLACEMENT_TYPES,
|
|
2297
|
-
"webpage",
|
|
2298
|
-
...AUDIENCES,
|
|
2299
|
-
"brandList"
|
|
2300
|
-
],
|
|
2301
|
-
bid: [...BID_AT_CAMPAIGN, ...AUDIENCES]
|
|
2302
|
-
},
|
|
2303
|
-
adGroup: {
|
|
2304
|
-
target: [...SEARCH_DEMOGRAPHICS, ...AUDIENCES, "webpage", "location", "brandList"],
|
|
2305
|
-
exclude: [...SEARCH_DEMOGRAPHICS, ...PLACEMENT_TYPES, ...AUDIENCES, "webpage"],
|
|
2306
|
-
bid: [...SEARCH_DEMOGRAPHICS, ...AUDIENCES]
|
|
2307
|
-
},
|
|
2308
|
-
conditional: {
|
|
2309
|
-
"campaign:target:brandList": "aiMax",
|
|
2310
|
-
"campaign:exclude:brandList": "aiMax",
|
|
2311
|
-
"adGroup:target:location": "aiMax",
|
|
2312
|
-
"adGroup:target:brandList": "aiMax",
|
|
2313
|
-
"adGroup:target:webpage": "dynamicAdGroup",
|
|
2314
|
-
"adGroup:exclude:webpage": "dynamicAdGroup"
|
|
2315
|
-
},
|
|
2316
|
-
adGroupDevices: PHONE_DEVICES
|
|
2317
|
-
},
|
|
2318
|
-
DISPLAY: {
|
|
2319
|
-
campaign: {
|
|
2320
|
-
target: [...CAMPAIGN_REACH, "carrier", "operatingSystem"],
|
|
2321
|
-
exclude: ["location", ...DEMOGRAPHICS, "ipBlock", "contentLabel", ...PLACEMENT_TYPES, "topic", ...AUDIENCES],
|
|
2322
|
-
bid: BID_AT_CAMPAIGN
|
|
2323
|
-
},
|
|
2324
|
-
adGroup: {
|
|
2325
|
-
target: [...PLACEMENT_TYPES, "topic", ...DEMOGRAPHICS, ...AUDIENCES],
|
|
2326
|
-
exclude: [...PLACEMENT_TYPES, "topic", ...DEMOGRAPHICS, ...AUDIENCES],
|
|
2327
|
-
bid: [...PLACEMENT_TYPES, "topic", ...DEMOGRAPHICS, ...AUDIENCES]
|
|
2328
|
-
},
|
|
2329
|
-
adGroupDevices: ["MOBILE", "TABLET", "DESKTOP", "CONNECTED_TV"]
|
|
2330
|
-
},
|
|
2331
|
-
DEMAND_GEN: {
|
|
2332
|
-
campaign: {
|
|
2333
|
-
target: ["adSchedule", "device", "carrier", "operatingSystem"],
|
|
2334
|
-
exclude: ["ipBlock", ...PLACEMENT_TYPES, "topic"],
|
|
2335
|
-
bid: ["adSchedule", "device"]
|
|
2336
|
-
},
|
|
2337
|
-
adGroup: {
|
|
2338
|
-
target: ["location", "language", ...PLACEMENT_TYPES, "topic", "audience"],
|
|
2339
|
-
exclude: ["location", ...PLACEMENT_TYPES, "topic"],
|
|
2340
|
-
bid: []
|
|
2341
|
-
}
|
|
2342
|
-
},
|
|
2343
|
-
PERFORMANCE_MAX: {
|
|
2344
|
-
campaign: {
|
|
2345
|
-
target: CAMPAIGN_REACH,
|
|
2346
|
-
exclude: ["location", "ageRange", "gender", "webpage", "brandList", "userList"],
|
|
2347
|
-
bid: BID_AT_CAMPAIGN
|
|
2348
|
-
}
|
|
2349
|
-
},
|
|
2350
|
-
SHOPPING: {
|
|
2351
|
-
campaign: {
|
|
2352
|
-
target: ["location", "adSchedule", "device", "proximity", "brandList", ...AUDIENCES],
|
|
2353
|
-
exclude: ["location", "ipBlock", "webpage", "brandList", ...AUDIENCES],
|
|
2354
|
-
bid: [...BID_AT_CAMPAIGN, ...AUDIENCES]
|
|
2355
|
-
},
|
|
2356
|
-
adGroup: { target: AUDIENCES, exclude: AUDIENCES, bid: AUDIENCES },
|
|
2357
|
-
adGroupDevices: PHONE_DEVICES
|
|
2358
|
-
}
|
|
2359
|
-
};
|
|
2360
|
-
|
|
2361
|
-
// ../api/src/ads-google/structured-snippet-headers.ts
|
|
2362
|
-
var STRUCTURED_SNIPPET_HEADERS_EN = [
|
|
2363
|
-
"Brands",
|
|
2364
|
-
"Amenities",
|
|
2365
|
-
"Styles",
|
|
2366
|
-
"Types",
|
|
2367
|
-
"Destinations",
|
|
2368
|
-
"Services",
|
|
2369
|
-
"Courses",
|
|
2370
|
-
"Neighborhoods",
|
|
2371
|
-
"Shows",
|
|
2372
|
-
"Insurance coverage",
|
|
2373
|
-
"Degree programs",
|
|
2374
|
-
"Featured hotels",
|
|
2375
|
-
"Models"
|
|
2376
|
-
];
|
|
2377
|
-
var STRUCTURED_SNIPPET_HEADERS_LOCALIZED = [
|
|
2378
|
-
"Aanbevolen hotels",
|
|
2379
|
-
"Acara",
|
|
2380
|
-
"Apdro\u0161in\u0101\u0161ana",
|
|
2381
|
-
"Apkaimes",
|
|
2382
|
-
"Arredores",
|
|
2383
|
-
"Asigurare",
|
|
2384
|
-
"Asseguran\xE7a",
|
|
2385
|
-
"Ausstattung",
|
|
2386
|
-
"Automerkit",
|
|
2387
|
-
"Bairros",
|
|
2388
|
-
"Barrios",
|
|
2389
|
-
"Barris",
|
|
2390
|
-
"Bestemmingen",
|
|
2391
|
-
"Biztos\xEDt\xE1si m\xF3dozat",
|
|
2392
|
-
"Blagovne znamke",
|
|
2393
|
-
"Brand",
|
|
2394
|
-
"Br\xE4ndid",
|
|
2395
|
-
"Br\xE4ndit",
|
|
2396
|
-
"Buurten",
|
|
2397
|
-
"Cakupan asuransi",
|
|
2398
|
-
"Carreras universitarias",
|
|
2399
|
-
"Cartiere",
|
|
2400
|
-
"Ch\u01B0\u01A1ng tr\xECnh",
|
|
2401
|
-
"Cilji",
|
|
2402
|
-
"Cobertura de seguro",
|
|
2403
|
-
"Cobertura do seguro",
|
|
2404
|
-
"Comodidades",
|
|
2405
|
-
"Coperture assicurativa",
|
|
2406
|
-
"Corsi",
|
|
2407
|
-
"Corsi di laurea",
|
|
2408
|
-
"Cours",
|
|
2409
|
-
"Couverture d'assurance",
|
|
2410
|
-
"Cursos",
|
|
2411
|
-
"Cursuri",
|
|
2412
|
-
"Cursussen",
|
|
2413
|
-
"C\xEDle",
|
|
2414
|
-
"C\u1EA5p b\u1EB1ng",
|
|
2415
|
-
"Degree programmes",
|
|
2416
|
-
"Dekking",
|
|
2417
|
-
"Design",
|
|
2418
|
-
"Destinacions",
|
|
2419
|
-
"Destinasi",
|
|
2420
|
-
"Destinasjoner",
|
|
2421
|
-
"Destinationer",
|
|
2422
|
-
"Destinazioni",
|
|
2423
|
-
"Destina\u021Bii",
|
|
2424
|
-
"Destinos",
|
|
2425
|
-
"Destin\xE1cie",
|
|
2426
|
-
"Dienstleistungen",
|
|
2427
|
-
"Diplomaprogramok",
|
|
2428
|
-
"Dot\u0103ri",
|
|
2429
|
-
"Draudimo apr\u0117ptis",
|
|
2430
|
-
"Dzielnice",
|
|
2431
|
-
"D\u1ECBch v\u1EE5",
|
|
2432
|
-
"Emisije",
|
|
2433
|
-
"Emisiuni",
|
|
2434
|
-
"Espect\xE1culos",
|
|
2435
|
-
"Estilos",
|
|
2436
|
-
"Estils",
|
|
2437
|
-
"Faciliteter",
|
|
2438
|
-
"Fasilitas",
|
|
2439
|
-
"Fasiliteter",
|
|
2440
|
-
"Forsikringsdekning",
|
|
2441
|
-
"Forsikringsd\xE6kning",
|
|
2442
|
-
"F\xF6rs\xE4kringstyper",
|
|
2443
|
-
"Galam\u0113r\u0137i",
|
|
2444
|
-
"Gaya",
|
|
2445
|
-
"Hizmetler",
|
|
2446
|
-
"Hotel consigliati",
|
|
2447
|
-
"Hotel ditampilkan",
|
|
2448
|
-
"Hotel pilihan",
|
|
2449
|
-
"Hoteles destacados",
|
|
2450
|
-
"Hotels destacats",
|
|
2451
|
-
"Hoteluri prezentate",
|
|
2452
|
-
"Hot\xE9is em destaque",
|
|
2453
|
-
"Istaknuti hoteli",
|
|
2454
|
-
"Itinatampok na hotel",
|
|
2455
|
-
"Jenama",
|
|
2456
|
-
"Jenis",
|
|
2457
|
-
"Kaupunginosat",
|
|
2458
|
-
"Kawasan",
|
|
2459
|
-
"Kejiranan",
|
|
2460
|
-
"Kemudahan",
|
|
2461
|
-
"Kh\xE1ch s\u1EA1n n\u1ED5i b\u1EADt",
|
|
2462
|
-
"Kh\xF3a h\u1ECDc",
|
|
2463
|
-
"Kiemelt sz\xE1llod\xE1k",
|
|
2464
|
-
"Kierunki studi\xF3w",
|
|
2465
|
-
"Kindlustuskaitse",
|
|
2466
|
-
"Ki\u1EC3u",
|
|
2467
|
-
"Kohteet",
|
|
2468
|
-
"Kraadi\xF5ppeprogrammid",
|
|
2469
|
-
"Kritje zavarovanj",
|
|
2470
|
-
"Kurs",
|
|
2471
|
-
"Kursai",
|
|
2472
|
-
"Kurse",
|
|
2473
|
-
"Kurser",
|
|
2474
|
-
"Kursi",
|
|
2475
|
-
"Kurslar",
|
|
2476
|
-
"Kurssit",
|
|
2477
|
-
"Kursus",
|
|
2478
|
-
"Kursused",
|
|
2479
|
-
"Kursy",
|
|
2480
|
-
"Kurzy",
|
|
2481
|
-
"Laidos",
|
|
2482
|
-
"Layanan",
|
|
2483
|
-
"Licenciaturas",
|
|
2484
|
-
"Liputan insurans",
|
|
2485
|
-
"Lisans programlar\u0131",
|
|
2486
|
-
"Lis\xE4palvelut",
|
|
2487
|
-
"Lokalomr\xE5der",
|
|
2488
|
-
"Lo\u1EA1i",
|
|
2489
|
-
"Mahalleler",
|
|
2490
|
-
"Marcas",
|
|
2491
|
-
"Markalar",
|
|
2492
|
-
"Marken",
|
|
2493
|
-
"Marki",
|
|
2494
|
-
"Marques",
|
|
2495
|
-
"Mata pelajaran",
|
|
2496
|
-
"Merek",
|
|
2497
|
-
"Merken",
|
|
2498
|
-
"Merkevarer",
|
|
2499
|
-
"Mga Amenity",
|
|
2500
|
-
"Mga Brand",
|
|
2501
|
-
"Mga Destinasyon",
|
|
2502
|
-
"Mga Istilo",
|
|
2503
|
-
"Mga Komunidad",
|
|
2504
|
-
"Mga Kurso",
|
|
2505
|
-
"Mga Modelo",
|
|
2506
|
-
"Mga Palabas",
|
|
2507
|
-
"Mga Serbisyo",
|
|
2508
|
-
"Mga Uri",
|
|
2509
|
-
"Mga degree program",
|
|
2510
|
-
"Miejsca",
|
|
2511
|
-
"Model",
|
|
2512
|
-
"Modele",
|
|
2513
|
-
"Modeli",
|
|
2514
|
-
"Modeliai",
|
|
2515
|
-
"Modelle",
|
|
2516
|
-
"Modellek",
|
|
2517
|
-
"Modellen",
|
|
2518
|
-
"Modeller",
|
|
2519
|
-
"Modelli",
|
|
2520
|
-
"Modelos",
|
|
2521
|
-
"Modely",
|
|
2522
|
-
"Mode\u013Ci",
|
|
2523
|
-
"Mod\xE8les",
|
|
2524
|
-
"Moksliniai laipsniai",
|
|
2525
|
-
"Mudelid",
|
|
2526
|
-
"Mugavusteenused",
|
|
2527
|
-
"M\xE1rk\xE1k",
|
|
2528
|
-
"M\u0103rci",
|
|
2529
|
-
"M\u0171sorok",
|
|
2530
|
-
"Nabolag",
|
|
2531
|
-
"Nam\u0173 apylink\u0117s",
|
|
2532
|
-
"Neighbourhoods",
|
|
2533
|
-
"Oddaje",
|
|
2534
|
-
"Odpor\xFA\u010Dan\xE9 hotely",
|
|
2535
|
-
"Odredi\u0161ta",
|
|
2536
|
-
"Oppiaineet",
|
|
2537
|
-
"Osiguranje",
|
|
2538
|
-
"Pakalpojumi",
|
|
2539
|
-
"Palvelut",
|
|
2540
|
-
"Paskirties vietos",
|
|
2541
|
-
"Paslaugos",
|
|
2542
|
-
"Patogumai",
|
|
2543
|
-
"Perkhidmatan",
|
|
2544
|
-
"Ph\u1EA1m vi b\u1EA3o hi\u1EC3m",
|
|
2545
|
-
"Pied\u0101v\u0101t\u0101s viesn\u012Bcas",
|
|
2546
|
-
"Poistenie",
|
|
2547
|
-
"Poji\u0161t\u011Bn\xED",
|
|
2548
|
-
"Polecane hotele",
|
|
2549
|
-
"Ponudba",
|
|
2550
|
-
"Po\u0159ady",
|
|
2551
|
-
"Predstavljeni hoteli",
|
|
2552
|
-
"Preki\u0173 \u017Eenklai",
|
|
2553
|
-
"Program",
|
|
2554
|
-
"Program ijazah",
|
|
2555
|
-
"Program sarjana",
|
|
2556
|
-
"Programas",
|
|
2557
|
-
"Programas de gradua\xE7\xE3o",
|
|
2558
|
-
"Programe de studiu",
|
|
2559
|
-
"Programes",
|
|
2560
|
-
"Programlar",
|
|
2561
|
-
"Programmer",
|
|
2562
|
-
"Programmes d'\xE9tudes",
|
|
2563
|
-
"Programmi",
|
|
2564
|
-
"Programy",
|
|
2565
|
-
"P\u0101rraides",
|
|
2566
|
-
"Quartieri",
|
|
2567
|
-
"Quartiers",
|
|
2568
|
-
"Rancangan",
|
|
2569
|
-
"Rel\xE1cie",
|
|
2570
|
-
"Resm\xE5l",
|
|
2571
|
-
"Robne marke",
|
|
2572
|
-
"Saated ja etendused",
|
|
2573
|
-
"Sadr\u017Eaji",
|
|
2574
|
-
"Sakop ng insurance",
|
|
2575
|
-
"Serien",
|
|
2576
|
-
"Serier",
|
|
2577
|
-
"Serveis",
|
|
2578
|
-
"Serveis addicionals",
|
|
2579
|
-
"Servicii",
|
|
2580
|
-
"Servicios",
|
|
2581
|
-
"Servicios adicionales",
|
|
2582
|
-
"Servizi",
|
|
2583
|
-
"Servi\xE7os",
|
|
2584
|
-
"Show't",
|
|
2585
|
-
"Sigorta kapsam\u0131",
|
|
2586
|
-
"Sihtkohad",
|
|
2587
|
-
"Si\u016Blomi vie\u0161bu\u010Diai",
|
|
2588
|
-
"Slogi",
|
|
2589
|
-
"Slu\u017Eby",
|
|
2590
|
-
"Soovitatud hotellid",
|
|
2591
|
-
"Soseske",
|
|
2592
|
-
"Stiilid",
|
|
2593
|
-
"Stijlen",
|
|
2594
|
-
"Stilar",
|
|
2595
|
-
"Stile",
|
|
2596
|
-
"Stiler",
|
|
2597
|
-
"Stili",
|
|
2598
|
-
"Stiliai",
|
|
2599
|
-
"Stiller",
|
|
2600
|
-
"Stilovi",
|
|
2601
|
-
"Stiluri",
|
|
2602
|
-
"Storitve",
|
|
2603
|
-
"Studieng\xE4nge",
|
|
2604
|
-
"Studieprogramma's",
|
|
2605
|
-
"Studijn\xED programy",
|
|
2606
|
-
"Studijski programi",
|
|
2607
|
-
"Studiju programmas",
|
|
2608
|
-
"Style",
|
|
2609
|
-
"Styly",
|
|
2610
|
-
"St\xEDlusok",
|
|
2611
|
-
"Sunulan olanaklar",
|
|
2612
|
-
"Suositellut hotellit",
|
|
2613
|
-
"Szolg\xE1ltat\xE1sok",
|
|
2614
|
-
"S\xE9lection d'h\xF4tels",
|
|
2615
|
-
"Tanfolyamok",
|
|
2616
|
-
"Teenused",
|
|
2617
|
-
"Te\u010Dajevi",
|
|
2618
|
-
"Te\u010Daji",
|
|
2619
|
-
"Th\u01B0\u01A1ng hi\u1EC7u",
|
|
2620
|
-
"Tipai",
|
|
2621
|
-
"Tipi",
|
|
2622
|
-
"Tipos",
|
|
2623
|
-
"Tipuri",
|
|
2624
|
-
"Tipus",
|
|
2625
|
-
"Titulacions",
|
|
2626
|
-
"Ti\u1EC7n nghi",
|
|
2627
|
-
"Tjenester",
|
|
2628
|
-
"Tj\xE4nster",
|
|
2629
|
-
"Typen",
|
|
2630
|
-
"Typer",
|
|
2631
|
-
"Typy",
|
|
2632
|
-
"Tyylit",
|
|
2633
|
-
"Tyypit",
|
|
2634
|
-
"T\xEDpusok",
|
|
2635
|
-
"T\xFCrler",
|
|
2636
|
-
"T\xFC\xFCbid",
|
|
2637
|
-
"Ubezpieczenia",
|
|
2638
|
-
"Uddannelser",
|
|
2639
|
-
"Udogodnienia",
|
|
2640
|
-
"Udvalgte hoteller",
|
|
2641
|
-
"Usluge",
|
|
2642
|
-
"Us\u0142ugi",
|
|
2643
|
-
"Utbildningsprogram",
|
|
2644
|
-
"Utdanningsprogrammer",
|
|
2645
|
-
"Utvalda hotell",
|
|
2646
|
-
"Utvalgte hoteller",
|
|
2647
|
-
"Vakuutukset",
|
|
2648
|
-
"Varum\xE4rken",
|
|
2649
|
-
"Veidi",
|
|
2650
|
-
"Versicherungsleistung",
|
|
2651
|
-
"Viertel",
|
|
2652
|
-
"Voorzieningen",
|
|
2653
|
-
"Vorgestellte Hotels",
|
|
2654
|
-
"Vrste",
|
|
2655
|
-
"Vybavenie",
|
|
2656
|
-
"Vybaven\xED",
|
|
2657
|
-
"Vybran\xE9 hotely",
|
|
2658
|
-
"Vzdel\xE1vacie programy",
|
|
2659
|
-
"V\xE1rosr\xE9szek",
|
|
2660
|
-
"V\xF9ng l\xE2n c\u1EADn",
|
|
2661
|
-
"Ziele",
|
|
2662
|
-
"Zna\u010Dky",
|
|
2663
|
-
"Zn\xE1m\xE9 oblasti",
|
|
2664
|
-
"Z\u012Bmoli",
|
|
2665
|
-
"destinasyonlar",
|
|
2666
|
-
"\xC9missions",
|
|
2667
|
-
"\xC9quipements",
|
|
2668
|
-
"\xD6ne \xE7\u0131kan oteller",
|
|
2669
|
-
"\xDAti c\xE9lok",
|
|
2670
|
-
"\xDCmbruskonnad",
|
|
2671
|
-
"\u010Cetvrti",
|
|
2672
|
-
"\u0110i\u1EC3m \u0111\u1EBFn",
|
|
2673
|
-
"\u0112rt\u012Bbas",
|
|
2674
|
-
"\u0160tudijski programi",
|
|
2675
|
-
"\u0160tvrte",
|
|
2676
|
-
"\u0160t\xFDly",
|
|
2677
|
-
"\u0391\u03C3\u03C6\u03B1\u03BB\u03B9\u03C3\u03C4\u03B9\u03BA\u03AE \u03BA\u03AC\u03BB\u03C5\u03C8\u03B7",
|
|
2678
|
-
"\u0393\u03B5\u03B9\u03C4\u03BF\u03BD\u03B9\u03AD\u03C2",
|
|
2679
|
-
"\u0395\u03BA\u03C0\u03BF\u03BC\u03C0\u03AD\u03C2",
|
|
2680
|
-
"\u0395\u03C0\u03C9\u03BD\u03C5\u03BC\u03AF\u03B5\u03C2",
|
|
2681
|
-
"\u039C\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03B1",
|
|
2682
|
-
"\u039C\u03BF\u03BD\u03C4\u03AD\u03BB\u03B1",
|
|
2683
|
-
"\u039E\u03B5\u03BD\u03BF\u03B4\u03BF\u03C7\u03B5\u03AF\u03B1",
|
|
2684
|
-
"\u03A0\u03B1\u03C1\u03BF\u03C7\u03AD\u03C2",
|
|
2685
|
-
"\u03A0\u03C1\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1 \u03C0\u03C4\u03C5\u03C7\u03AF\u03C9\u03BD",
|
|
2686
|
-
"\u03A0\u03C1\u03BF\u03BF\u03C1\u03B9\u03C3\u03BC\u03BF\u03AF",
|
|
2687
|
-
"\u03A3\u03C4\u03C5\u03BB",
|
|
2688
|
-
"\u03A4\u03CD\u03C0\u03BF\u03B9",
|
|
2689
|
-
"\u03A5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B5\u03C2",
|
|
2690
|
-
"\u0411\u0440\u0435\u043D\u0434\u0438",
|
|
2691
|
-
"\u0411\u0440\u0435\u043D\u0434\u044B",
|
|
2692
|
-
"\u0414\u0435\u0441\u0442\u0438\u043D\u0430\u0446\u0438\u0438",
|
|
2693
|
-
"\u0417\u0430\u0441\u0442\u0440\u0430\u0445\u043E\u0432\u043A\u0430",
|
|
2694
|
-
"\u0417\u0440\u0443\u0447\u043D\u043E\u0441\u0442\u0456",
|
|
2695
|
-
"\u041A\u0432\u0430\u0440\u0442\u0430\u043B\u0438",
|
|
2696
|
-
"\u041A\u0443\u0440\u0441\u0438",
|
|
2697
|
-
"\u041A\u0443\u0440\u0441\u043E\u0432\u0435",
|
|
2698
|
-
"\u041A\u0443\u0440\u0441\u044B",
|
|
2699
|
-
"\u041C\u0430\u0440\u043A\u0438",
|
|
2700
|
-
"\u041C\u0435\u0441\u0442\u0430",
|
|
2701
|
-
"\u041C\u043E\u0434\u0435\u043B\u0438",
|
|
2702
|
-
"\u041C\u043E\u0434\u0435\u043B\u0456",
|
|
2703
|
-
"\u041C\u0456\u0441\u0446\u044F",
|
|
2704
|
-
"\u041E\u0441\u0432\u0456\u0442\u043D\u0456 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438",
|
|
2705
|
-
"\u041F\u043E\u0441\u043B\u0443\u0433\u0438",
|
|
2706
|
-
"\u041F\u0440\u0435\u0434\u0430\u0432\u0430\u043D\u0438\u044F",
|
|
2707
|
-
"\u041F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0435\u043D\u0438 \u0445\u043E\u0442\u0435\u043B\u0438",
|
|
2708
|
-
"\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B \u0432\u044B\u0441\u0448\u0435\u0433\u043E \u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F",
|
|
2709
|
-
"\u0420\u0430\u0439\u043E\u043D\u044B",
|
|
2710
|
-
"\u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u0456 \u0433\u043E\u0442\u0435\u043B\u0456",
|
|
2711
|
-
"\u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u043C\u044B\u0435 \u043E\u0442\u0435\u043B\u0438",
|
|
2712
|
-
"\u0421\u043F\u0435\u0446\u0438\u0430\u043B\u043D\u043E\u0441\u0442\u0438",
|
|
2713
|
-
"\u0421\u0442\u0438\u043B\u0438",
|
|
2714
|
-
"\u0421\u0442\u0438\u043B\u043E\u0432\u0435",
|
|
2715
|
-
"\u0421\u0442\u0438\u043B\u0456",
|
|
2716
|
-
"\u0421\u0442\u0440\u0430\u0445\u043E\u0432\u0430\u044F \u0437\u0430\u0449\u0438\u0442\u0430",
|
|
2717
|
-
"\u0421\u0442\u0440\u0430\u0445\u043E\u0432\u0438\u0439 \u0437\u0430\u0445\u0438\u0441\u0442",
|
|
2718
|
-
"\u0422\u0438\u043F\u0438",
|
|
2719
|
-
"\u0422\u0438\u043F\u043E\u0432\u0435",
|
|
2720
|
-
"\u0422\u0438\u043F\u044B",
|
|
2721
|
-
"\u0423\u0434\u043E\u0431\u0441\u0442\u0432\u0430",
|
|
2722
|
-
"\u0423\u0441\u043B\u0443\u0433\u0438",
|
|
2723
|
-
"\u0428\u043E\u0443",
|
|
2724
|
-
"\u0431\u0440\u0435\u043D\u0434\u043E\u0432\u0438",
|
|
2725
|
-
"\u0434\u0435\u043B\u043E\u0432\u0438 \u0433\u0440\u0430\u0434\u0430",
|
|
2726
|
-
"\u0434\u0435\u0441\u0442\u0438\u043D\u0430\u0446\u0438\u0458\u0435",
|
|
2727
|
-
"\u0434\u0438\u043F\u043B\u043E\u043C\u0435",
|
|
2728
|
-
"\u0435\u043C\u0438\u0441\u0438\u0458\u0435",
|
|
2729
|
-
"\u0438\u0441\u0442\u0430\u043A\u043D\u0443\u0442\u0438 \u0445\u043E\u0442\u0435\u043B\u0438",
|
|
2730
|
-
"\u043A\u0443\u0440\u0441\u0435\u0432\u0438",
|
|
2731
|
-
"\u043C\u043E\u0434\u0435\u043B\u0438",
|
|
2732
|
-
"\u043E\u0441\u0438\u0433\u0443\u0440\u0430\u045A\u0435",
|
|
2733
|
-
"\u0441\u0430\u0434\u0440\u0436\u0430\u0458\u0438",
|
|
2734
|
-
"\u0441\u0442\u0438\u043B\u043E\u0432\u0438",
|
|
2735
|
-
"\u0442\u0438\u043F\u043E\u0432\u0438",
|
|
2736
|
-
"\u0443\u0441\u043B\u0443\u0433\u0435",
|
|
2737
|
-
"\u05D3\u05D2\u05DE\u05D9\u05DD",
|
|
2738
|
-
"\u05D4\u05D5\u05E4\u05E2\u05D5\u05EA \u05D5\u05EA\u05D5\u05DB\u05E0\u05D9\u05D5\u05EA",
|
|
2739
|
-
"\u05D9\u05E2\u05D3\u05D9\u05DD \u05D2\u05D9\u05D0\u05D5\u05D2\u05E8\u05E4\u05D9\u05D9\u05DD",
|
|
2740
|
-
"\u05DB\u05D9\u05E1\u05D5\u05D9 \u05D1\u05D9\u05D8\u05D5\u05D7\u05D9",
|
|
2741
|
-
"\u05DE\u05D5\u05EA\u05D2\u05D9\u05DD",
|
|
2742
|
-
"\u05DE\u05DC\u05D5\u05E0\u05D5\u05EA \u05DE\u05D5\u05DE\u05DC\u05E6\u05D9\u05DD",
|
|
2743
|
-
"\u05E1\u05D2\u05E0\u05D5\u05E0\u05D5\u05EA",
|
|
2744
|
-
"\u05E1\u05D5\u05D2\u05D9\u05DD",
|
|
2745
|
-
"\u05E7\u05D5\u05E8\u05E1\u05D9\u05DD",
|
|
2746
|
-
"\u05E9\u05D9\u05E8\u05D5\u05EA\u05D9 \u05D4\u05DE\u05E7\u05D5\u05DD",
|
|
2747
|
-
"\u05E9\u05D9\u05E8\u05D5\u05EA\u05D9\u05DD",
|
|
2748
|
-
"\u05E9\u05DB\u05D5\u05E0\u05D5\u05EA",
|
|
2749
|
-
"\u05EA\u05D5\u05DB\u05E0\u05D9\u05D5\u05EA \u05DC\u05DC\u05D9\u05DE\u05D5\u05D3\u05D9 \u05EA\u05D5\u05D0\u05E8",
|
|
2750
|
-
"\u0627\u0644\u0623\u062D\u064A\u0627\u0621",
|
|
2751
|
-
"\u0627\u0644\u0623\u0646\u0645\u0627\u0637",
|
|
2752
|
-
"\u0627\u0644\u0623\u0646\u0648\u0627\u0639",
|
|
2753
|
-
"\u0627\u0644\u062A\u063A\u0637\u064A\u0629 \u0627\u0644\u062A\u0623\u0645\u064A\u0646\u064A\u0629",
|
|
2754
|
-
"\u0627\u0644\u062E\u062F\u0645\u0627\u062A",
|
|
2755
|
-
"\u0627\u0644\u062F\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u062F\u0631\u064A\u0628\u064A\u0629",
|
|
2756
|
-
"\u0627\u0644\u0639\u0631\u0648\u0636",
|
|
2757
|
-
"\u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062A \u0627\u0644\u062A\u062C\u0627\u0631\u064A\u0629",
|
|
2758
|
-
"\u0627\u0644\u0641\u0646\u0627\u062F\u0642 \u0627\u0644\u0645\u0645\u064A\u0651\u0632\u0629",
|
|
2759
|
-
"\u0627\u0644\u0646\u0645\u0627\u0630\u062C",
|
|
2760
|
-
"\u0627\u0644\u0648\u062C\u0647\u0627\u062A",
|
|
2761
|
-
"\u0628\u0631\u0627\u0645\u062C \u0627\u0644\u0634\u0647\u0627\u062F\u0627\u062A",
|
|
2762
|
-
"\u0648\u0633\u0627\u0626\u0644 \u0627\u0644\u0631\u0627\u062D\u0629",
|
|
2763
|
-
"\u0906\u0938-\u092A\u0921\u093C\u094B\u0938",
|
|
2764
|
-
"\u0917\u0902\u0924\u0935\u094D\u092F",
|
|
2765
|
-
"\u0921\u093F\u0917\u094D\u0930\u0940 \u0915\u093E\u0930\u094D\u092F\u0915\u094D\u0930\u092E",
|
|
2766
|
-
"\u092A\u093E\u0920\u094D\u200D\u092F\u0915\u094D\u0930\u092E",
|
|
2767
|
-
"\u092A\u094D\u0930\u0915\u093E\u0930",
|
|
2768
|
-
"\u092A\u094D\u0930\u0926\u0930\u094D\u0936\u093F\u0924 \u0939\u094B\u091F\u0932",
|
|
2769
|
-
"\u092C\u0940\u092E\u093E \u0915\u0935\u0930\u0947\u091C",
|
|
2770
|
-
"\u092C\u094D\u0930\u093E\u0902\u0921",
|
|
2771
|
-
"\u092E\u0949\u0921\u0932",
|
|
2772
|
-
"\u0936\u0948\u0932\u093F\u092F\u093E\u0902",
|
|
2773
|
-
"\u0936\u094B",
|
|
2774
|
-
"\u0938\u0941\u0935\u093F\u0927\u093E\u090F\u0902",
|
|
2775
|
-
"\u0938\u0947\u0935\u093E\u090F\u0902",
|
|
2776
|
-
"\u0E04\u0E27\u0E32\u0E21\u0E04\u0E38\u0E49\u0E21\u0E04\u0E23\u0E2D\u0E07\u0E43\u0E19\u0E1B\u0E23\u0E30\u0E01\u0E31\u0E19",
|
|
2777
|
-
"\u0E1A\u0E23\u0E34\u0E01\u0E32\u0E23",
|
|
2778
|
-
"\u0E1B\u0E23\u0E30\u0E40\u0E20\u0E17",
|
|
2779
|
-
"\u0E1B\u0E25\u0E32\u0E22\u0E17\u0E32\u0E07",
|
|
2780
|
-
"\u0E22\u0E48\u0E32\u0E19\u0E43\u0E01\u0E25\u0E49\u0E40\u0E04\u0E35\u0E22\u0E07",
|
|
2781
|
-
"\u0E23\u0E38\u0E48\u0E19",
|
|
2782
|
-
"\u0E2A\u0E34\u0E48\u0E07\u0E2D\u0E33\u0E19\u0E27\u0E22\u0E04\u0E27\u0E32\u0E21\u0E2A\u0E30\u0E14\u0E27\u0E01",
|
|
2783
|
-
"\u0E2A\u0E44\u0E15\u0E25\u0E4C",
|
|
2784
|
-
"\u0E2B\u0E25\u0E31\u0E01\u0E2A\u0E39\u0E15\u0E23",
|
|
2785
|
-
"\u0E2B\u0E25\u0E31\u0E01\u0E2A\u0E39\u0E15\u0E23\u0E1B\u0E23\u0E34\u0E0D\u0E0D\u0E32",
|
|
2786
|
-
"\u0E41\u0E1A\u0E23\u0E19\u0E14\u0E4C",
|
|
2787
|
-
"\u0E42\u0E0A\u0E27\u0E4C",
|
|
2788
|
-
"\u0E42\u0E23\u0E07\u0E41\u0E23\u0E21\u0E40\u0E14\u0E48\u0E19",
|
|
2789
|
-
"\u304A\u3059\u3059\u3081\u306E\u30DB\u30C6\u30EB",
|
|
2790
|
-
"\u30B3\u30FC\u30B9",
|
|
2791
|
-
"\u30B5\u30FC\u30D3\u30B9",
|
|
2792
|
-
"\u30B9\u30BF\u30A4\u30EB",
|
|
2793
|
-
"\u30BF\u30A4\u30D7",
|
|
2794
|
-
"\u30D6\u30E9\u30F3\u30C9",
|
|
2795
|
-
"\u30E2\u30C7\u30EB",
|
|
2796
|
-
"\u4FDD\u967A\u306E\u4FDD\u969C",
|
|
2797
|
-
"\u4FDD\u969C\u7BC4\u570D",
|
|
2798
|
-
"\u5230\u7740\u5730",
|
|
2799
|
-
"\u5468\u8FBA\u5730\u57DF",
|
|
2800
|
-
"\u54C1\u724C",
|
|
2801
|
-
"\u578B\u53F7",
|
|
2802
|
-
"\u578B\u865F",
|
|
2803
|
-
"\u5B66\u4F4D\u30D7\u30ED\u30B0\u30E9\u30E0",
|
|
2804
|
-
"\u5B66\u4F4D\u8BFE\u7A0B",
|
|
2805
|
-
"\u5B78\u4F4D\u8AB2\u7A0B",
|
|
2806
|
-
"\u627F\u4FDD\u7BC4\u570D",
|
|
2807
|
-
"\u670D\u52A1",
|
|
2808
|
-
"\u670D\u52D9",
|
|
2809
|
-
"\u6B3E\u5F0F",
|
|
2810
|
-
"\u7279\u8272\u9152\u5E97",
|
|
2811
|
-
"\u756A\u7D44",
|
|
2812
|
-
"\u76EE\u7684\u5730",
|
|
2813
|
-
"\u793E\u533A",
|
|
2814
|
-
"\u793E\u5340",
|
|
2815
|
-
"\u7BC0\u76EE",
|
|
2816
|
-
"\u7C7B\u578B",
|
|
2817
|
-
"\u7CBE\u9009\u9152\u5E97",
|
|
2818
|
-
"\u7CBE\u9078\u98EF\u5E97",
|
|
2819
|
-
"\u8282\u76EE",
|
|
2820
|
-
"\u8A2D\u5099",
|
|
2821
|
-
"\u8A2D\u65BD",
|
|
2822
|
-
"\u8AB2\u7A0B",
|
|
2823
|
-
"\u8BBE\u65BD",
|
|
2824
|
-
"\u8BFE\u7A0B",
|
|
2825
|
-
"\u9669\u79CD",
|
|
2826
|
-
"\u985E\u578B",
|
|
2827
|
-
"\uACFC\uC815",
|
|
2828
|
-
"\uBAA8\uB378",
|
|
2829
|
-
"\uBAA9\uC801\uC9C0",
|
|
2830
|
-
"\uBCF4\uD5D8 \uBCF4\uC0C1 \uBC94\uC704",
|
|
2831
|
-
"\uBE0C\uB79C\uB4DC",
|
|
2832
|
-
"\uC11C\uBE44\uC2A4",
|
|
2833
|
-
"\uC2A4\uD0C0\uC77C",
|
|
2834
|
-
"\uC720\uD615",
|
|
2835
|
-
"\uC778\uADFC \uC9C0\uC5ED",
|
|
2836
|
-
"\uCD94\uCC9C \uD638\uD154",
|
|
2837
|
-
"\uD3B8\uC758 \uC2DC\uC124",
|
|
2838
|
-
"\uD504\uB85C\uADF8\uB7A8",
|
|
2839
|
-
"\uD559\uC704 \uCDE8\uB4DD \uD504\uB85C\uADF8\uB7A8"
|
|
2840
|
-
];
|
|
2841
|
-
var HEADER_ALIASES = /* @__PURE__ */ new Map([["service catalog", "Services"]]);
|
|
2842
|
-
var ACCEPTED = /* @__PURE__ */ new Set([...STRUCTURED_SNIPPET_HEADERS_EN, ...STRUCTURED_SNIPPET_HEADERS_LOCALIZED]);
|
|
2843
|
-
var BY_FOLDED_CASE = new Map([...ACCEPTED].map((header) => [header.toLowerCase(), header]));
|
|
2844
|
-
function canonicalStructuredSnippetHeader(header) {
|
|
2845
|
-
const trimmed = header.trim();
|
|
2846
|
-
if (ACCEPTED.has(trimmed)) {
|
|
2847
|
-
return trimmed;
|
|
2848
|
-
}
|
|
2849
|
-
const folded = trimmed.toLowerCase();
|
|
2850
|
-
return HEADER_ALIASES.get(folded) ?? BY_FOLDED_CASE.get(folded);
|
|
2851
|
-
}
|
|
2852
|
-
|
|
2853
|
-
// ../api/src/ads-google/ops.ts
|
|
2854
|
-
import { z as z4 } from "zod";
|
|
2855
|
-
var tempRefSchema = z4.string().regex(TEMP_REF_REGEX, "expected a g_temp_* reference");
|
|
2856
|
-
var refSchema2 = z4.union([
|
|
2857
|
-
z4.string().regex(RESOURCE_NAME_REGEX, "expected a customers/\u2026/\u2026/\u2026 resource name"),
|
|
2858
|
-
z4.string().regex(NUMERIC_ID_REGEX, "expected a numeric id"),
|
|
2859
|
-
tempRefSchema
|
|
2860
|
-
]);
|
|
2861
|
-
var targetRefSchema = refSchema2;
|
|
2862
|
-
var microsSchema = z4.number().int().positive("expected a positive micros amount");
|
|
2863
|
-
var httpsUrlSchema = z4.string().url().refine((u) => u.startsWith("https://"), "final URLs must be https");
|
|
2864
|
-
var customerIdSchema = z4.string().regex(NUMERIC_ID_REGEX, "customerId must be the bare numeric customer id");
|
|
2865
|
-
var stageableStatusSchema = z4.enum(STAGEABLE_CREATE_STATUSES);
|
|
2866
|
-
var matchTypeSchema = z4.enum(KEYWORD_MATCH_TYPES);
|
|
2867
|
-
var finalUrlSuffixSchema = z4.string().max(GOOGLE_ADS_LIMITS.campaign.finalUrlSuffixMax).refine((s) => !/^[?&]/.test(s), "drop the leading ? or & \u2014 a final URL suffix is bare query parameters").refine((s) => !s.includes("{lpurl}"), "{lpurl} belongs in a tracking template, not in a final URL suffix").refine((s) => !/\s/.test(s), "a final URL suffix cannot contain whitespace").refine((s) => s === "" || s.includes("="), 'expected key=value pairs, e.g. "utm_source=google&utm_agency=baker"');
|
|
2868
|
-
var LANDING_PAGE_TAGS = ["{lpurl}", "{unescapedlpurl}", "{escapedlpurl}", "{lpurl+2}", "{lpurl+3}"];
|
|
2869
|
-
var trackingUrlTemplateSchema = z4.string().max(GOOGLE_ADS_LIMITS.campaign.trackingUrlTemplateMax).refine((t) => !/\s/.test(t), "a tracking template cannot contain whitespace").refine(
|
|
2870
|
-
(t) => t === "" || LANDING_PAGE_TAGS.some((tag) => t.includes(tag)),
|
|
2871
|
-
`a tracking template must carry the landing page through one of ${LANDING_PAGE_TAGS.join(", ")}, e.g. "https://tracker.example/?url={lpurl}"`
|
|
2872
|
-
).refine(
|
|
2873
|
-
(t) => t === "" || /^(https?:\/\/|\{)/.test(t),
|
|
2874
|
-
"a tracking template must start with http://, https:// or a {lpurl} tag"
|
|
2875
|
-
);
|
|
2876
|
-
var urlCustomParametersSchema = z4.array(
|
|
2877
|
-
z4.strictObject({
|
|
2878
|
-
key: z4.string().min(1).max(GOOGLE_ADS_LIMITS.campaign.urlCustomParameterKeyMax).regex(/^[A-Za-z0-9_]+$/, "a custom parameter key is letters, digits and underscores only"),
|
|
2879
|
-
value: z4.string().max(GOOGLE_ADS_LIMITS.campaign.urlCustomParameterValueMax)
|
|
2880
|
-
})
|
|
2881
|
-
).max(GOOGLE_ADS_LIMITS.campaign.urlCustomParametersMax).refine(
|
|
2882
|
-
(params) => new Set(params.map((p) => p.key)).size === params.length,
|
|
2883
|
-
"each custom parameter key can appear only once"
|
|
2884
|
-
);
|
|
2885
|
-
var keywordTextSchema = z4.string().min(1).max(GOOGLE_ADS_LIMITS.keyword.textMax).refine((t) => t.trim().split(/\s+/).length <= GOOGLE_ADS_LIMITS.keyword.wordsMax, "keyword exceeds 10 words");
|
|
2886
|
-
var deliveryMethodSchema = z4.enum(BUDGET_DELIVERY_METHODS, {
|
|
2887
|
-
error: retiredChoiceError({ ACCELERATED: ACCELERATED_DELIVERY_MESSAGE })
|
|
2888
|
-
});
|
|
2889
|
-
var TOTAL_BUDGET_NOT_SHARED_MESSAGE = "a total budget belongs to one campaign and cannot be shared \u2014 leave explicitlyShared out";
|
|
2890
|
-
var ONE_BUDGET_AMOUNT_MESSAGE = "set amountMicros (a daily budget) OR totalAmountMicros (one total for the campaign's whole flight), not both";
|
|
2891
|
-
var budgetCreateSchema = z4.strictObject({
|
|
2892
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.budget.nameMax),
|
|
2893
|
-
amountMicros: microsSchema.optional(),
|
|
2894
|
-
/** A total for the campaign's whole flight instead of a daily amount (needs the campaign's end date). */
|
|
2895
|
-
totalAmountMicros: microsSchema.optional(),
|
|
2896
|
-
deliveryMethod: deliveryMethodSchema.default("STANDARD"),
|
|
2897
|
-
explicitlyShared: z4.boolean().default(false)
|
|
2898
|
-
}).superRefine((p, ctx) => {
|
|
2899
|
-
if (p.amountMicros === void 0 === (p.totalAmountMicros === void 0)) {
|
|
2900
|
-
ctx.addIssue({ code: "custom", path: ["amountMicros"], message: ONE_BUDGET_AMOUNT_MESSAGE });
|
|
2901
|
-
}
|
|
2902
|
-
if (p.totalAmountMicros !== void 0 && p.explicitlyShared) {
|
|
2903
|
-
ctx.addIssue({ code: "custom", path: ["explicitlyShared"], message: TOTAL_BUDGET_NOT_SHARED_MESSAGE });
|
|
2904
|
-
}
|
|
2905
|
-
});
|
|
2906
|
-
var budgetUpdateSchema = z4.strictObject({
|
|
2907
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.budget.nameMax).optional(),
|
|
2908
|
-
amountMicros: microsSchema.optional(),
|
|
2909
|
-
/** A total budget's new total. A budget's kind (daily or total) never changes after it is created. */
|
|
2910
|
-
totalAmountMicros: microsSchema.optional(),
|
|
2911
|
-
deliveryMethod: deliveryMethodSchema.optional()
|
|
2912
|
-
}).superRefine((p, ctx) => {
|
|
2913
|
-
if (Object.values(p).every((v) => v === void 0)) {
|
|
2914
|
-
ctx.addIssue({ code: "custom", message: "update needs at least one field" });
|
|
2915
|
-
}
|
|
2916
|
-
if (p.amountMicros !== void 0 && p.totalAmountMicros !== void 0) {
|
|
2917
|
-
ctx.addIssue({ code: "custom", path: ["amountMicros"], message: ONE_BUDGET_AMOUNT_MESSAGE });
|
|
2918
|
-
}
|
|
2919
|
-
});
|
|
2920
|
-
var biddingConfigSchema = z4.strictObject({
|
|
2921
|
-
type: z4.enum(BIDDING_STRATEGY_TYPES),
|
|
2922
|
-
targetCpaMicros: microsSchema.optional(),
|
|
2923
|
-
targetRoas: z4.number().positive().optional(),
|
|
2924
|
-
/** Demand Gen only — `Campaign.target_cpc.target_cpc_micros`. */
|
|
2925
|
-
targetCpcMicros: microsSchema.optional(),
|
|
2926
|
-
cpcBidCeilingMicros: microsSchema.optional(),
|
|
2927
|
-
enhancedCpcEnabled: z4.boolean().optional(),
|
|
2928
|
-
/** Target impression share: where on the page the share is counted. */
|
|
2929
|
-
location: z4.enum(TARGET_IMPRESSION_SHARE_LOCATIONS).optional(),
|
|
2930
|
-
/** Target impression share: the share to reach, in millionths (700000 = 70%). */
|
|
2931
|
-
locationFractionMicros: z4.number().int().min(1).max(1e6).optional()
|
|
2932
|
-
}).superRefine((p, ctx) => {
|
|
2933
|
-
if (p.type !== "TARGET_IMPRESSION_SHARE" && (p.location !== void 0 || p.locationFractionMicros !== void 0)) {
|
|
2934
|
-
ctx.addIssue({
|
|
2935
|
-
code: "custom",
|
|
2936
|
-
path: ["location"],
|
|
2937
|
-
message: "location and locationFractionMicros belong to TARGET_IMPRESSION_SHARE only"
|
|
2938
|
-
});
|
|
2939
|
-
}
|
|
2940
|
-
if (p.type === "TARGET_CPA" && p.targetCpaMicros === void 0) {
|
|
2941
|
-
ctx.addIssue({ code: "custom", path: ["targetCpaMicros"], message: "TARGET_CPA needs targetCpaMicros" });
|
|
2942
|
-
}
|
|
2943
|
-
if (p.type === "TARGET_ROAS" && p.targetRoas === void 0) {
|
|
2944
|
-
ctx.addIssue({ code: "custom", path: ["targetRoas"], message: "TARGET_ROAS needs targetRoas" });
|
|
2945
|
-
}
|
|
2946
|
-
if (p.type === "TARGET_CPC" && p.targetCpcMicros === void 0) {
|
|
2947
|
-
ctx.addIssue({ code: "custom", path: ["targetCpcMicros"], message: "TARGET_CPC needs targetCpcMicros" });
|
|
2948
|
-
}
|
|
2949
|
-
});
|
|
2950
|
-
var TARGET_IMPRESSION_SHARE_FIELDS = [
|
|
2951
|
-
["location", "where on the page \u2014 ANYWHERE_ON_PAGE, TOP_OF_PAGE or ABSOLUTE_TOP_OF_PAGE"],
|
|
2952
|
-
["locationFractionMicros", "the share to reach, in millionths (700000 = 70%)"],
|
|
2953
|
-
["cpcBidCeilingMicros", "the max CPC Google may bid to reach it"]
|
|
2954
|
-
];
|
|
2955
|
-
function addTargetImpressionShareIssues(bidding, path, ctx) {
|
|
2956
|
-
if (bidding?.type !== "TARGET_IMPRESSION_SHARE") {
|
|
2957
|
-
return;
|
|
2958
|
-
}
|
|
2959
|
-
for (const [field, meaning] of TARGET_IMPRESSION_SHARE_FIELDS) {
|
|
2960
|
-
if (bidding[field] === void 0) {
|
|
2961
|
-
ctx.addIssue({
|
|
2962
|
-
code: "custom",
|
|
2963
|
-
path: [path, field],
|
|
2964
|
-
message: `Target impression share needs ${field}: ${meaning}`
|
|
2965
|
-
});
|
|
2966
|
-
}
|
|
2967
|
-
}
|
|
2968
|
-
}
|
|
2969
|
-
var networkSettingsSchema = z4.strictObject({
|
|
2970
|
-
targetGoogleSearch: z4.boolean().optional(),
|
|
2971
|
-
targetSearchNetwork: z4.boolean().optional(),
|
|
2972
|
-
targetContentNetwork: z4.boolean().optional(),
|
|
2973
|
-
targetPartnerSearchNetwork: z4.boolean().optional()
|
|
2974
|
-
});
|
|
2975
|
-
var dateSchema = z4.string().regex(/^\d{4}-\d{2}-\d{2}$/, "expected a YYYY-MM-DD date");
|
|
2976
|
-
var geoTargetTypeSettingSchema = z4.strictObject({
|
|
2977
|
-
positiveGeoTargetType: z4.enum(POSITIVE_GEO_TARGET_TYPES).optional(),
|
|
2978
|
-
negativeGeoTargetType: z4.enum(NEGATIVE_GEO_TARGET_TYPES).optional()
|
|
2979
|
-
}).refine(
|
|
2980
|
-
(p) => p.positiveGeoTargetType !== void 0 || p.negativeGeoTargetType !== void 0,
|
|
2981
|
-
"geoTargetTypeSetting needs positiveGeoTargetType and/or negativeGeoTargetType"
|
|
2982
|
-
);
|
|
2983
|
-
var textGuidelinesSchema = z4.strictObject({
|
|
2984
|
-
termExclusions: z4.array(z4.string().trim().min(1).max(GOOGLE_ADS_LIMITS.campaign.termExclusionMax)).max(GOOGLE_ADS_LIMITS.campaign.termExclusionsMax).optional(),
|
|
2985
|
-
messagingRestrictions: z4.array(z4.string().trim().min(1).max(GOOGLE_ADS_LIMITS.campaign.messagingRestrictionMax)).max(GOOGLE_ADS_LIMITS.campaign.messagingRestrictionsMax).refine(
|
|
2986
|
-
(rules) => new Set(rules.map((rule) => rule.toLowerCase())).size === rules.length,
|
|
2987
|
-
"each messaging restriction must be unique"
|
|
2988
|
-
).optional()
|
|
2989
|
-
}).refine(
|
|
2990
|
-
(p) => p.termExclusions !== void 0 || p.messagingRestrictions !== void 0,
|
|
2991
|
-
"textGuidelines needs termExclusions and/or messagingRestrictions"
|
|
2992
|
-
);
|
|
2993
|
-
var AI_MAX_TEXT_NEEDS_AI_MAX_MESSAGE = "AI Max text customization only works with AI Max on: also turn AI Max on, or leave text customization off.";
|
|
2994
|
-
var AI_MAX_URL_NEEDS_TEXT_MESSAGE = "AI Max final URL expansion only works with text customization on: also turn text customization on, or leave URL expansion off.";
|
|
2995
|
-
var aiMaxSchema = z4.strictObject({
|
|
2996
|
-
enabled: z4.boolean().optional(),
|
|
2997
|
-
textCustomization: z4.boolean().optional(),
|
|
2998
|
-
finalUrlExpansion: z4.boolean().optional()
|
|
2999
|
-
}).superRefine((p, ctx) => {
|
|
3000
|
-
if (p.enabled === void 0 && p.textCustomization === void 0 && p.finalUrlExpansion === void 0) {
|
|
3001
|
-
ctx.addIssue({ code: "custom", message: "aiMax needs enabled, textCustomization and/or finalUrlExpansion" });
|
|
3002
|
-
}
|
|
3003
|
-
if (p.enabled === false && p.textCustomization === true) {
|
|
3004
|
-
ctx.addIssue({ code: "custom", path: ["textCustomization"], message: AI_MAX_TEXT_NEEDS_AI_MAX_MESSAGE });
|
|
3005
|
-
}
|
|
3006
|
-
if (p.textCustomization === false && p.finalUrlExpansion === true) {
|
|
3007
|
-
ctx.addIssue({ code: "custom", path: ["finalUrlExpansion"], message: AI_MAX_URL_NEEDS_TEXT_MESSAGE });
|
|
3008
|
-
}
|
|
3009
|
-
});
|
|
3010
|
-
var AI_MAX_SEARCH_ONLY_MESSAGE = "AI Max exists only on Search campaigns.";
|
|
3011
|
-
function aiMaxCreateRefusal(channelType, aiMax) {
|
|
3012
|
-
if (!aiMax) {
|
|
3013
|
-
return void 0;
|
|
3014
|
-
}
|
|
3015
|
-
if (channelType !== "SEARCH") {
|
|
3016
|
-
return AI_MAX_SEARCH_ONLY_MESSAGE;
|
|
3017
|
-
}
|
|
3018
|
-
if (aiMax.enabled !== true && aiMax.textCustomization === true) {
|
|
3019
|
-
return AI_MAX_TEXT_NEEDS_AI_MAX_MESSAGE;
|
|
3020
|
-
}
|
|
3021
|
-
if (aiMax.textCustomization !== true && aiMax.finalUrlExpansion === true) {
|
|
3022
|
-
return AI_MAX_URL_NEEDS_TEXT_MESSAGE;
|
|
3023
|
-
}
|
|
3024
|
-
return void 0;
|
|
3025
|
-
}
|
|
3026
|
-
function createBiddingRefusal(channelType, channelSubType, bidding) {
|
|
3027
|
-
if (channelType === "PERFORMANCE_MAX" && bidding?.type === "MANUAL_CPC") {
|
|
3028
|
-
return "Performance Max does not support Manual CPC";
|
|
3029
|
-
}
|
|
3030
|
-
return mergedTargetStrategyRefusal(channelType, bidding?.type) ?? demandGenOnlyStrategyRefusal(channelType, bidding?.type) ?? manualCpcOnDemandGenRefusal(channelType, bidding?.type) ?? embeddedTargetOnDemandGenRefusal(channelType, bidding) ?? biddingMatrixRefusal({ channelType, channelSubType, strategy: bidding?.type }) ?? embeddedTargetRefusal(channelType, bidding);
|
|
3031
|
-
}
|
|
3032
|
-
var campaignCreateSchema = z4.strictObject({
|
|
3033
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.campaign.nameMax),
|
|
3034
|
-
channelType: z4.enum(ADVERTISING_CHANNEL_TYPES, { error: retiredChoiceError(CHANNEL_CREATE_REFUSALS) }),
|
|
3035
|
-
channelSubType: z4.enum(ADVERTISING_CHANNEL_SUB_TYPES, { error: retiredChoiceError(SUB_TYPE_CREATE_REFUSALS) }).optional(),
|
|
3036
|
-
budget: refSchema2,
|
|
3037
|
-
/** Inline standard bidding, or a portfolio strategy ref via biddingStrategy. */
|
|
3038
|
-
bidding: biddingConfigSchema.optional(),
|
|
3039
|
-
biddingStrategy: refSchema2.optional(),
|
|
3040
|
-
networkSettings: networkSettingsSchema.optional(),
|
|
3041
|
-
/**
|
|
3042
|
-
* "Location options". Omitted stages Google's own default — reach people *in or interested in*
|
|
3043
|
-
* the targeted locations — so pass `PRESENCE` explicitly when only people physically there count.
|
|
3044
|
-
*/
|
|
3045
|
-
geoTargetTypeSetting: geoTargetTypeSettingSchema.optional(),
|
|
3046
|
-
startDate: dateSchema.optional(),
|
|
3047
|
-
endDate: dateSchema.optional(),
|
|
3048
|
-
/** Campaign-level override of the account's final URL suffix — REPLACES it, never merges. */
|
|
3049
|
-
finalUrlSuffix: finalUrlSuffixSchema.optional(),
|
|
3050
|
-
/** Campaign-level override of the account's tracking template — REPLACES it, never merges. */
|
|
3051
|
-
trackingUrlTemplate: trackingUrlTemplateSchema.optional(),
|
|
3052
|
-
/** The `{_name}` parameters this campaign's tracking template and final URLs can reference. */
|
|
3053
|
-
urlCustomParameters: urlCustomParametersSchema.optional(),
|
|
3054
|
-
/** Advisory Google Ads UI objective — drives warnings, not sent to the API. */
|
|
3055
|
-
objective: z4.enum(CAMPAIGN_OBJECTIVES).optional(),
|
|
3056
|
-
/**
|
|
3057
|
-
* Whether the campaign contains EU political advertising. Google requires the declaration on
|
|
3058
|
-
* every campaign create (FieldError.REQUIRED without it); omitted means it does not.
|
|
3059
|
-
*/
|
|
3060
|
-
euPoliticalAds: z4.boolean().optional(),
|
|
3061
|
-
/** AI Max for Search. A new campaign has it off unless this turns it on. */
|
|
3062
|
-
aiMax: aiMaxSchema.optional(),
|
|
3063
|
-
/** Shopping (required) and Performance Max (optional, a retail campaign): the Merchant Center feed. */
|
|
3064
|
-
shoppingSetting: shoppingSettingSchema.optional(),
|
|
3065
|
-
/** App campaigns (MULTI_CHANNEL): the app, its store and the goal. Fixed at creation. */
|
|
3066
|
-
appCampaignSetting: appCampaignSettingSchema.optional(),
|
|
3067
|
-
/** App campaigns with an in-app or value goal: the app's conversion actions to optimize toward. */
|
|
3068
|
-
selectiveOptimization: selectiveOptimizationSchema.optional(),
|
|
3069
|
-
/** Travel campaigns: the linked travel account (Things to do). */
|
|
3070
|
-
travelCampaignSettings: travelCampaignSettingsSchema.optional(),
|
|
3071
|
-
/** Hotel campaigns: the linked Hotel Center account. */
|
|
3072
|
-
hotelSetting: hotelSettingSchema.optional(),
|
|
3073
|
-
/** Search: the site dynamic ads are built from. */
|
|
3074
|
-
dynamicSearchAdsSetting: dynamicSearchAdsSettingSchema.optional(),
|
|
3075
|
-
/** Display: how often one person sees the campaign's ads. */
|
|
3076
|
-
frequencyCaps: frequencyCapsSchema.optional(),
|
|
3077
|
-
/** Performance Max, or Search with AI Max + text customization: what Google's generated text must avoid. */
|
|
3078
|
-
textGuidelines: textGuidelinesSchema.optional(),
|
|
3079
|
-
/** Performance Max: what Google may generate (text, final URL expansion, image and video enhancements). */
|
|
3080
|
-
assetAutomation: assetAutomationSchema.optional(),
|
|
3081
|
-
/** Performance Max: brand guidelines (business name + logo as campaign assets, colors, font). */
|
|
3082
|
-
brandGuidelines: brandGuidelinesCreateSchema.optional(),
|
|
3083
|
-
status: stageableStatusSchema.default("PAUSED")
|
|
3084
|
-
}).superRefine((p, ctx) => {
|
|
3085
|
-
for (const issue of channelSettingsCreateIssues(p)) {
|
|
3086
|
-
ctx.addIssue({ code: "custom", path: issue.path, message: issue.message });
|
|
3087
|
-
}
|
|
3088
|
-
if (!p.bidding && !p.biddingStrategy) {
|
|
3089
|
-
ctx.addIssue({
|
|
3090
|
-
code: "custom",
|
|
3091
|
-
path: ["bidding"],
|
|
3092
|
-
message: "set an inline bidding strategy or reference a portfolio biddingStrategy"
|
|
3093
|
-
});
|
|
3094
|
-
}
|
|
3095
|
-
if (p.bidding && p.biddingStrategy) {
|
|
3096
|
-
ctx.addIssue({
|
|
3097
|
-
code: "custom",
|
|
3098
|
-
path: ["bidding"],
|
|
3099
|
-
message: "use inline bidding OR a portfolio biddingStrategy, not both"
|
|
3100
|
-
});
|
|
3101
|
-
}
|
|
3102
|
-
addTargetImpressionShareIssues(p.bidding, "bidding", ctx);
|
|
3103
|
-
const channelRefusal = createBiddingRefusal(p.channelType, p.channelSubType, p.bidding);
|
|
3104
|
-
if (channelRefusal) {
|
|
3105
|
-
ctx.addIssue({ code: "custom", path: ["bidding"], message: channelRefusal });
|
|
3106
|
-
}
|
|
3107
|
-
if (p.startDate && p.endDate && p.endDate <= p.startDate) {
|
|
3108
|
-
ctx.addIssue({ code: "custom", path: ["endDate"], message: "endDate must be after startDate" });
|
|
3109
|
-
}
|
|
3110
|
-
if (p.channelSubType && SUB_TYPE_CHANNEL[p.channelSubType] !== p.channelType) {
|
|
3111
|
-
ctx.addIssue({
|
|
3112
|
-
code: "custom",
|
|
3113
|
-
path: ["channelSubType"],
|
|
3114
|
-
message: `${p.channelSubType} is a ${SUB_TYPE_CHANNEL[p.channelSubType]} sub-type, not ${p.channelType} \u2014 leave the sub-type out for a standard ${p.channelType} campaign`
|
|
3115
|
-
});
|
|
3116
|
-
}
|
|
3117
|
-
const aiMaxRefusal = aiMaxCreateRefusal(p.channelType, p.aiMax);
|
|
3118
|
-
if (aiMaxRefusal) {
|
|
3119
|
-
ctx.addIssue({ code: "custom", path: ["aiMax"], message: aiMaxRefusal });
|
|
3120
|
-
}
|
|
3121
|
-
});
|
|
3122
|
-
var campaignUpdateSchema = z4.strictObject({
|
|
3123
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.campaign.nameMax).optional(),
|
|
3124
|
-
budget: refSchema2.optional(),
|
|
3125
|
-
/**
|
|
3126
|
-
* The campaign's own (standard) bidding. On a campaign that is on a portfolio strategy this also
|
|
3127
|
-
* takes it OFF the portfolio — the builder clears `bidding_strategy` with it.
|
|
3128
|
-
*/
|
|
3129
|
-
bidding: biddingConfigSchema.optional(),
|
|
3130
|
-
/**
|
|
3131
|
-
* Moves the campaign onto a portfolio bidding strategy (a ref: staged create, id or resource name).
|
|
3132
|
-
* `""` takes it off its portfolio — only beside `bidding`, the campaign's own bidding from then on
|
|
3133
|
-
* (staging adds it when `bidding` is staged on a campaign that is on a portfolio).
|
|
3134
|
-
*/
|
|
3135
|
-
biddingStrategy: z4.union([refSchema2, z4.literal("")]).optional(),
|
|
3136
|
-
networkSettings: networkSettingsSchema.optional(),
|
|
3137
|
-
/** Switches an existing campaign between "Presence or interest" and "Presence". */
|
|
3138
|
-
geoTargetTypeSetting: geoTargetTypeSettingSchema.optional(),
|
|
3139
|
-
startDate: dateSchema.optional(),
|
|
3140
|
-
endDate: dateSchema.optional(),
|
|
3141
|
-
/** Campaign-level override of the account's final URL suffix. `""` clears it back to the account value. */
|
|
3142
|
-
finalUrlSuffix: finalUrlSuffixSchema.optional(),
|
|
3143
|
-
/** Campaign-level tracking template. `""` clears it back to the account value. */
|
|
3144
|
-
trackingUrlTemplate: trackingUrlTemplateSchema.optional(),
|
|
3145
|
-
/** Replaces the campaign's custom parameters wholesale; `[]` removes them all. */
|
|
3146
|
-
urlCustomParameters: urlCustomParametersSchema.optional(),
|
|
3147
|
-
/** Corrects the campaign's EU political advertising declaration (true = contains, false = does not). */
|
|
3148
|
-
euPoliticalAds: z4.boolean().optional(),
|
|
3149
|
-
/** AI Max / Performance Max text guidelines. Google refuses them on a Search campaign without AI Max. */
|
|
3150
|
-
textGuidelines: textGuidelinesSchema.optional(),
|
|
3151
|
-
/** Turns AI Max or its features on or off. Search campaigns only (checked against the live channel). */
|
|
3152
|
-
aiMax: aiMaxSchema.optional(),
|
|
3153
|
-
/** Feed label (Shopping, Performance Max), priority and local inventory (Shopping). Checked against the live channel. */
|
|
3154
|
-
shoppingSetting: shoppingSettingUpdateSchema.optional(),
|
|
3155
|
-
/** Search: the site dynamic ads are built from (each field on its own). Checked against the live channel. */
|
|
3156
|
-
dynamicSearchAdsSetting: dynamicSearchAdsSettingUpdateSchema.optional(),
|
|
3157
|
-
/** Display / Video: REPLACES the campaign's caps; `[]` removes them. Checked against the live channel. */
|
|
3158
|
-
frequencyCaps: frequencyCapsSchema.optional(),
|
|
3159
|
-
/** Performance Max: switches Google's generated assets; the ones left out keep their live value. */
|
|
3160
|
-
assetAutomation: assetAutomationSchema.optional(),
|
|
3161
|
-
/** Performance Max with brand guidelines on: its brand colors and font. Turning them on is `enableBrandGuidelines`. */
|
|
3162
|
-
brandGuidelines: brandGuidelinesUpdateSchema.optional(),
|
|
3163
|
-
status: z4.enum(["ENABLED", "PAUSED", "REMOVED"]).optional()
|
|
3164
|
-
}).superRefine((p, ctx) => {
|
|
3165
|
-
if (Object.values(p).every((v) => v === void 0)) {
|
|
3166
|
-
ctx.addIssue({ code: "custom", message: "update needs at least one field" });
|
|
3167
|
-
}
|
|
3168
|
-
if (p.bidding && p.biddingStrategy) {
|
|
3169
|
-
ctx.addIssue({
|
|
3170
|
-
code: "custom",
|
|
3171
|
-
path: ["biddingStrategy"],
|
|
3172
|
-
message: "use the campaign's own bidding OR a portfolio biddingStrategy, not both \u2014 own bidding takes the campaign off its portfolio"
|
|
3173
|
-
});
|
|
3174
|
-
}
|
|
3175
|
-
if (p.biddingStrategy === "" && !p.bidding) {
|
|
3176
|
-
ctx.addIssue({
|
|
3177
|
-
code: "custom",
|
|
3178
|
-
path: ["biddingStrategy"],
|
|
3179
|
-
message: "leaving a portfolio needs the campaign's own bidding \u2014 stage bidding (e.g. MAXIMIZE_CONVERSIONS) with it"
|
|
3180
|
-
});
|
|
3181
|
-
}
|
|
3182
|
-
});
|
|
3183
|
-
var customerUpdateSchema = z4.strictObject({
|
|
3184
|
-
/** Auto-tagging: Google appends the `gclid` click id to every landing page. */
|
|
3185
|
-
autoTaggingEnabled: z4.boolean().optional(),
|
|
3186
|
-
/** Account tracking template. Campaign, ad group and ad templates REPLACE it; `""` clears it. */
|
|
3187
|
-
trackingUrlTemplate: trackingUrlTemplateSchema.optional(),
|
|
3188
|
-
/** Account final URL suffix. Campaign, ad group and ad suffixes REPLACE it; `""` clears it. */
|
|
3189
|
-
finalUrlSuffix: finalUrlSuffixSchema.optional(),
|
|
3190
|
-
/** Call reporting: Google counts and reports calls from call assets. */
|
|
3191
|
-
callReportingEnabled: z4.boolean().optional(),
|
|
3192
|
-
/** Whether calls from ads count as conversions (needs call reporting on). */
|
|
3193
|
-
callConversionReportingEnabled: z4.boolean().optional(),
|
|
3194
|
-
/** The account's video inventory type (brand safety) for YouTube and video placements. */
|
|
3195
|
-
videoBrandSafety: z4.enum(VIDEO_BRAND_SAFETY_LEVELS).optional()
|
|
3196
|
-
}).superRefine((p, ctx) => {
|
|
3197
|
-
if (Object.values(p).every((v) => v === void 0)) {
|
|
3198
|
-
ctx.addIssue({ code: "custom", message: "update needs at least one setting" });
|
|
3199
|
-
}
|
|
3200
|
-
if (p.callReportingEnabled === false && p.callConversionReportingEnabled === true) {
|
|
3201
|
-
ctx.addIssue({
|
|
3202
|
-
code: "custom",
|
|
3203
|
-
path: ["callConversionReportingEnabled"],
|
|
3204
|
-
message: "calls can count as conversions only while call reporting is on"
|
|
3205
|
-
});
|
|
3206
|
-
}
|
|
3207
|
-
});
|
|
3208
|
-
var CUSTOMER_TARGET_MESSAGE = "an account settings change targets the account itself \u2014 set target to the same id as customerId";
|
|
3209
|
-
var adGroupCreateSchema = z4.strictObject({
|
|
3210
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.adGroup.nameMax),
|
|
3211
|
-
campaign: refSchema2,
|
|
3212
|
-
/**
|
|
3213
|
-
* Optional, and NOT defaulted: Google derives an ad group's type from its campaign's channel when
|
|
3214
|
-
* it is unset, and for a Demand Gen campaign that is the only way to say it — the v23 enum has no
|
|
3215
|
-
* Demand Gen value at all. A default of `SEARCH_STANDARD` would state a type nobody chose on every
|
|
3216
|
-
* ad group Baker stages, which on a Demand Gen campaign is a whole-batch publish failure.
|
|
3217
|
-
*/
|
|
3218
|
-
type: z4.enum(AD_GROUP_TYPES).optional(),
|
|
3219
|
-
cpcBidMicros: microsSchema.optional(),
|
|
3220
|
-
status: stageableStatusSchema.default("PAUSED")
|
|
3221
|
-
});
|
|
3222
|
-
var adGroupUpdateSchema = z4.strictObject({
|
|
3223
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.adGroup.nameMax).optional(),
|
|
3224
|
-
cpcBidMicros: microsSchema.optional(),
|
|
3225
|
-
status: z4.enum(["ENABLED", "PAUSED", "REMOVED"]).optional()
|
|
3226
|
-
}).refine((p) => Object.values(p).some((v) => v !== void 0), "update needs at least one field");
|
|
3227
|
-
var keywordAddSchema = z4.strictObject({
|
|
3228
|
-
adGroup: refSchema2,
|
|
3229
|
-
text: keywordTextSchema,
|
|
3230
|
-
matchType: matchTypeSchema,
|
|
3231
|
-
cpcBidMicros: microsSchema.optional(),
|
|
3232
|
-
finalUrls: z4.array(httpsUrlSchema).optional(),
|
|
3233
|
-
status: stageableStatusSchema.default("ENABLED")
|
|
3234
|
-
});
|
|
3235
|
-
var keywordUpdateSchema = z4.strictObject({
|
|
3236
|
-
cpcBidMicros: microsSchema.optional(),
|
|
3237
|
-
finalUrls: z4.array(httpsUrlSchema).optional(),
|
|
3238
|
-
status: z4.enum(["ENABLED", "PAUSED", "REMOVED"]).optional()
|
|
3239
|
-
}).refine((p) => Object.values(p).some((v) => v !== void 0), "update needs at least one field");
|
|
3240
|
-
var negativeKeywordAddSchema = z4.strictObject({
|
|
3241
|
-
level: z4.enum(["adGroup", "campaign"]),
|
|
3242
|
-
parent: refSchema2,
|
|
3243
|
-
text: keywordTextSchema,
|
|
3244
|
-
matchType: matchTypeSchema
|
|
3245
|
-
});
|
|
3246
|
-
var negativeKeywordUpdateSchema = z4.strictObject({ text: keywordTextSchema.optional(), matchType: matchTypeSchema.optional() }).refine((p) => p.text !== void 0 || p.matchType !== void 0, "update needs text or matchType");
|
|
3247
|
-
var sharedSetCreateSchema = z4.strictObject({
|
|
3248
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.sharedSet.nameMax),
|
|
3249
|
-
type: z4.enum(SHARED_SET_TYPES).default("NEGATIVE_KEYWORDS")
|
|
3250
|
-
});
|
|
3251
|
-
var sharedSetUpdateSchema = z4.strictObject({
|
|
3252
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.sharedSet.nameMax)
|
|
3253
|
-
});
|
|
3254
|
-
var sharedSetMemberAddSchema = z4.strictObject({
|
|
3255
|
-
sharedSet: refSchema2,
|
|
3256
|
-
text: keywordTextSchema.optional(),
|
|
3257
|
-
matchType: matchTypeSchema.optional(),
|
|
3258
|
-
criterion: criterionSpecSchema.optional()
|
|
3259
|
-
}).superRefine((val, ctx) => {
|
|
3260
|
-
const keyword = val.text !== void 0 || val.matchType !== void 0;
|
|
3261
|
-
if (keyword === (val.criterion !== void 0)) {
|
|
3262
|
-
ctx.addIssue({
|
|
3263
|
-
code: "custom",
|
|
3264
|
-
path: [],
|
|
3265
|
-
message: "a list member is either a keyword (text + matchType) or a criterion (a placement, app, YouTube channel/video or brand) \u2014 give exactly one"
|
|
3266
|
-
});
|
|
3267
|
-
return;
|
|
3268
|
-
}
|
|
3269
|
-
if (keyword && (val.text === void 0 || val.matchType === void 0)) {
|
|
3270
|
-
ctx.addIssue({
|
|
3271
|
-
code: "custom",
|
|
3272
|
-
path: [val.text === void 0 ? "text" : "matchType"],
|
|
3273
|
-
message: "a keyword member needs text and matchType"
|
|
3274
|
-
});
|
|
3275
|
-
}
|
|
3276
|
-
if (val.criterion) {
|
|
3277
|
-
const message = criterionLevelIssue(val.criterion, "sharedSet") ?? criterionBidIssue(val.criterion, true);
|
|
3278
|
-
if (message) {
|
|
3279
|
-
ctx.addIssue({ code: "custom", path: ["criterion"], message });
|
|
3280
|
-
}
|
|
3281
|
-
}
|
|
3282
|
-
});
|
|
3283
|
-
var campaignSharedSetAttachSchema = z4.strictObject({
|
|
3284
|
-
campaign: refSchema2,
|
|
3285
|
-
sharedSet: refSchema2
|
|
3286
|
-
});
|
|
3287
|
-
var adTextAssetSchema = z4.strictObject({
|
|
3288
|
-
text: z4.string().min(1),
|
|
3289
|
-
pinnedField: z4.enum(PINNED_FIELDS).optional()
|
|
3290
|
-
});
|
|
3291
|
-
var responsiveSearchAdSchema = z4.strictObject({
|
|
3292
|
-
format: z4.literal("responsiveSearch"),
|
|
3293
|
-
headlines: z4.array(
|
|
3294
|
-
adTextAssetSchema.refine(
|
|
3295
|
-
(a) => a.text.length <= GOOGLE_ADS_LIMITS.responsiveSearchAd.headlineTextMax,
|
|
3296
|
-
"headline exceeds 30 chars"
|
|
3297
|
-
)
|
|
3298
|
-
).min(GOOGLE_ADS_LIMITS.responsiveSearchAd.headlinesMin).max(GOOGLE_ADS_LIMITS.responsiveSearchAd.headlinesMax),
|
|
3299
|
-
descriptions: z4.array(
|
|
3300
|
-
adTextAssetSchema.refine(
|
|
3301
|
-
(a) => a.text.length <= GOOGLE_ADS_LIMITS.responsiveSearchAd.descriptionTextMax,
|
|
3302
|
-
"description exceeds 90 chars"
|
|
3303
|
-
)
|
|
3304
|
-
).min(GOOGLE_ADS_LIMITS.responsiveSearchAd.descriptionsMin).max(GOOGLE_ADS_LIMITS.responsiveSearchAd.descriptionsMax),
|
|
3305
|
-
path1: z4.string().max(GOOGLE_ADS_LIMITS.responsiveSearchAd.pathMax).optional(),
|
|
3306
|
-
path2: z4.string().max(GOOGLE_ADS_LIMITS.responsiveSearchAd.pathMax).optional(),
|
|
3307
|
-
finalUrls: z4.array(httpsUrlSchema).min(1)
|
|
3308
|
-
});
|
|
3309
|
-
var responsiveDisplayAdSchema = z4.strictObject({
|
|
3310
|
-
format: z4.literal("responsiveDisplay"),
|
|
3311
|
-
headlines: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.headlineTextMax) })).min(1).max(5),
|
|
3312
|
-
longHeadline: z4.strictObject({
|
|
3313
|
-
text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.longHeadlineTextMax)
|
|
3314
|
-
}),
|
|
3315
|
-
descriptions: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.descriptionTextMax) })).min(1).max(5),
|
|
3316
|
-
businessName: z4.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.businessNameMax),
|
|
3317
|
-
// A Responsive Display Ad's images are fields on the ad's own content (never campaign-level
|
|
3318
|
-
// asset links). Google requires ≥1 landscape marketing image (1.91:1) AND ≥1 square marketing
|
|
3319
|
-
// image (1:1) to serve; the logo images are optional.
|
|
3320
|
-
marketingImageAssets: z4.array(refSchema2).optional(),
|
|
3321
|
-
squareMarketingImageAssets: z4.array(refSchema2).optional(),
|
|
3322
|
-
logoImageAssets: z4.array(refSchema2).optional(),
|
|
3323
|
-
finalUrls: z4.array(httpsUrlSchema).min(1)
|
|
3324
|
-
});
|
|
3325
|
-
var appAdSchema = z4.strictObject({
|
|
3326
|
-
format: z4.literal("app"),
|
|
3327
|
-
headlines: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.appAd.headlineTextMax) })).min(GOOGLE_ADS_LIMITS.appAd.headlinesMin).max(GOOGLE_ADS_LIMITS.appAd.headlinesMax),
|
|
3328
|
-
descriptions: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.appAd.descriptionTextMax) })).min(GOOGLE_ADS_LIMITS.appAd.descriptionsMin).max(GOOGLE_ADS_LIMITS.appAd.descriptionsMax),
|
|
3329
|
-
// An App campaign ad carries its images on its own content (`AppAdInfo.images`), not as
|
|
3330
|
-
// campaign-level asset links — same shape as a responsive display ad's marketing images.
|
|
3331
|
-
images: z4.array(refSchema2).max(GOOGLE_ADS_LIMITS.appAd.imagesMax).optional(),
|
|
3332
|
-
// `AppAdInfo.youtube_videos` — an App ad's videos live on its content too. Without this field
|
|
3333
|
-
// there is no way to express "keep these videos on the ad", so a content update that only
|
|
3334
|
-
// restated headlines silently left the ad's videos to whatever the mask happened to omit.
|
|
3335
|
-
youtubeVideos: z4.array(refSchema2).max(GOOGLE_ADS_LIMITS.appAd.youtubeVideosMax).optional()
|
|
3336
|
-
});
|
|
3337
|
-
var videoAdSchema = z4.strictObject({
|
|
3338
|
-
format: z4.literal("video"),
|
|
3339
|
-
// A raw YouTube id is not a publishable Google Ads reference — the video must be staged as
|
|
3340
|
-
// its own `google.asset.create` (type: youtubeVideo) first, then referenced here by asset ref.
|
|
3341
|
-
videoAssets: z4.array(refSchema2).min(1),
|
|
3342
|
-
/**
|
|
3343
|
-
* Google requires both since v24 (`VideoResponsiveAdInfo.business_name` / `.logo_images`). Optional
|
|
3344
|
-
* here for the same reason as a Demand Gen video ad's media: an update masks only what it sends.
|
|
3345
|
-
* A create without them is refused at stage (`videoAdCreateRefusal`, backend `adFormatMatch.ts`).
|
|
3346
|
-
* The business name is an `AdTextAsset` on the wire, held to the Demand Gen video ad's 25 characters.
|
|
3347
|
-
*/
|
|
3348
|
-
businessName: z4.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.businessNameMax).optional(),
|
|
3349
|
-
logoImageAssets: z4.array(refSchema2).optional(),
|
|
3350
|
-
finalUrls: z4.array(httpsUrlSchema).min(1)
|
|
3351
|
-
});
|
|
3352
|
-
var demandGenAdSchema = z4.strictObject({
|
|
3353
|
-
format: z4.literal("demandGen"),
|
|
3354
|
-
/**
|
|
3355
|
-
* `Ad.name`. Accepted here but NOT required: a multi-asset Demand Gen ad published against a live
|
|
3356
|
-
* account with no name was created, and reads back with none. Only the video format requires one.
|
|
3357
|
-
*/
|
|
3358
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.adNameMax).optional(),
|
|
3359
|
-
headlines: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.headlineTextMax) })).min(GOOGLE_ADS_LIMITS.demandGenAd.headlinesMin).max(GOOGLE_ADS_LIMITS.demandGenAd.headlinesMax),
|
|
3360
|
-
descriptions: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.descriptionTextMax) })).min(GOOGLE_ADS_LIMITS.demandGenAd.descriptionsMin).max(GOOGLE_ADS_LIMITS.demandGenAd.descriptionsMax),
|
|
3361
|
-
businessName: z4.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.businessNameMax),
|
|
3362
|
-
finalUrls: z4.array(httpsUrlSchema).min(1),
|
|
3363
|
-
imageAssets: z4.array(refSchema2).optional(),
|
|
3364
|
-
squareImageAssets: z4.array(refSchema2).optional(),
|
|
3365
|
-
logoImageAssets: z4.array(refSchema2).optional()
|
|
3366
|
-
});
|
|
3367
|
-
var demandGenVideoAdSchema = z4.strictObject({
|
|
3368
|
-
format: z4.literal("demandGenVideo"),
|
|
3369
|
-
/**
|
|
3370
|
-
* `Ad.name` — the ad's own name, which Google REQUIRES on this format and asks for in its
|
|
3371
|
-
* interface as "Ad name". No other format Baker writes needs one (the multi-asset Demand Gen ad
|
|
3372
|
-
* was published without one and accepted), so nothing carried it: a create without it comes back
|
|
3373
|
-
* as `REQUIRED … at mutate_operations[n].ad_group_ad_operation.create.ad.name`, after every asset
|
|
3374
|
-
* in the same batch has already been created. Optional in the schema because `Ad.name` is
|
|
3375
|
-
* IMMUTABLE — an update must be able to restate the whole content without renaming the ad.
|
|
3376
|
-
*/
|
|
3377
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.adNameMax).optional(),
|
|
3378
|
-
headlines: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.headlineTextMax) })).min(GOOGLE_ADS_LIMITS.demandGenVideoAd.headlinesMin).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.headlinesMax),
|
|
3379
|
-
longHeadlines: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.longHeadlineTextMax) })).min(GOOGLE_ADS_LIMITS.demandGenVideoAd.longHeadlinesMin).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.longHeadlinesMax),
|
|
3380
|
-
descriptions: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.descriptionTextMax) })).min(GOOGLE_ADS_LIMITS.demandGenVideoAd.descriptionsMin).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.descriptionsMax),
|
|
3381
|
-
businessName: z4.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.businessNameMax),
|
|
3382
|
-
finalUrls: z4.array(httpsUrlSchema).min(1),
|
|
3383
|
-
videoAssets: z4.array(refSchema2).optional(),
|
|
3384
|
-
logoImageAssets: z4.array(refSchema2).optional(),
|
|
3385
|
-
callToActionAssets: z4.array(refSchema2).optional()
|
|
3386
|
-
});
|
|
3387
|
-
var RETIRED_AD_FORMATS = {
|
|
3388
|
-
call: CALL_AD_RETIRED_MESSAGE
|
|
3389
|
-
};
|
|
3390
|
-
var shoppingProductAdSchema = z4.strictObject({ format: z4.literal("shoppingProduct") });
|
|
3391
|
-
var SHOPPING_PRODUCT_AD_UPDATE_MESSAGE = "A Shopping product ad has no copy to change \u2014 its title, image and price come from the Merchant Center feed. Change the product in Merchant Center, or pause or resume the ad.";
|
|
3392
|
-
var adContentSchema = z4.discriminatedUnion(
|
|
3393
|
-
"format",
|
|
3394
|
-
[
|
|
3395
|
-
responsiveSearchAdSchema,
|
|
3396
|
-
responsiveDisplayAdSchema,
|
|
3397
|
-
appAdSchema,
|
|
3398
|
-
videoAdSchema,
|
|
3399
|
-
demandGenAdSchema,
|
|
3400
|
-
demandGenVideoAdSchema,
|
|
3401
|
-
shoppingProductAdSchema
|
|
3402
|
-
],
|
|
3403
|
-
{
|
|
3404
|
-
error: (issue) => {
|
|
3405
|
-
const input = issue.input;
|
|
3406
|
-
const format = typeof input === "object" && input !== null ? input.format : void 0;
|
|
3407
|
-
return typeof format === "string" ? RETIRED_AD_FORMATS[format] : void 0;
|
|
3408
|
-
}
|
|
3409
|
-
}
|
|
3410
|
-
);
|
|
3411
|
-
var APP_AD_PAUSED_MESSAGE = "An App ad cannot be created paused \u2014 Google refuses it (AD_TYPE_CANNOT_BE_PAUSED). Stage it ENABLED (`--status ENABLED`); it serves only once its ad group and campaign are enabled, so keep those paused until the user is ready.";
|
|
3412
|
-
var adCreateSchema = z4.strictObject({
|
|
3413
|
-
adGroup: refSchema2,
|
|
3414
|
-
status: stageableStatusSchema.default("PAUSED"),
|
|
3415
|
-
content: adContentSchema
|
|
3416
|
-
}).refine((p) => !(p.content.format === "app" && p.status === "PAUSED"), {
|
|
3417
|
-
message: APP_AD_PAUSED_MESSAGE,
|
|
3418
|
-
path: ["status"]
|
|
3419
|
-
});
|
|
3420
|
-
var adUpdateSchema = z4.strictObject({
|
|
3421
|
-
status: z4.enum(["ENABLED", "PAUSED", "REMOVED"]).optional(),
|
|
3422
|
-
/** Whole-content replacement for RSA-like formats; re-validated against adContentSchema. */
|
|
3423
|
-
content: z4.record(z4.string(), z4.unknown()).optional()
|
|
3424
|
-
}).refine((p) => Object.values(p).some((v) => v !== void 0), "update needs at least one field").refine((p) => p.content?.format !== "shoppingProduct", {
|
|
3425
|
-
message: SHOPPING_PRODUCT_AD_UPDATE_MESSAGE,
|
|
3426
|
-
path: ["content"]
|
|
3427
|
-
});
|
|
3428
|
-
var textAssetSchema = z4.strictObject({ type: z4.literal("text"), text: z4.string().min(1) });
|
|
3429
|
-
var imageAssetSchema = z4.strictObject({
|
|
3430
|
-
type: z4.literal("image"),
|
|
3431
|
-
imageId: z4.string().min(1),
|
|
3432
|
-
name: z4.string().optional()
|
|
3433
|
-
});
|
|
3434
|
-
var youtubeVideoAssetSchema = z4.strictObject({
|
|
3435
|
-
type: z4.literal("youtubeVideo"),
|
|
3436
|
-
youtubeVideoId: z4.string().min(1),
|
|
3437
|
-
name: z4.string().optional()
|
|
3438
|
-
});
|
|
3439
|
-
var sitelinkAssetSchema = z4.strictObject({
|
|
3440
|
-
type: z4.literal("sitelink"),
|
|
3441
|
-
linkText: z4.string().min(1).max(GOOGLE_ADS_LIMITS.asset.sitelinkLinkTextMax),
|
|
3442
|
-
description1: z4.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),
|
|
3443
|
-
description2: z4.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),
|
|
3444
|
-
finalUrls: z4.array(httpsUrlSchema).min(1)
|
|
3445
|
-
});
|
|
3446
|
-
var calloutAssetSchema = z4.strictObject({
|
|
3447
|
-
type: z4.literal("callout"),
|
|
3448
|
-
calloutText: z4.string().min(1).max(GOOGLE_ADS_LIMITS.asset.calloutTextMax)
|
|
3449
|
-
});
|
|
3450
|
-
var structuredSnippetHeaderSchema = z4.string().min(1).transform((header, ctx) => {
|
|
3451
|
-
const canonical = canonicalStructuredSnippetHeader(header);
|
|
3452
|
-
if (!canonical) {
|
|
3453
|
-
ctx.addIssue({
|
|
3454
|
-
code: "custom",
|
|
3455
|
-
message: `Google Ads does not accept "${header}" as a structured snippet header. Use one of: ${STRUCTURED_SNIPPET_HEADERS_EN.join(", ")} \u2014 or that header in the campaign's language.`
|
|
3456
|
-
});
|
|
3457
|
-
return z4.NEVER;
|
|
3458
|
-
}
|
|
3459
|
-
return canonical;
|
|
3460
|
-
});
|
|
3461
|
-
var structuredSnippetAssetSchema = z4.strictObject({
|
|
3462
|
-
type: z4.literal("structuredSnippet"),
|
|
3463
|
-
header: structuredSnippetHeaderSchema,
|
|
3464
|
-
values: z4.array(z4.string().min(1).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValueMax)).min(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMin).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMax)
|
|
3465
|
-
});
|
|
3466
|
-
var callToActionAssetSchema = z4.strictObject({ type: z4.literal("callToAction"), callToAction: z4.string().min(1) });
|
|
3467
|
-
var assetCreateSchema = z4.discriminatedUnion("type", [
|
|
3468
|
-
textAssetSchema,
|
|
3469
|
-
imageAssetSchema,
|
|
3470
|
-
youtubeVideoAssetSchema,
|
|
3471
|
-
sitelinkAssetSchema,
|
|
3472
|
-
calloutAssetSchema,
|
|
3473
|
-
structuredSnippetAssetSchema,
|
|
3474
|
-
callToActionAssetSchema
|
|
3475
|
-
]);
|
|
3476
|
-
var assetUpdateSchema = z4.strictObject({
|
|
3477
|
-
name: z4.string().min(1).optional(),
|
|
3478
|
-
linkText: z4.string().min(1).max(GOOGLE_ADS_LIMITS.asset.sitelinkLinkTextMax).optional(),
|
|
3479
|
-
description1: z4.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),
|
|
3480
|
-
description2: z4.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),
|
|
3481
|
-
finalUrls: z4.array(httpsUrlSchema).min(1).optional(),
|
|
3482
|
-
calloutText: z4.string().min(1).max(GOOGLE_ADS_LIMITS.asset.calloutTextMax).optional(),
|
|
3483
|
-
header: structuredSnippetHeaderSchema.optional(),
|
|
3484
|
-
values: z4.array(z4.string().min(1).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValueMax)).min(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMin).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMax).optional(),
|
|
3485
|
-
callToAction: z4.string().min(1).optional(),
|
|
3486
|
-
text: z4.string().min(1).optional()
|
|
3487
|
-
}).refine((p) => Object.values(p).some((v) => v !== void 0), "update needs at least one field");
|
|
3488
|
-
var assetLinkAttachSchema = z4.strictObject({
|
|
3489
|
-
level: z4.enum(["campaign", "adGroup", "customer"]),
|
|
3490
|
-
parent: refSchema2.optional(),
|
|
3491
|
-
asset: refSchema2,
|
|
3492
|
-
// A plain string, not `z.enum(ASSET_FIELD_TYPES)`, so the image refusal below can answer with
|
|
3493
|
-
// the reason instead of an enum listing. An agent reaching for AD_IMAGE is following Google's
|
|
3494
|
-
// own documentation; "Invalid option: expected one of …" sends it to guess another field type,
|
|
3495
|
-
// which is the failure this whole refusal exists to end.
|
|
3496
|
-
fieldType: z4.string().min(1)
|
|
3497
|
-
}).superRefine((value, ctx) => {
|
|
3498
|
-
if (value.level !== "customer" && !value.parent) {
|
|
3499
|
-
ctx.addIssue({
|
|
3500
|
-
code: z4.ZodIssueCode.custom,
|
|
3501
|
-
path: ["parent"],
|
|
3502
|
-
message: `parent is required for a ${value.level}-level asset link (--parent-ref)`
|
|
3503
|
-
});
|
|
3504
|
-
}
|
|
3505
|
-
if (value.fieldType === "BUSINESS_LOGO" && value.level === "adGroup") {
|
|
3506
|
-
ctx.addIssue({ code: z4.ZodIssueCode.custom, path: ["fieldType"], message: BUSINESS_LOGO_LEVEL_MESSAGE });
|
|
3507
|
-
} else if (isImageAssetLinkFieldType(value.fieldType)) {
|
|
3508
|
-
} else if (!ASSET_FIELD_TYPES.includes(value.fieldType)) {
|
|
3509
|
-
ctx.addIssue({
|
|
3510
|
-
code: z4.ZodIssueCode.custom,
|
|
3511
|
-
path: ["fieldType"],
|
|
3512
|
-
message: `expected one of ${ASSET_FIELD_TYPES.join(" | ")}`
|
|
3513
|
-
});
|
|
3514
|
-
}
|
|
3515
|
-
});
|
|
3516
|
-
var assetGroupCreateSchema = z4.strictObject({
|
|
3517
|
-
campaign: refSchema2,
|
|
3518
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.nameMax),
|
|
3519
|
-
finalUrls: z4.array(httpsUrlSchema).min(1),
|
|
3520
|
-
headlines: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.headlineTextMax) })).min(GOOGLE_ADS_LIMITS.assetGroup.headlinesMin).max(GOOGLE_ADS_LIMITS.assetGroup.headlinesMax),
|
|
3521
|
-
longHeadlines: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.longHeadlineTextMax) })).min(GOOGLE_ADS_LIMITS.assetGroup.longHeadlinesMin).max(GOOGLE_ADS_LIMITS.assetGroup.longHeadlinesMax),
|
|
3522
|
-
descriptions: z4.array(z4.strictObject({ text: z4.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.descriptionTextMax) })).min(GOOGLE_ADS_LIMITS.assetGroup.descriptionsMin).max(GOOGLE_ADS_LIMITS.assetGroup.descriptionsMax),
|
|
3523
|
-
businessName: z4.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.businessNameMax),
|
|
3524
|
-
imageAssets: z4.array(refSchema2).optional(),
|
|
3525
|
-
squareImageAssets: z4.array(refSchema2).optional(),
|
|
3526
|
-
portraitImageAssets: z4.array(refSchema2).optional(),
|
|
3527
|
-
logoAssets: z4.array(refSchema2).optional(),
|
|
3528
|
-
status: z4.enum(["ENABLED", "PAUSED"]).default("PAUSED")
|
|
3529
|
-
});
|
|
3530
|
-
var assetGroupAssetAttachSchema = z4.strictObject({
|
|
3531
|
-
assetGroup: refSchema2,
|
|
3532
|
-
asset: refSchema2,
|
|
3533
|
-
fieldType: z4.enum(ASSET_GROUP_ASSET_FIELD_TYPES)
|
|
3534
|
-
});
|
|
3535
|
-
var assetGroupUpdateSchema = z4.strictObject({
|
|
3536
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.nameMax).optional(),
|
|
3537
|
-
finalUrls: z4.array(httpsUrlSchema).min(1).optional(),
|
|
3538
|
-
status: z4.enum(["ENABLED", "PAUSED", "REMOVED"]).optional()
|
|
3539
|
-
}).refine((p) => Object.values(p).some((v) => v !== void 0), "update needs at least one field");
|
|
3540
|
-
var audienceRuleConditionSchema = z4.union([
|
|
3541
|
-
z4.strictObject({
|
|
3542
|
-
name: z4.string().min(1).default("url__"),
|
|
3543
|
-
operator: z4.enum(USER_LIST_STRING_OPERATORS),
|
|
3544
|
-
value: z4.string().min(1)
|
|
3545
|
-
}),
|
|
3546
|
-
z4.strictObject({
|
|
3547
|
-
name: z4.string().min(1),
|
|
3548
|
-
operator: z4.enum(USER_LIST_NUMBER_OPERATORS),
|
|
3549
|
-
value: z4.number()
|
|
3550
|
-
})
|
|
3551
|
-
]);
|
|
3552
|
-
var audienceRuleOperandSchema = z4.strictObject({
|
|
3553
|
-
conditions: z4.array(audienceRuleConditionSchema).min(1),
|
|
3554
|
-
lookbackWindowDays: z4.number().int().min(1).max(GOOGLE_ADS_LIMITS.audience.membershipLifeSpanDaysMax).optional()
|
|
3555
|
-
});
|
|
3556
|
-
var audienceRuleSchema = z4.strictObject({
|
|
3557
|
-
include: z4.array(audienceRuleOperandSchema).min(1),
|
|
3558
|
-
combine: z4.enum(["ALL", "ANY"]).default("ANY"),
|
|
3559
|
-
exclude: z4.array(audienceRuleOperandSchema).optional(),
|
|
3560
|
-
prefill: z4.boolean().optional()
|
|
3561
|
-
});
|
|
3562
|
-
function existingRefSchema2(message) {
|
|
3563
|
-
return z4.union([z4.string().regex(RESOURCE_NAME_REGEX), z4.string().regex(NUMERIC_ID_REGEX)], { error: message });
|
|
3564
|
-
}
|
|
3565
|
-
var LOGICAL_OPERAND_MESSAGE = "a combined audience can only be made of audiences that already exist in the account \u2014 Google does not find one staged in this same draft. Publish those first, then stage the combination.";
|
|
3566
|
-
var BASIC_ACTION_MESSAGE = "a converters audience can only be built from conversion actions that already exist in the account \u2014 Google refuses one staged in this same draft. Publish the conversion action first, then stage the audience.";
|
|
3567
|
-
var audienceLogicSchema = z4.array(
|
|
3568
|
-
z4.strictObject({
|
|
3569
|
-
operator: z4.enum(USER_LIST_LOGICAL_OPERATORS),
|
|
3570
|
-
audiences: z4.array(existingRefSchema2(LOGICAL_OPERAND_MESSAGE)).min(1)
|
|
3571
|
-
})
|
|
3572
|
-
).min(1);
|
|
3573
|
-
var LOOKALIKE_SEED_MESSAGE = "a lookalike's seed audiences must already exist in the account \u2014 Google takes them by id, which an audience staged in this draft does not have until it publishes. Publish the seed first, then stage the lookalike.";
|
|
3574
|
-
var audienceLookalikeSchema = z4.strictObject({
|
|
3575
|
-
seedAudiences: z4.array(existingRefSchema2(LOOKALIKE_SEED_MESSAGE)).min(1),
|
|
3576
|
-
expansion: z4.enum(LOOKALIKE_EXPANSION_LEVELS).default("BALANCED"),
|
|
3577
|
-
countryCodes: z4.array(z4.string().regex(/^[A-Z]{2}$/, "a two-letter country code, e.g. ES")).optional()
|
|
3578
|
-
});
|
|
3579
|
-
var AUDIENCE_TYPE_SOURCE = {
|
|
3580
|
-
CRM_BASED: void 0,
|
|
3581
|
-
RULE_BASED: "rule",
|
|
3582
|
-
LOGICAL: "logic",
|
|
3583
|
-
BASIC: "conversionActions",
|
|
3584
|
-
LOOKALIKE: "lookalike"
|
|
3585
|
-
};
|
|
3586
|
-
var AUDIENCE_SOURCE_NEEDED = {
|
|
3587
|
-
rule: 'a website-visitor audience (RULE_BASED) needs a "rule" \u2014 who joins, e.g. {"include":[{"conditions":[{"operator":"CONTAINS","value":"/pricing"}]}]}',
|
|
3588
|
-
logic: 'a combined audience (LOGICAL) needs "logic" \u2014 the audiences it is made of, e.g. [{"operator":"ANY","audiences":["<audience id>","<audience id>"]}]',
|
|
3589
|
-
conversionActions: 'a converters audience (BASIC) needs "conversionActions" \u2014 the conversion actions whose converters join it (Google refuses one with none)',
|
|
3590
|
-
lookalike: 'a lookalike audience needs "lookalike" \u2014 {"seedAudiences":["<audience id>"],"expansion":"BALANCED","countryCodes":["ES"]}'
|
|
3591
|
-
};
|
|
3592
|
-
function membershipLifeSpanRefusal(type) {
|
|
3593
|
-
if (type === "RULE_BASED") {
|
|
3594
|
-
return "Google ignores membershipLifeSpanDays on a website-visitor audience \u2014 how long someone stays is each include group's lookbackWindowDays. Set it there instead.";
|
|
3595
|
-
}
|
|
3596
|
-
if (type === "LOGICAL") {
|
|
3597
|
-
return "Google ignores membershipLifeSpanDays on a combined audience \u2014 membership follows the audiences it is made of.";
|
|
3598
|
-
}
|
|
3599
|
-
return void 0;
|
|
3600
|
-
}
|
|
3601
|
-
var audienceCreateSchema = z4.strictObject({
|
|
3602
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.audience.nameMax),
|
|
3603
|
-
type: z4.enum(USER_LIST_TYPES).default("BASIC"),
|
|
3604
|
-
description: z4.string().optional(),
|
|
3605
|
-
/** Customer-match members (crm-based) — file-first for large lists. */
|
|
3606
|
-
members: z4.array(z4.record(z4.string(), z4.string())).optional(),
|
|
3607
|
-
sourceFileRef: z4.string().optional(),
|
|
3608
|
-
/**
|
|
3609
|
-
* How long a member stays in a converters or customer list, in days (`membership_life_span`, at
|
|
3610
|
-
* most 540). A customer list can no longer be kept forever: Google dropped "never expires" (10000)
|
|
3611
|
-
* for Customer Match on 2025-04-07 and answers "Too high." Google ignores it on website-visitor
|
|
3612
|
-
* and combined lists, so it is refused there.
|
|
3613
|
-
*/
|
|
3614
|
-
membershipLifeSpanDays: z4.number().int().min(1).max(
|
|
3615
|
-
GOOGLE_ADS_LIMITS.audience.membershipLifeSpanDaysMax,
|
|
3616
|
-
`membershipLifeSpanDays is 1\u2013${GOOGLE_ADS_LIMITS.audience.membershipLifeSpanDaysMax} \u2014 Google no longer keeps anyone on a list forever`
|
|
3617
|
-
).optional(),
|
|
3618
|
-
/** RULE_BASED: who joins the list. */
|
|
3619
|
-
rule: audienceRuleSchema.optional(),
|
|
3620
|
-
/** LOGICAL: the audiences this one combines. */
|
|
3621
|
-
logic: audienceLogicSchema.optional(),
|
|
3622
|
-
/** BASIC: the conversion actions whose converters join the list. */
|
|
3623
|
-
conversionActions: z4.array(existingRefSchema2(BASIC_ACTION_MESSAGE)).min(1).optional(),
|
|
3624
|
-
/** LOOKALIKE: the seed audiences and how far past them to reach. */
|
|
3625
|
-
lookalike: audienceLookalikeSchema.optional()
|
|
3626
|
-
}).superRefine((p, ctx) => {
|
|
3627
|
-
if (p.membershipLifeSpanDays !== void 0) {
|
|
3628
|
-
const refusal = membershipLifeSpanRefusal(p.type);
|
|
3629
|
-
if (refusal) {
|
|
3630
|
-
ctx.addIssue({ code: "custom", path: ["membershipLifeSpanDays"], message: refusal });
|
|
3631
|
-
}
|
|
3632
|
-
}
|
|
3633
|
-
const own = AUDIENCE_TYPE_SOURCE[p.type];
|
|
3634
|
-
for (const field of Object.keys(AUDIENCE_SOURCE_NEEDED)) {
|
|
3635
|
-
const present = p[field] !== void 0;
|
|
3636
|
-
if (field === own && !present) {
|
|
3637
|
-
ctx.addIssue({ code: "custom", path: [field], message: AUDIENCE_SOURCE_NEEDED[field] ?? field });
|
|
3638
|
-
}
|
|
3639
|
-
if (field !== own && present) {
|
|
3640
|
-
ctx.addIssue({
|
|
3641
|
-
code: "custom",
|
|
3642
|
-
path: [field],
|
|
3643
|
-
message: `"${field}" belongs to another audience type, not ${p.type}`
|
|
3644
|
-
});
|
|
3645
|
-
}
|
|
3646
|
-
}
|
|
3647
|
-
});
|
|
3648
|
-
var audienceCriterionAttachSchema = z4.strictObject({
|
|
3649
|
-
level: z4.enum(["campaign", "adGroup"]),
|
|
3650
|
-
parent: refSchema2,
|
|
3651
|
-
/** An audience list (`userLists/{id}`, or a `g_temp_*` list staged in this chat). */
|
|
3652
|
-
userList: refSchema2.optional(),
|
|
3653
|
-
/** An interest or in-market segment (`userInterests/{id}`) — read ids with `--preset audiences`. */
|
|
3654
|
-
userInterest: z4.union([z4.string().regex(RESOURCE_NAME_REGEX), z4.string().regex(NUMERIC_ID_REGEX)]).optional(),
|
|
3655
|
-
/** A custom segment (`customAudiences/{id}`) built in Google Ads. */
|
|
3656
|
-
customAudience: z4.union([z4.string().regex(RESOURCE_NAME_REGEX), z4.string().regex(NUMERIC_ID_REGEX)]).optional(),
|
|
3657
|
-
negative: z4.boolean().default(false)
|
|
3658
|
-
}).refine(
|
|
3659
|
-
(p) => [p.userList, p.userInterest, p.customAudience].filter((v) => v !== void 0).length === 1,
|
|
3660
|
-
"name exactly one audience: userList, userInterest or customAudience"
|
|
3661
|
-
);
|
|
3662
|
-
var targetRestrictionSchema = z4.strictObject({
|
|
3663
|
-
targetingDimension: z4.enum(TARGETING_DIMENSIONS),
|
|
3664
|
-
bidOnly: z4.boolean()
|
|
3665
|
-
});
|
|
3666
|
-
var targetingSettingSetSchema = z4.strictObject({
|
|
3667
|
-
level: z4.enum(["campaign", "adGroup"]),
|
|
3668
|
-
parent: refSchema2,
|
|
3669
|
-
audience: z4.enum(["OBSERVATION", "TARGETING"]),
|
|
3670
|
-
preserved: z4.array(targetRestrictionSchema).optional()
|
|
3671
|
-
});
|
|
3672
|
-
var conversionActionCreateSchema = z4.strictObject({
|
|
3673
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.conversionAction.nameMax),
|
|
3674
|
-
type: z4.enum(CONVERSION_ACTION_TYPES, {
|
|
3675
|
-
error: retiredChoiceError({ GOOGLE_ANALYTICS_4_CUSTOM: GA4_CONVERSION_CREATE_MESSAGE })
|
|
3676
|
-
}).optional(),
|
|
3677
|
-
category: z4.enum(CONVERSION_ACTION_CATEGORIES).optional(),
|
|
3678
|
-
countingType: z4.enum(CONVERSION_COUNTING_TYPES).optional(),
|
|
3679
|
-
defaultValueMicros: microsSchema.optional(),
|
|
3680
|
-
defaultCurrencyCode: z4.string().length(3).optional(),
|
|
3681
|
-
clickThroughLookbackWindowDays: z4.number().int().positive().optional(),
|
|
3682
|
-
viewThroughLookbackWindowDays: z4.number().int().positive().optional(),
|
|
3683
|
-
status: z4.enum(["ENABLED", "PAUSED"]).optional(),
|
|
3684
|
-
/**
|
|
3685
|
-
* Primary = Google bids toward this conversion; secondary = it is only reported ("Primary action
|
|
3686
|
-
* used for bidding optimization" / "Secondary action not used for bidding optimization" in the UI).
|
|
3687
|
-
* Resolves to SECONDARY on create, deliberately: left unset ON THE WIRE, Google picks — and in a
|
|
3688
|
-
* live account some actions were born primary and some secondary, so a new action could silently
|
|
3689
|
-
* join the bidding target of every Maximize-Conversions campaign and redirect real spend. Nothing
|
|
3690
|
-
* exists yet to flip on a create, so a fixed resolved value is safe here in a way it would never be
|
|
3691
|
-
* on an update: joining bidding becomes an explicit `primaryForGoal: true`, never an accident.
|
|
3692
|
-
*/
|
|
3693
|
-
primaryForGoal: z4.boolean().optional()
|
|
3694
|
-
});
|
|
3695
|
-
var HIDDEN_CONVERSION_STATUS_ERROR = 'Google rejects status HIDDEN on every conversion action write ("the field\'s value is on a deny-list"), so it is not part of this contract. To stop automated bidding optimizing toward a conversion while it keeps measuring, demote it instead: `baker ads google conversions update --target <id> --no-primary`. To stop it counting altogether, use `status: "REMOVED"`. Pick one of those and carry on with the rest of the job.';
|
|
3696
|
-
var conversionActionUpdateSchema = z4.strictObject({
|
|
3697
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.conversionAction.nameMax).optional(),
|
|
3698
|
-
category: z4.enum(CONVERSION_ACTION_CATEGORIES).optional(),
|
|
3699
|
-
countingType: z4.enum(CONVERSION_COUNTING_TYPES).optional(),
|
|
3700
|
-
defaultValueMicros: microsSchema.optional(),
|
|
3701
|
-
defaultCurrencyCode: z4.string().length(3).optional(),
|
|
3702
|
-
clickThroughLookbackWindowDays: z4.number().int().positive().optional(),
|
|
3703
|
-
viewThroughLookbackWindowDays: z4.number().int().positive().optional(),
|
|
3704
|
-
/**
|
|
3705
|
-
* `HIDDEN` is deliberately not writable. Google returns it — an action hidden long ago reads
|
|
3706
|
-
* back as HIDDEN, and every read path keeps it — but it is on the API's deny-list for a write:
|
|
3707
|
-
* `conversion_action.status = HIDDEN` fails with "The field's value is on a deny-list for this
|
|
3708
|
-
* field" even on an ordinary WEBPAGE action with nothing else wrong. Offering it made it the
|
|
3709
|
-
* obvious pick for an agent told to retire an action gently, and the whole cleanup published
|
|
3710
|
-
* nothing.
|
|
3711
|
-
*/
|
|
3712
|
-
status: z4.enum(["ENABLED", "REMOVED"], {
|
|
3713
|
-
error: (issue) => issue.input === "HIDDEN" ? HIDDEN_CONVERSION_STATUS_ERROR : void 0
|
|
3714
|
-
}).optional(),
|
|
3715
|
-
/** Promote to primary (bid toward it) or demote to secondary (report only). No default — an
|
|
3716
|
-
* update must never change an existing action's bidding role unless it was asked to. */
|
|
3717
|
-
primaryForGoal: z4.boolean().optional()
|
|
3718
|
-
}).refine((p) => Object.values(p).some((v) => v !== void 0), "update needs at least one field").refine(
|
|
3719
|
-
(p) => p.status !== "REMOVED" || Object.entries(p).every(([k, v]) => k === "status" || v === void 0),
|
|
3720
|
-
'removing a conversion action cannot be combined with other edits \u2014 `status: "REMOVED"` deletes it, so a name or category sent alongside would be silently discarded. Stage the removal on its own.'
|
|
3721
|
-
);
|
|
3722
|
-
var conversionGoalSetSchema = z4.strictObject({
|
|
3723
|
-
category: z4.enum(CONVERSION_ACTION_CATEGORIES),
|
|
3724
|
-
origin: z4.enum(CONVERSION_ORIGINS),
|
|
3725
|
-
/** True = conversions of this category/origin count toward automated bidding; false = reported only. */
|
|
3726
|
-
biddable: z4.boolean()
|
|
3727
|
-
});
|
|
3728
|
-
var PORTFOLIO_TARGET_CPC_MESSAGE = "portfolio strategies cannot be Target CPC \u2014 it is set on the Demand Gen campaign itself";
|
|
3729
|
-
function portfolioTypeRefusal(type) {
|
|
3730
|
-
if (type === void 0 || type === "MANUAL_CPC" || type === "TARGET_CPC" || PORTFOLIO_STRATEGY_TYPES.includes(type)) {
|
|
3731
|
-
return void 0;
|
|
3732
|
-
}
|
|
3733
|
-
return `a portfolio strategy cannot be ${type} \u2014 Google has no portfolio form of it. Portfolios are ${PORTFOLIO_STRATEGY_TYPES.join(", ")}; set ${type} on the campaign itself.`;
|
|
3734
|
-
}
|
|
3735
|
-
var biddingStrategyCreateSchema = z4.strictObject({
|
|
3736
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.biddingStrategy.nameMax),
|
|
3737
|
-
config: biddingConfigSchema
|
|
3738
|
-
}).superRefine((p, ctx) => {
|
|
3739
|
-
if (p.config.type === "MANUAL_CPC") {
|
|
3740
|
-
ctx.addIssue({ code: "custom", path: ["config", "type"], message: "portfolio strategies cannot be Manual CPC" });
|
|
3741
|
-
}
|
|
3742
|
-
if (p.config.type === "TARGET_CPC") {
|
|
3743
|
-
ctx.addIssue({ code: "custom", path: ["config", "type"], message: PORTFOLIO_TARGET_CPC_MESSAGE });
|
|
3744
|
-
}
|
|
3745
|
-
const typeRefusal = portfolioTypeRefusal(p.config.type);
|
|
3746
|
-
if (typeRefusal) {
|
|
3747
|
-
ctx.addIssue({ code: "custom", path: ["config", "type"], message: typeRefusal });
|
|
3748
|
-
}
|
|
3749
|
-
addTargetImpressionShareIssues(p.config, "config", ctx);
|
|
3750
|
-
});
|
|
3751
|
-
var biddingStrategyUpdateSchema = z4.strictObject({
|
|
3752
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.biddingStrategy.nameMax).optional(),
|
|
3753
|
-
config: biddingConfigSchema.optional()
|
|
3754
|
-
}).superRefine((p, ctx) => {
|
|
3755
|
-
if (Object.values(p).every((v) => v === void 0)) {
|
|
3756
|
-
ctx.addIssue({ code: "custom", message: "update needs at least one field" });
|
|
3757
|
-
}
|
|
3758
|
-
if (p.config?.type === "TARGET_CPC") {
|
|
3759
|
-
ctx.addIssue({ code: "custom", path: ["config", "type"], message: PORTFOLIO_TARGET_CPC_MESSAGE });
|
|
3760
|
-
}
|
|
3761
|
-
const typeRefusal = portfolioTypeRefusal(p.config?.type);
|
|
3762
|
-
if (typeRefusal) {
|
|
3763
|
-
ctx.addIssue({ code: "custom", path: ["config", "type"], message: typeRefusal });
|
|
3764
|
-
}
|
|
3765
|
-
});
|
|
3766
|
-
var labelCreateSchema = z4.strictObject({
|
|
3767
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.label.nameMax),
|
|
3768
|
-
backgroundColor: z4.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),
|
|
3769
|
-
description: z4.string().optional()
|
|
3770
|
-
});
|
|
3771
|
-
var labelUpdateSchema = z4.strictObject({
|
|
3772
|
-
name: z4.string().min(1).max(GOOGLE_ADS_LIMITS.label.nameMax).optional(),
|
|
3773
|
-
backgroundColor: z4.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),
|
|
3774
|
-
description: z4.string().optional()
|
|
3775
|
-
}).refine((p) => Object.values(p).some((v) => v !== void 0), "update needs at least one field");
|
|
3776
|
-
var ASSET_LABEL_MESSAGE = "Google Ads has no labels on assets \u2014 its API offers labels on campaigns, ad groups, ads and keywords only. Label the campaign or ad group that uses the asset instead, or name the asset so it can be found; carry on with the rest of the job.";
|
|
3777
|
-
var ACCOUNT_LABEL_MESSAGE = "Google puts a label on an account only from the manager account above it, and Baker works inside the advertiser account \u2014 so this cannot be staged. Label the campaigns instead, or tell the user to label the account from their manager account in Google Ads; carry on with the rest of the job.";
|
|
3778
|
-
var LABEL_LEVELS = ["campaign", "adGroup", "ad", "keyword"];
|
|
3779
|
-
var COMPOSITE_LABEL_PARENT = {
|
|
3780
|
-
ad: { pattern: /^customers\/\d+\/adGroupAds\/\d+~\d+$/, shape: "customers/{cid}/adGroupAds/{adGroupId}~{adId}" },
|
|
3781
|
-
keyword: {
|
|
3782
|
-
pattern: /^customers\/\d+\/adGroupCriteria\/\d+~\d+$/,
|
|
3783
|
-
shape: "customers/{cid}/adGroupCriteria/{adGroupId}~{criterionId}"
|
|
3784
|
-
}
|
|
3785
|
-
};
|
|
3786
|
-
var labelAttachSchema = z4.strictObject({
|
|
3787
|
-
level: z4.enum(LABEL_LEVELS, {
|
|
3788
|
-
error: retiredChoiceError({ asset: ASSET_LABEL_MESSAGE, customer: ACCOUNT_LABEL_MESSAGE })
|
|
3789
|
-
}),
|
|
3790
|
-
parent: refSchema2,
|
|
3791
|
-
label: refSchema2
|
|
3792
|
-
}).superRefine((p, ctx) => {
|
|
3793
|
-
const composite = COMPOSITE_LABEL_PARENT[p.level];
|
|
3794
|
-
if (composite && !composite.pattern.test(p.parent)) {
|
|
3795
|
-
ctx.addIssue({
|
|
3796
|
-
code: "custom",
|
|
3797
|
-
path: ["parent"],
|
|
3798
|
-
message: `a label goes on an existing ${p.level === "ad" ? "ad" : "keyword"} named by its full resource name \u2014 ${composite.shape} (read it from the row's resource_name). One created in this chat can be labelled after it is published.`
|
|
3799
|
-
});
|
|
3800
|
-
}
|
|
3801
|
-
});
|
|
3802
|
-
function refineCriterion(level, options) {
|
|
3803
|
-
return (spec, ctx, path) => {
|
|
3804
|
-
for (const issue of criterionSpecIssues(spec)) {
|
|
3805
|
-
ctx.addIssue({ code: "custom", path: [...path, ...issue.path], message: issue.message });
|
|
3806
|
-
}
|
|
3807
|
-
const message = criterionLevelIssue(spec, level, options) ?? criterionBidIssue(spec, options.negative);
|
|
3808
|
-
if (message) {
|
|
3809
|
-
ctx.addIssue({ code: "custom", path, message });
|
|
3810
|
-
}
|
|
3811
|
-
};
|
|
3812
|
-
}
|
|
3813
|
-
var campaignCriterionAddSchema = z4.strictObject({
|
|
3814
|
-
campaign: refSchema2,
|
|
3815
|
-
negative: z4.boolean().default(false),
|
|
3816
|
-
criterion: criterionSpecSchema
|
|
3817
|
-
}).superRefine((val, ctx) => {
|
|
3818
|
-
refineCriterion("campaign", { negative: val.negative })(val.criterion, ctx, ["criterion"]);
|
|
3819
|
-
});
|
|
3820
|
-
var campaignCriterionUpdateSchema = z4.strictObject({
|
|
3821
|
-
bidModifier: bidModifierSchema
|
|
3822
|
-
});
|
|
3823
|
-
var adGroupCriterionAddSchema = z4.strictObject({
|
|
3824
|
-
adGroup: refSchema2,
|
|
3825
|
-
negative: z4.boolean().default(false),
|
|
3826
|
-
criterion: criterionSpecSchema,
|
|
3827
|
-
status: z4.enum(["ENABLED", "PAUSED"]).optional(),
|
|
3828
|
-
cpcBidMicros: microsSchema.optional()
|
|
3829
|
-
}).superRefine((val, ctx) => {
|
|
3830
|
-
refineCriterion("adGroup", { negative: val.negative })(val.criterion, ctx, ["criterion"]);
|
|
3831
|
-
if (val.negative && (val.status !== void 0 || val.cpcBidMicros !== void 0)) {
|
|
3832
|
-
ctx.addIssue({
|
|
3833
|
-
code: "custom",
|
|
3834
|
-
path: [val.status !== void 0 ? "status" : "cpcBidMicros"],
|
|
3835
|
-
message: "an exclusion has no status or bid \u2014 Google refuses either on a negative criterion"
|
|
3836
|
-
});
|
|
3837
|
-
}
|
|
3838
|
-
});
|
|
3839
|
-
var adGroupCriterionUpdateSchema = z4.strictObject({
|
|
3840
|
-
bidModifier: criterionBidModifierSchema.optional(),
|
|
3841
|
-
cpcBidMicros: microsSchema.optional(),
|
|
3842
|
-
status: z4.enum(["ENABLED", "PAUSED"]).optional()
|
|
3843
|
-
}).refine((p) => Object.values(p).some((v) => v !== void 0), "update needs at least one field");
|
|
3844
|
-
var adGroupBidModifierAddSchema = z4.strictObject({
|
|
3845
|
-
adGroup: refSchema2,
|
|
3846
|
-
device: z4.enum(DEVICE_TYPES),
|
|
3847
|
-
bidModifier: bidModifierSchema
|
|
3848
|
-
});
|
|
3849
|
-
var adGroupBidModifierUpdateSchema = z4.strictObject({ bidModifier: bidModifierSchema });
|
|
3850
|
-
var customerNegativeCriterionAddSchema = z4.strictObject({ criterion: criterionSpecSchema }).superRefine((val, ctx) => {
|
|
3851
|
-
for (const issue of criterionSpecIssues(val.criterion)) {
|
|
3852
|
-
ctx.addIssue({ code: "custom", path: ["criterion", ...issue.path], message: issue.message });
|
|
3853
|
-
}
|
|
3854
|
-
const message = criterionLevelIssue(val.criterion, "account", { negative: true }) ?? criterionBidIssue(val.criterion, true);
|
|
3855
|
-
if (message) {
|
|
3856
|
-
ctx.addIssue({ code: "custom", path: ["criterion"], message });
|
|
3857
|
-
}
|
|
3858
|
-
});
|
|
3859
|
-
var assetGroupSignalAddSchema = z4.strictObject({ assetGroup: refSchema2, criterion: criterionSpecSchema }).superRefine((val, ctx) => {
|
|
3860
|
-
for (const issue of criterionSpecIssues(val.criterion)) {
|
|
3861
|
-
ctx.addIssue({ code: "custom", path: ["criterion", ...issue.path], message: issue.message });
|
|
3862
|
-
}
|
|
3863
|
-
const message = criterionLevelIssue(val.criterion, "assetGroup") ?? criterionBidIssue(val.criterion, false);
|
|
3864
|
-
if (message) {
|
|
3865
|
-
ctx.addIssue({ code: "custom", path: ["criterion"], message });
|
|
3866
|
-
}
|
|
3867
|
-
});
|
|
3868
|
-
var GOOGLE_DRAFT_OP_KINDS = [
|
|
3869
|
-
"google.customer.update",
|
|
3870
|
-
"google.budget.create",
|
|
3871
|
-
"google.budget.update",
|
|
3872
|
-
"google.budget.remove",
|
|
3873
|
-
"google.campaign.create",
|
|
3874
|
-
"google.campaign.update",
|
|
3875
|
-
"google.campaign.pause",
|
|
3876
|
-
"google.campaign.resume",
|
|
3877
|
-
"google.campaign.remove",
|
|
3878
|
-
"google.campaign.enableBrandGuidelines",
|
|
3879
|
-
"google.adGroup.create",
|
|
3880
|
-
"google.adGroup.update",
|
|
3881
|
-
"google.adGroup.pause",
|
|
3882
|
-
"google.adGroup.resume",
|
|
3883
|
-
"google.adGroup.remove",
|
|
3884
|
-
"google.keyword.add",
|
|
3885
|
-
"google.keyword.update",
|
|
3886
|
-
"google.keyword.remove",
|
|
3887
|
-
"google.negativeKeyword.add",
|
|
3888
|
-
"google.negativeKeyword.update",
|
|
3889
|
-
"google.negativeKeyword.remove",
|
|
3890
|
-
"google.sharedSet.create",
|
|
3891
|
-
"google.sharedSet.update",
|
|
3892
|
-
"google.sharedSet.remove",
|
|
3893
|
-
"google.sharedSetMember.add",
|
|
3894
|
-
"google.sharedSetMember.remove",
|
|
3895
|
-
"google.campaignSharedSet.attach",
|
|
3896
|
-
"google.campaignSharedSet.detach",
|
|
3897
|
-
"google.ad.create",
|
|
3898
|
-
"google.ad.update",
|
|
3899
|
-
"google.ad.pause",
|
|
3900
|
-
"google.ad.resume",
|
|
3901
|
-
"google.ad.remove",
|
|
3902
|
-
"google.asset.create",
|
|
3903
|
-
"google.asset.update",
|
|
3904
|
-
"google.assetLink.attach",
|
|
3905
|
-
"google.assetLink.detach",
|
|
3906
|
-
"google.assetGroup.create",
|
|
3907
|
-
"google.assetGroup.update",
|
|
3908
|
-
"google.assetGroupAsset.attach",
|
|
3909
|
-
"google.assetGroupAsset.detach",
|
|
3910
|
-
"google.assetGroupSignal.add",
|
|
3911
|
-
"google.assetGroupSignal.remove",
|
|
3912
|
-
"google.audience.create",
|
|
3913
|
-
"google.audienceCriterion.attach",
|
|
3914
|
-
"google.audienceCriterion.detach",
|
|
3915
|
-
"google.targetingSetting.set",
|
|
3916
|
-
"google.conversionAction.create",
|
|
3917
|
-
"google.conversionAction.update",
|
|
3918
|
-
"google.conversionAction.goal",
|
|
3919
|
-
"google.conversion.upload",
|
|
3920
|
-
"google.biddingStrategy.create",
|
|
3921
|
-
"google.biddingStrategy.update",
|
|
3922
|
-
"google.biddingStrategy.remove",
|
|
3923
|
-
"google.label.create",
|
|
3924
|
-
"google.label.update",
|
|
3925
|
-
"google.label.remove",
|
|
3926
|
-
"google.label.attach",
|
|
3927
|
-
"google.label.detach",
|
|
3928
|
-
"google.campaignCriterion.add",
|
|
3929
|
-
"google.campaignCriterion.update",
|
|
3930
|
-
"google.campaignCriterion.remove",
|
|
3931
|
-
"google.adGroupCriterion.add",
|
|
3932
|
-
"google.adGroupCriterion.update",
|
|
3933
|
-
"google.adGroupCriterion.remove",
|
|
3934
|
-
"google.adGroupBidModifier.add",
|
|
3935
|
-
"google.adGroupBidModifier.update",
|
|
3936
|
-
"google.adGroupBidModifier.remove",
|
|
3937
|
-
"google.customerNegativeCriterion.add",
|
|
3938
|
-
"google.customerNegativeCriterion.remove"
|
|
3939
|
-
];
|
|
3940
|
-
var googleDraftOpKindSchema = z4.enum(GOOGLE_DRAFT_OP_KINDS);
|
|
3941
|
-
function createOp(kind, payload) {
|
|
3942
|
-
return z4.object({ kind: z4.literal(kind), customerId: customerIdSchema, payload });
|
|
3943
|
-
}
|
|
3944
|
-
function updateOp(kind, payload) {
|
|
3945
|
-
return z4.object({ kind: z4.literal(kind), customerId: customerIdSchema, target: targetRefSchema, payload });
|
|
3946
|
-
}
|
|
3947
|
-
function budgetUpdateOp(kind, payload) {
|
|
3948
|
-
return updateOp(kind, payload).extend({ confirmBudgetIncrease: z4.boolean().optional() });
|
|
3949
|
-
}
|
|
3950
|
-
function targetOp(kind) {
|
|
3951
|
-
return z4.object({ kind: z4.literal(kind), customerId: customerIdSchema, target: targetRefSchema });
|
|
3952
|
-
}
|
|
3953
|
-
var googleDraftOpInputSchema = z4.discriminatedUnion("kind", [
|
|
3954
|
-
z4.object({
|
|
3955
|
-
kind: z4.literal("google.customer.update"),
|
|
3956
|
-
customerId: customerIdSchema,
|
|
3957
|
-
target: z4.string(),
|
|
3958
|
-
payload: customerUpdateSchema
|
|
3959
|
-
}).refine((op) => op.target.replace(/^customers\//, "") === op.customerId, {
|
|
3960
|
-
path: ["target"],
|
|
3961
|
-
message: CUSTOMER_TARGET_MESSAGE
|
|
3962
|
-
}),
|
|
3963
|
-
createOp("google.budget.create", budgetCreateSchema),
|
|
3964
|
-
budgetUpdateOp("google.budget.update", budgetUpdateSchema),
|
|
3965
|
-
targetOp("google.budget.remove"),
|
|
3966
|
-
createOp("google.campaign.create", campaignCreateSchema),
|
|
3967
|
-
updateOp("google.campaign.update", campaignUpdateSchema),
|
|
3968
|
-
targetOp("google.campaign.pause"),
|
|
3969
|
-
targetOp("google.campaign.resume"),
|
|
3970
|
-
targetOp("google.campaign.remove"),
|
|
3971
|
-
updateOp("google.campaign.enableBrandGuidelines", campaignEnableBrandGuidelinesSchema),
|
|
3972
|
-
createOp("google.adGroup.create", adGroupCreateSchema),
|
|
3973
|
-
updateOp("google.adGroup.update", adGroupUpdateSchema),
|
|
3974
|
-
targetOp("google.adGroup.pause"),
|
|
3975
|
-
targetOp("google.adGroup.resume"),
|
|
3976
|
-
targetOp("google.adGroup.remove"),
|
|
3977
|
-
createOp("google.keyword.add", keywordAddSchema),
|
|
3978
|
-
updateOp("google.keyword.update", keywordUpdateSchema),
|
|
3979
|
-
targetOp("google.keyword.remove"),
|
|
3980
|
-
createOp("google.negativeKeyword.add", negativeKeywordAddSchema),
|
|
3981
|
-
updateOp("google.negativeKeyword.update", negativeKeywordUpdateSchema),
|
|
3982
|
-
targetOp("google.negativeKeyword.remove"),
|
|
3983
|
-
createOp("google.sharedSet.create", sharedSetCreateSchema),
|
|
3984
|
-
updateOp("google.sharedSet.update", sharedSetUpdateSchema),
|
|
3985
|
-
targetOp("google.sharedSet.remove"),
|
|
3986
|
-
createOp("google.sharedSetMember.add", sharedSetMemberAddSchema),
|
|
3987
|
-
targetOp("google.sharedSetMember.remove"),
|
|
3988
|
-
createOp("google.campaignSharedSet.attach", campaignSharedSetAttachSchema),
|
|
3989
|
-
targetOp("google.campaignSharedSet.detach"),
|
|
3990
|
-
createOp("google.ad.create", adCreateSchema),
|
|
3991
|
-
updateOp("google.ad.update", adUpdateSchema),
|
|
3992
|
-
targetOp("google.ad.pause"),
|
|
3993
|
-
targetOp("google.ad.resume"),
|
|
3994
|
-
targetOp("google.ad.remove"),
|
|
3995
|
-
createOp("google.asset.create", assetCreateSchema),
|
|
3996
|
-
updateOp("google.asset.update", assetUpdateSchema),
|
|
3997
|
-
createOp("google.assetLink.attach", assetLinkAttachSchema),
|
|
3998
|
-
targetOp("google.assetLink.detach"),
|
|
3999
|
-
createOp("google.assetGroup.create", assetGroupCreateSchema),
|
|
4000
|
-
updateOp("google.assetGroup.update", assetGroupUpdateSchema),
|
|
4001
|
-
createOp("google.assetGroupAsset.attach", assetGroupAssetAttachSchema),
|
|
4002
|
-
targetOp("google.assetGroupAsset.detach"),
|
|
4003
|
-
createOp("google.assetGroupSignal.add", assetGroupSignalAddSchema),
|
|
4004
|
-
targetOp("google.assetGroupSignal.remove"),
|
|
4005
|
-
createOp("google.audience.create", audienceCreateSchema),
|
|
4006
|
-
createOp("google.audienceCriterion.attach", audienceCriterionAttachSchema),
|
|
4007
|
-
targetOp("google.audienceCriterion.detach"),
|
|
4008
|
-
createOp("google.targetingSetting.set", targetingSettingSetSchema),
|
|
4009
|
-
createOp("google.conversionAction.create", conversionActionCreateSchema),
|
|
4010
|
-
updateOp("google.conversionAction.update", conversionActionUpdateSchema),
|
|
4011
|
-
createOp("google.conversionAction.goal", conversionGoalSetSchema),
|
|
4012
|
-
createOp("google.conversion.upload", conversionUploadSchema),
|
|
4013
|
-
createOp("google.biddingStrategy.create", biddingStrategyCreateSchema),
|
|
4014
|
-
updateOp("google.biddingStrategy.update", biddingStrategyUpdateSchema),
|
|
4015
|
-
targetOp("google.biddingStrategy.remove"),
|
|
4016
|
-
createOp("google.label.create", labelCreateSchema),
|
|
4017
|
-
updateOp("google.label.update", labelUpdateSchema),
|
|
4018
|
-
targetOp("google.label.remove"),
|
|
4019
|
-
createOp("google.label.attach", labelAttachSchema),
|
|
4020
|
-
targetOp("google.label.detach"),
|
|
4021
|
-
createOp("google.campaignCriterion.add", campaignCriterionAddSchema),
|
|
4022
|
-
updateOp("google.campaignCriterion.update", campaignCriterionUpdateSchema),
|
|
4023
|
-
targetOp("google.campaignCriterion.remove"),
|
|
4024
|
-
createOp("google.adGroupCriterion.add", adGroupCriterionAddSchema),
|
|
4025
|
-
updateOp("google.adGroupCriterion.update", adGroupCriterionUpdateSchema),
|
|
4026
|
-
targetOp("google.adGroupCriterion.remove"),
|
|
4027
|
-
createOp("google.adGroupBidModifier.add", adGroupBidModifierAddSchema),
|
|
4028
|
-
updateOp("google.adGroupBidModifier.update", adGroupBidModifierUpdateSchema),
|
|
4029
|
-
targetOp("google.adGroupBidModifier.remove"),
|
|
4030
|
-
createOp("google.customerNegativeCriterion.add", customerNegativeCriterionAddSchema),
|
|
4031
|
-
targetOp("google.customerNegativeCriterion.remove")
|
|
4032
|
-
]);
|
|
4033
|
-
|
|
4034
|
-
// ../api/src/ads-google/wire.ts
|
|
4035
|
-
import { z as z5 } from "zod";
|
|
4036
|
-
var googleWriteModeSchema = z5.enum(["live", "simulated"]);
|
|
4037
|
-
var publishVerificationSchema = z5.object({
|
|
4038
|
-
status: z5.enum(["confirmed", "unconfirmed", "drifted"]),
|
|
4039
|
-
note: z5.string().optional(),
|
|
4040
|
-
checkedAt: z5.number()
|
|
4041
|
-
});
|
|
4042
|
-
var googleDraftOpResultSchema = z5.object({
|
|
4043
|
-
status: z5.enum(["applied", "simulated", "failed", "skipped"]),
|
|
4044
|
-
resourceName: z5.string().optional(),
|
|
4045
|
-
error: z5.string().optional(),
|
|
4046
|
-
skippedBecause: z5.string().optional(),
|
|
4047
|
-
executedAt: z5.number().optional(),
|
|
4048
|
-
verification: publishVerificationSchema.optional(),
|
|
4049
|
-
/** A customer list's people upload: Google Data Manager's request id(s), comma-joined. */
|
|
4050
|
-
requestId: z5.string().optional()
|
|
4051
|
-
});
|
|
4052
|
-
var googleDraftStageRequestSchema = z5.object({
|
|
4053
|
-
chatId: z5.string(),
|
|
4054
|
-
op: googleDraftOpInputSchema
|
|
4055
|
-
});
|
|
4056
|
-
var googleDraftStageResponseSchema = z5.discriminatedUnion("staged", [
|
|
4057
|
-
z5.object({
|
|
4058
|
-
staged: z5.literal(true),
|
|
4059
|
-
ref: z5.string(),
|
|
4060
|
-
kind: googleDraftOpKindSchema,
|
|
4061
|
-
mode: googleWriteModeSchema,
|
|
4062
|
-
dependsOn: z5.array(z5.string()),
|
|
4063
|
-
summary: z5.string(),
|
|
4064
|
-
warnings: z5.array(z5.string()),
|
|
4065
|
-
/** True when the op amended an already-staged op in place instead of appending a new one. */
|
|
4066
|
-
amended: z5.boolean().optional()
|
|
4067
|
-
}),
|
|
4068
|
-
z5.object({
|
|
4069
|
-
staged: z5.literal(false),
|
|
4070
|
-
noop: z5.literal(true),
|
|
4071
|
-
kind: googleDraftOpKindSchema,
|
|
4072
|
-
mode: googleWriteModeSchema,
|
|
4073
|
-
summary: z5.string(),
|
|
4074
|
-
reason: z5.string()
|
|
4075
|
-
})
|
|
4076
|
-
]);
|
|
4077
|
-
var googleDraftAmendRequestSchema = z5.object({
|
|
4078
|
-
chatId: z5.string(),
|
|
4079
|
-
ref: z5.string(),
|
|
4080
|
-
patch: z5.record(z5.string(), z5.unknown())
|
|
4081
|
-
});
|
|
4082
|
-
var googleDraftShowRequestSchema = z5.object({
|
|
4083
|
-
chatId: z5.string(),
|
|
4084
|
-
ref: z5.string()
|
|
4085
|
-
});
|
|
4086
|
-
var GOOGLE_DRAFT_BATCH_MAX = 500;
|
|
4087
|
-
var OP_TOO_LARGE_MESSAGE_START = "This Google Ads change is too large to stage";
|
|
4088
|
-
var OP_TOO_LARGE_FIX = "Nothing from this call was staged. Do not retry it as it is. Split the change that is too large into several smaller ones (for an audience upload, several smaller lists of members), stage those, and carry on with the rest of the job.";
|
|
4089
|
-
var googleDraftStageBatchRequestSchema = z5.object({
|
|
4090
|
-
chatId: z5.string(),
|
|
4091
|
-
ops: z5.array(googleDraftOpInputSchema).min(1).max(GOOGLE_DRAFT_BATCH_MAX)
|
|
4092
|
-
});
|
|
4093
|
-
var googleDraftStageBatchResponseSchema = z5.object({
|
|
4094
|
-
staged: z5.literal(true),
|
|
4095
|
-
mode: googleWriteModeSchema,
|
|
4096
|
-
count: z5.number(),
|
|
4097
|
-
ops: z5.array(
|
|
4098
|
-
z5.object({
|
|
4099
|
-
ref: z5.string(),
|
|
4100
|
-
kind: googleDraftOpKindSchema,
|
|
4101
|
-
dependsOn: z5.array(z5.string()),
|
|
4102
|
-
summary: z5.string(),
|
|
4103
|
-
warnings: z5.array(z5.string())
|
|
4104
|
-
})
|
|
4105
|
-
),
|
|
4106
|
-
skipped: z5.array(z5.object({ kind: googleDraftOpKindSchema, summary: z5.string(), reason: z5.string() })).optional()
|
|
4107
|
-
});
|
|
4108
|
-
var googleDraftAmendBatchRequestSchema = z5.object({
|
|
4109
|
-
chatId: z5.string(),
|
|
4110
|
-
amends: z5.array(z5.object({ ref: z5.string().min(1), patch: z5.record(z5.string(), z5.unknown()) })).min(1).max(GOOGLE_DRAFT_BATCH_MAX)
|
|
4111
|
-
});
|
|
4112
|
-
var googleDraftAmendBatchResponseSchema = z5.object({
|
|
4113
|
-
amended: z5.literal(true),
|
|
4114
|
-
mode: googleWriteModeSchema,
|
|
4115
|
-
count: z5.number(),
|
|
4116
|
-
ops: z5.array(
|
|
4117
|
-
z5.object({
|
|
4118
|
-
ref: z5.string(),
|
|
4119
|
-
kind: googleDraftOpKindSchema,
|
|
4120
|
-
dependsOn: z5.array(z5.string()),
|
|
4121
|
-
summary: z5.string(),
|
|
4122
|
-
warnings: z5.array(z5.string())
|
|
4123
|
-
})
|
|
4124
|
-
)
|
|
4125
|
-
});
|
|
4126
|
-
var googleDraftOpViewSchema = z5.object({
|
|
4127
|
-
ref: z5.string(),
|
|
4128
|
-
kind: googleDraftOpKindSchema,
|
|
4129
|
-
customerId: z5.string(),
|
|
4130
|
-
target: z5.string().optional(),
|
|
4131
|
-
dependsOn: z5.array(z5.string()),
|
|
4132
|
-
summary: z5.string(),
|
|
4133
|
-
stagedAt: z5.number(),
|
|
4134
|
-
result: googleDraftOpResultSchema.optional()
|
|
4135
|
-
});
|
|
4136
|
-
var googleDraftShowResponseSchema = z5.object({
|
|
4137
|
-
op: googleDraftOpViewSchema.extend({
|
|
4138
|
-
payload: z5.unknown().optional(),
|
|
4139
|
-
warnings: z5.array(z5.string()).optional(),
|
|
4140
|
-
annotations: z5.unknown().optional()
|
|
4141
|
-
})
|
|
4142
|
-
});
|
|
4143
|
-
var googleDraftListRequestSchema = z5.object({
|
|
4144
|
-
chatId: z5.string(),
|
|
4145
|
-
/** Every op as `draft show` prints it, payload included — one call instead of a show per op. */
|
|
4146
|
-
full: z5.boolean().optional()
|
|
4147
|
-
});
|
|
4148
|
-
var googleDraftAdvisorySchema = z5.object({
|
|
4149
|
-
scope: z5.enum(["campaign", "adGroup"]),
|
|
4150
|
-
message: z5.string()
|
|
4151
|
-
});
|
|
4152
|
-
var googleDraftStatusCollectionSchema = z5.object({
|
|
4153
|
-
label: z5.string(),
|
|
4154
|
-
added: z5.number(),
|
|
4155
|
-
removed: z5.number(),
|
|
4156
|
-
/** Members that stay in the set with a changed value — a device's bid adjustment. Optional: a
|
|
4157
|
-
* status tree built by an older backend carries no such count. */
|
|
4158
|
-
updated: z5.number().optional(),
|
|
4159
|
-
existing: z5.number()
|
|
4160
|
-
});
|
|
4161
|
-
var googleDraftChangeOperationSchema = z5.enum(["create", "update", "pause", "resume", "remove", "upload"]);
|
|
4162
|
-
var googleDraftStatusNodeSchema = z5.lazy(
|
|
4163
|
-
() => z5.object({
|
|
4164
|
-
entity: z5.string(),
|
|
4165
|
-
name: z5.string(),
|
|
4166
|
-
customerId: z5.string(),
|
|
4167
|
-
operation: googleDraftChangeOperationSchema.optional(),
|
|
4168
|
-
existing: z5.boolean(),
|
|
4169
|
-
collections: z5.array(googleDraftStatusCollectionSchema),
|
|
4170
|
-
children: z5.array(googleDraftStatusNodeSchema),
|
|
4171
|
-
warnings: z5.array(z5.string()).optional()
|
|
4172
|
-
})
|
|
4173
|
-
);
|
|
4174
|
-
var googleDraftListResponseSchema = z5.object({
|
|
4175
|
-
status: z5.enum(["active", "publishing", "applied", "discarded", "none"]),
|
|
4176
|
-
mode: googleWriteModeSchema,
|
|
4177
|
-
count: z5.number(),
|
|
4178
|
-
/** Payload, warnings and annotations only when the request asked for `full`. */
|
|
4179
|
-
ops: z5.array(googleDraftShowResponseSchema.shape.op),
|
|
4180
|
-
/** Grouped campaign ▸ ad group ▸ ad tree for the readable CLI status view. */
|
|
4181
|
-
tree: z5.array(googleDraftStatusNodeSchema).optional(),
|
|
4182
|
-
/** Non-blocking completeness advisories for the whole draft. */
|
|
4183
|
-
advisories: z5.array(googleDraftAdvisorySchema).optional()
|
|
4184
|
-
});
|
|
4185
|
-
var googleDraftRemoveRequestSchema = z5.object({
|
|
4186
|
-
chatId: z5.string(),
|
|
4187
|
-
ref: z5.string()
|
|
4188
|
-
});
|
|
4189
|
-
var googleDraftRemoveResponseSchema = z5.object({
|
|
4190
|
-
/** The requested ref plus any dependents removed by cascade. */
|
|
4191
|
-
removed: z5.array(z5.string())
|
|
4192
|
-
});
|
|
4193
|
-
var googleDraftImportRequestSchema = z5.object({
|
|
4194
|
-
chatId: z5.string(),
|
|
4195
|
-
fromChatId: z5.string().min(1),
|
|
4196
|
-
refs: z5.array(z5.string().min(1)).min(1).optional(),
|
|
4197
|
-
exclude: z5.array(z5.string().min(1)).min(1).optional()
|
|
4198
|
-
});
|
|
4199
|
-
var googleDraftImportResponseSchema = z5.object({
|
|
4200
|
-
/** Refs now staged on this chat, in the order the other chat staged them. */
|
|
4201
|
-
moved: z5.array(z5.string()),
|
|
4202
|
-
/** How many ops the other chat still has staged. */
|
|
4203
|
-
sourceRemaining: z5.number()
|
|
4204
|
-
});
|
|
4205
|
-
var googleDraftClearRequestSchema = z5.object({
|
|
4206
|
-
chatId: z5.string()
|
|
4207
|
-
});
|
|
4208
|
-
var googleDraftClearResponseSchema = z5.object({
|
|
4209
|
-
cleared: z5.number()
|
|
4210
|
-
});
|
|
4211
|
-
var googleDraftValidateRequestSchema = z5.object({
|
|
4212
|
-
chatId: z5.string(),
|
|
4213
|
-
full: z5.boolean().optional()
|
|
4214
|
-
});
|
|
4215
|
-
var GOOGLE_DRAFT_VERDICTS = ["accepted", "refused", "blocked", "unchecked", "applied"];
|
|
4216
|
-
var googleDraftVerdictSchema = z5.enum(GOOGLE_DRAFT_VERDICTS);
|
|
4217
|
-
var googleDraftOpVerdictSchema = z5.object({
|
|
4218
|
-
ref: z5.string(),
|
|
4219
|
-
summary: z5.string(),
|
|
4220
|
-
verdict: googleDraftVerdictSchema,
|
|
4221
|
-
/** Why it was not accepted, in the words publish would record. */
|
|
4222
|
-
reason: z5.string().optional(),
|
|
4223
|
-
/** `full` only. */
|
|
4224
|
-
kind: googleDraftOpKindSchema.optional(),
|
|
4225
|
-
customerId: z5.string().optional(),
|
|
4226
|
-
request: z5.unknown().optional(),
|
|
4227
|
-
response: z5.unknown().optional()
|
|
4228
|
-
});
|
|
4229
|
-
var googleDraftValidateResponseSchema = z5.object({
|
|
4230
|
-
status: z5.enum(["active", "publishing", "applied", "discarded", "none"]),
|
|
4231
|
-
/** Requests sent to Google — one per publish window. */
|
|
4232
|
-
requests: z5.number(),
|
|
4233
|
-
counts: z5.record(googleDraftVerdictSchema, z5.number()),
|
|
4234
|
-
/** Publish would send nothing: Baker holds the whole first publish when any op is refused before sending. */
|
|
4235
|
-
publishHeld: z5.boolean(),
|
|
4236
|
-
/**
|
|
4237
|
-
* Present only when the changes still to send do not fit in what is left of Baker's rolling 24
|
|
4238
|
-
* hours of Google Ads changes, shared by every company. `operations` is what the publish takes (a
|
|
4239
|
-
* change can be several); `room` is the operations left right now, not a count of changes that go
|
|
4240
|
-
* live now: Publish sends each request whole or not at all, so fewer may, possibly none, and the
|
|
4241
|
-
* rest are sent again on their own. `fitsAt` (ISO) is when all of them fit, if nothing else is sent.
|
|
4242
|
-
*/
|
|
4243
|
-
dailyLimit: z5.object({ operations: z5.number(), room: z5.number(), fitsAt: z5.string() }).optional(),
|
|
4244
|
-
ops: z5.array(googleDraftOpVerdictSchema)
|
|
4245
|
-
});
|
|
4246
|
-
var googleFieldErrorSchema = z5.object({
|
|
4247
|
-
path: z5.string(),
|
|
4248
|
-
message: z5.string()
|
|
4249
|
-
});
|
|
4250
|
-
var googleDraftErrorResponseSchema = z5.object({
|
|
4251
|
-
code: z5.string(),
|
|
4252
|
-
error: z5.string(),
|
|
4253
|
-
fields: z5.array(googleFieldErrorSchema).optional()
|
|
4254
|
-
});
|
|
4255
|
-
|
|
4256
|
-
export {
|
|
4257
|
-
parse,
|
|
4258
|
-
getPublicSuffix,
|
|
4259
|
-
GOOGLE_ADS_QUERY_MAX_PAGE_SIZE,
|
|
4260
|
-
POSITIVE_GEO_TARGET_TYPES,
|
|
4261
|
-
NEGATIVE_GEO_TARGET_TYPES,
|
|
4262
|
-
CALL_AD_RETIRED_MESSAGE,
|
|
4263
|
-
CONVERSION_ACTION_CATEGORIES,
|
|
4264
|
-
CONVERSION_ORIGINS,
|
|
4265
|
-
ASSET_GROUP_ASSET_FIELD_TYPES,
|
|
4266
|
-
toMicros,
|
|
4267
|
-
NUMERIC_ID_REGEX,
|
|
4268
|
-
CONVERSION_UPLOAD_MAX_ROWS,
|
|
4269
|
-
GEO_TARGET_COUNTRIES,
|
|
4270
|
-
LANGUAGE_CONSTANTS,
|
|
4271
|
-
googleDraftOpInputSchema,
|
|
4272
|
-
publishVerificationSchema,
|
|
4273
|
-
GOOGLE_DRAFT_BATCH_MAX,
|
|
4274
|
-
OP_TOO_LARGE_MESSAGE_START,
|
|
4275
|
-
OP_TOO_LARGE_FIX
|
|
4276
|
-
};
|
|
4277
|
-
//# sourceMappingURL=chunk-XHWHBGKX.js.map
|