PageSourceSearch

https://ad-intelligence-59ba7.web.app/chunk-XHZZK6ON.js

js ad-intelligence-59ba7.web.app collected 2026-10-03 12:16:22 UTC 246,457 bytes, 13 lines download raw bytes

1import{c as _t}from"./chunk-S3PNJC54.js";import{a as Q}from"./chunk-FUV7XL6P.js";import{a as gt,b as de}from"./chunk-HPH5YAIL.js";import{a as pt,b as he,c as ut}from"./chunk-3FBYWICL.js";import{a as mt}from"./chunk-5GTYKF4G.js";import{a as ct}from"./chunk-FSTGQY3M.js";import{a as _e}from"./chunk-ABEOKCRC.js";import"./chunk-G3FXFTBU.js";import"./chunk-RKR3PV64.js";import{a as lt,b as dt,d as oe}from"./chunk-5GBSNZOW.js";import{b as st}from"./chunk-UUZAEKOK.js";import{b as He,d as Xe}from"./chunk-OYWHTECT.js";import"./chunk-B6ML3TBS.js";import"./chunk-7VPF77TY.js";import"./chunk-4SSS2OJZ.js";import{e as Ue,m as Pe,o as ge,w as Re}from"./chunk-3XIPWIBB.js";import"./chunk-WAWFYPMX.js";import"./chunk-7MQTEMAJ.js";import"./chunk-HTCLQCOU.js";import"./chunk-6XPI5QYW.js";import"./chunk-YWMD53KQ.js";import{b as We}from"./chunk-A6AWQOXQ.js";import{C as rt,b as Qe,c as Je,h as Ze,l as Ye,n as et,t as tt,u as it,v as nt,w as at,x as ot}from"./chunk-PJ5GV7IK.js";import{g as Fe,m as Ge,p as ze,q as $e,t as Be,u as Ke,v as qe,x as je}from"./chunk-EDUSMAQY.js";import{Ab as b,B as S,Bb as F,Cb as X,Da as ue,Db as Me,E as Ne,Eb as we,Mb as se,Nb as Te,Pa as H,Ra as k,Rb as V,Sa as M,Sb as j,Tb as ae,Ua as Ie,Va as L,Wa as D,Wb as Ve,Xa as v,Ya as o,Za as a,_a as Z,_b as O,eb as Se,f as ne,fb as w,ia as d,jb as C,k as K,lb as c,p as _,q as h,vb as De,wb as ke,xa as Le,xb as A,zb as s}from"./chunk-FFQQO7O7.js";import"./chunk-ID4WHIPA.js";import"./chunk-QUA7QOZA.js";import{a as I,b as P}from"./chunk-C6Q5SG76.js";function re(){return new Date().toISOString()}function St(){return{autoTargetCount:0,broadKeywordCount:0,phraseKeywordCount:0,exactKeywordCount:0,productTargetCount:0,negativeKeywordCount:0,negativeProductTargetCount:0,unknownTargetCount:0}}var Ce=class l{amazonApi=K(_e);async loadCampaignsFromApi(t,e){if(!e?.orgId||!e.connectionId||!e.profileId)return[];let i=await this.amazonApi.getMonitorCache(e.connectionId,e.profileId,e.orgId,!1,!0);return this.buildCampaignSummariesFromSnapshot(t,i?.cache||{})}async loadTargetingClausesForCampaigns(t,e){return[]}buildCampaignSummariesFromSnapshot(t,e){let i=this.array(e?.campaignManager||e?.campaignManagerCampaignRows),n=this.array(e?.campaigns).length?this.array(e?.campaigns):i,r=[...this.array(e?.adGroups),...this.flattenNestedAdGroups(i)],m=[...this.array(e?.keywords),...this.flattenNestedTargets(i,"keywords")],u=[...this.array(e?.targets),...this.flattenNestedTargets(i,"targets")],p=[...this.array(e?.productAds),...this.flattenNestedTargets(i,"productAds")],g=re(),y=this.groupBy(r,T=>this.id(T.campaignId)),f=this.groupBy(m,T=>this.id(T.campaignId)),x=this.groupBy(u,T=>this.id(T.campaignId)),R=this.groupBy(p,T=>this.id(T.campaignId));return n.map(T=>{let E=this.id(T.campaignId||T.campaign_id||T.id||T.campaignIdString),q=String(T.name||T.campaignName||T.campaign_name||E||"Unknown campaign"),$=f.get(E)||[],Y=x.get(E)||[],me=R.get(E)||[],z=this.classifyCampaignTargetingMix(T,[...$,...Y]),B=this.detectCampaignRoleFromName(q);!$.length&&!Y.length&&((String(T.targetingType||"").toLowerCase()==="auto"||B==="auto_discovery")&&(z.autoTargetCount=Math.max(z.autoTargetCount,4)),B==="broad_discovery"?z.broadKeywordCount=Math.max(z.broadKeywordCount,1):B==="phrase_discovery"?z.phraseKeywordCount=Math.max(z.phraseKeywordCount,1):B==="exact_staging"?z.exactKeywordCount=Math.max(z.exactKeywordCount,1):(B==="pt_exact"||B==="pt_exact_staging")&&(z.productTargetCount=Math.max(z.productTargetCount,1)));let W=this.detectCampaignRoleFromTargetCounts(z),pe=this.detectAdProduct(T),J=this.detectState(T),ee=this.extractMatchingTitle(q),le=pe==="SD",yt=!le&&(z.autoTargetCount>0||z.broadKeywordCount>0||z.phraseKeywordCount>0||B==="auto_discovery"||B==="broad_discovery"||B==="phrase_discovery"||B==="custom"),It=!le&&(z.exactKeywordCount>0||z.productTargetCount>0||["exact_staging","pt_exact_staging","pt_exact","custom"].includes(B));return{campaignId:E,campaignName:q,adProduct:pe,state:J,nameDetectedRole:B,targetingDetectedRoles:W,targetingMix:z,isEligibleFromCampaign:yt,isEligibleToCampaign:It,linkedStatus:le?"ignored":"unlinked",adGroups:(y.get(E)||this.array(T.adGroups)).map(N=>({adGroupId:this.id(N.adGroupId||N.ad_group_id||N.id),adGroupName:String(N.name||N.adGroupName||N.ad_group_name||"Ad group"),state:String(N.state||N.status||"").toLowerCase()})),advertisedProducts:this.uniqueAdvertisedProducts(me,y.get(E)||this.array(T.adGroups)),existingPositiveTargets:[...$.map(N=>this.normalizeTargetText(N.keywordText||N.nativeLanguageKeyword||N.keyword||N.targetingText)),...Y.map(N=>
1this.normalizeTargetText(this.targetLabel(N)))].filter(Boolean),existingNegativeTargets:[...$.filter(N=>this.isNegative(N)).map(N=>this.normalizeTargetText(N.keywordText||N.keyword)),...Y.filter(N=>this.isNegative(N)).map(N=>this.normalizeTargetText(this.targetLabel(N)))].filter(Boolean),matchingTitle:ee,createdAt:g,updatedAt:g}}).sort((T,E)=>T.campaignName.localeCompare(E.campaignName))}classifyCampaignTargetingMix(t,e){let i=St();for(let n of e||[]){let r=this.targetLabel(n).toLowerCase(),m=String(n.matchType||n.keywordMatchType||n.match_type||"").toLowerCase(),u=String(n.expressionType||n.targetingType||n.targetingExpressionType||n.type||"").toLowerCase(),p=String(n.state||n.status||"").toLowerCase(),g=this.isNegative(n)||p.includes("negative")||u.includes("negative");if(g&&this.looksLikeProductTarget(r,u))i.negativeProductTargetCount+=1;else if(g)i.negativeKeywordCount+=1;else if(["broad","phrase","exact"].includes(this.positiveMatchType(m))){let y=this.positiveMatchType(m);y==="broad"&&(i.broadKeywordCount+=1),y==="phrase"&&(i.phraseKeywordCount+=1),y==="exact"&&(i.exactKeywordCount+=1)}else this.looksLikeAutoTarget(r,u)?i.autoTargetCount+=1:this.looksLikeProductTarget(r,u)?i.productTargetCount+=1:i.unknownTargetCount+=1}return i}parseCampaignRole(t){return this.detectCampaignRoleFromName(t)}extractMatchingTitle(t){let e=String(t||"").split("-").map(i=>i.trim()).filter(Boolean);if(e.length>=3){let i=e[0].toLowerCase(),n=e[1].toLowerCase(),r=e[2].toLowerCase();if(["broad","auto","phrase","exact"].includes(i)&&["discovery","staging"].includes(n))return this.normalizeMatchingTitle(e.slice(2).join(" - "));if(i==="pt"&&n==="exact"&&r==="staging")return this.normalizeMatchingTitle(e.slice(3).join(" - "));if(i==="pt"&&n==="exact")return this.normalizeMatchingTitle(e.slice(2).join(" - "))}return this.normalizeMatchingTitle(t)}normalizeMatchingTitle(t){return String(t||"").toLowerCase().replace(/\s+/g," ").replace(/^[\s:|._-]+|[\s:|._-]+$/g,"").trim()}detectKeywordLinks(t){let e=t.filter(r=>r.nameDetectedRole==="exact_staging"&&r.adProduct!=="SD"),i=t.filter(r=>r.adProduct!=="SD"&&["broad_discovery","auto_discovery","phrase_discovery"].includes(r.nameDetectedRole)),n=re();return i.map(r=>{let m=e.filter(p=>p.matchingTitle===r.matchingTitle),u=m[0];return{id:`auto-keyword-${r.campaignId||this.hash(r.campaignName)}`,orgId:"",accountId:"",linkType:"keyword",matchingTitle:r.matchingTitle||"",sourceCampaignId:r.campaignId,sourceCampaignName:r.campaignName,sourceRole:r.nameDetectedRole,destinationCampaignId:u?.campaignId,destinationCampaignName:u?.campaignName,destinationRole:"exact_staging",status:m.length===1?"linked":m.length>1?"ambiguous_match":"missing_destination",confidence:m.length===1?92:m.length>1?55:0,manualOverride:!1,createdAt:n,updatedAt:n}})}detectProductTargetLinks(t){let e=t.filter(m=>m.nameDetectedRole==="pt_exact_staging"&&m.adProduct!=="SD"),i=t.filter(m=>m.nameDetectedRole==="pt_exact"&&m.adProduct!=="SD"),n=t.filter(m=>m.adProduct!=="SD"&&m.nameDetectedRole==="auto_discovery"),r=re();return n.map(m=>{let u=e.filter(f=>f.matchingTitle===m.matchingTitle),p=i.filter(f=>f.matchingTitle===m.matchingTitle),g=u.length?u:p,y=g[0];return{id:`auto-product-${m.campaignId||this.hash(m.campaignName)}`,orgId:"",accountId:"",linkType:"product_target",matchingTitle:m.matchingTitle||"",sourceCampaignId:m.campaignId,sourceCampaignName:m.campaignName,sourceRole:"auto_discovery",destinationCampaignId:y?.campaignId,destinationCampaignName:y?.campaignName,destinationRole:u.length?"pt_exact_staging":"pt_exact",status:g.length===1?"linked":g.length>1?"ambiguous_match":"missing_destination",confidence:g.length===1?90:g.length>1?55:0,manualOverride:!1,createdAt:r,updatedAt:r}})}detectCampaignRoleFromName(t){let e=String(t||"").toLowerCase().replace(/\s+/g," ").trim();return/^auto\s*-\s*discovery\b/.test(e)?"auto_discovery":/^broad\s*-\s*discovery\b/.test(e)?"broad_discovery":/^phrase\s*-\s*discovery\b/.test(e)?"phrase_discovery":/^exact\s*-\s*staging\b/.test(e)?"exact_staging":/^pt\s*-\s*exact\s*-\s*staging\b/.test(e)?"pt_exact_staging":/^pt\s*-\s*exact\b/.test(e)?"pt_exact":"unknown"}detectCampaignRoleFromTargetCounts(t){let e=[];return t.autoTargetCount>0&&e.push("Auto"),t.broadKeywordCount>0&&e.push("Broad"),t.phraseKeywordCount>0&&e.push("Phrase"),t.exactKeywordCount>0&&e.push("Exact"),t.productTargetCount>0&&e.push("Product Target"),e.length||e.push("Unknown"),e}suggestCampaignLinks(t,e=[]){let i=[...this.detectKeywordLinks(t),...this.detectProductTargetLinks(t)],n=e.filter(m=>m.status==="active").flatMap(m=>(m.linkType==="both"?["keyword","product_target"]:m.linkType==="product_target_isolation"?["product_target"]:["keyword"]).map(p=>this.manualToCampaignLink(m,p))),r=new Set(n.map(m=>`${m.sourceCampaignId||m.sourceCampaignName}::${m.linkType}`));return[...i.filter(m=>!r.has(`${m.sourceCampaignId||m.sourceCampaignName}::${m.linkType}`)),...n]}
1createManualCampaignLink(t,e,i,n,r="",m=""){let u=n.find(y=>y.campaignId===t),p=n.find(y=>y.campaignId===e),g=re();return{id:`manual-${Date.now()}-${this.hash(`${t}-${e}-${i}`)}`,orgId:m,accountId:r,fromCampaignId:t,fromCampaignName:u?.campaignName||t,toCampaignId:e,toCampaignName:p?.campaignName||e,linkType:i,sourceNegativeDefault:!0,destinationAdGroupBehavior:"match_source_ad_group_name",status:"active",createdAt:g,updatedAt:g}}updateManualCampaignLink(t,e,i){return i.map(n=>n.id===t?P(I(I({},n),e),{updatedAt:re()}):n)}deleteManualCampaignLink(t,e){return e.filter(i=>i.id!==t)}saveManualOverride(t,e,i){return this.updateManualCampaignLink(t,{toCampaignId:e},i)}ignoreCampaignForIsolation(t,e){return e.map(i=>i.campaignId===t?P(I({},i),{linkedStatus:"ignored",updatedAt:re()}):i)}targetMixLabel(t){let e=[];return t.autoTargetCount>0&&e.push(`Auto: ${t.autoTargetCount}`),t.broadKeywordCount>0&&e.push(`Broad: ${t.broadKeywordCount}`),t.phraseKeywordCount>0&&e.push(`Phrase: ${t.phraseKeywordCount}`),t.exactKeywordCount>0&&e.push(`Exact: ${t.exactKeywordCount}`),t.productTargetCount>0&&e.push(`PT: ${t.productTargetCount}`),t.negativeKeywordCount>0&&e.push(`Neg KW: ${t.negativeKeywordCount}`),t.negativeProductTargetCount>0&&e.push(`Neg PT: ${t.negativeProductTargetCount}`),e.length?e.join(" | "):"No targeting data"}manualToCampaignLink(t,e){let i=re();return{id:`${t.id}-${e}`,orgId:t.orgId,accountId:t.accountId,linkType:e,matchingTitle:this.extractMatchingTitle(t.fromCampaignName),sourceCampaignId:t.fromCampaignId,sourceCampaignName:t.fromCampaignName,sourceRole:"custom",destinationCampaignId:t.toCampaignId,destinationCampaignName:t.toCampaignName,destinationRole:e==="product_target"?"pt_exact":"exact_staging",status:"manual_override",confidence:95,manualOverride:!0,createdAt:t.createdAt||i,updatedAt:t.updatedAt||i}}detectAdProduct(t){let e=String(t.adProduct||t.ad_product||t.product||t.campaignType||t.type||"").toLowerCase();return e.includes("sponsored display")||e==="sd"||e.includes("sponsoreddisplay")?"SD":e.includes("sponsored brands")||e==="sb"||e.includes("sponsoredbrands")?"SB":(e.includes("sponsored products")||e==="sp"||e.includes("sponsoredproducts"),"SP")}detectState(t){let e=String(t.state||t.status||"").toLowerCase();return e.includes("enabled")?"enabled":e.includes("paused")?"paused":e.includes("archived")?"archived":"unknown"}looksLikeAutoTarget(t,e){return["close-match","loose-match","substitutes","complements"].some(i=>t.includes(i))||e.includes("auto")}looksLikeProductTarget(t,e){return/\bB[0-9A-Z]{9}\b/i.test(t)||t.includes("asin=")||t.includes("category=")||e.includes("targeting")||e.includes("expression")}isNegative(t){return`${t.state||""} ${t.status||""} ${t.matchType||""} ${t.expressionType||""} ${t.targetingType||""}`.toLowerCase().includes("negative")}targetLabel(t){let e=t.expression||t.resolvedExpression||t.targetingExpression||t.targeting;return Array.isArray(e)?e.map(i=>`${i.type||"asin"}="${i.value||i.asin||""}"`).join(" "):String(t.resolvedExpression||t.targetingExpression||t.targetingText||t.displayLabel||t.matchLabel||t.targeting||t.keyword||t.keywordText||t.nativeLanguageKeyword||t.expressionType||"")}flattenNestedAdGroups(t){let e=[];for(let i of t||[]){let n=this.id(i?.campaignId||i?.campaign_id||i?.id);for(let r of this.array(i?.adGroups))e.push(P(I({},r),{campaignId:this.id(r?.campaignId||n)}))}return e}flattenNestedTargets(t,e){let i=[];for(let n of t||[]){let r=this.id(n?.campaignId||n?.campaign_id||n?.id);for(let m of this.array(n?.adGroups)){let u=this.id(m?.adGroupId||m?.ad_group_id||m?.id);for(let p of this.array(m?.[e]))i.push(P(I({},p),{campaignId:this.id(p?.campaignId||r),adGroupId:this.id(p?.adGroupId||u)}))}}return i}positiveMatchType(t){let e=String(t||"").toLowerCase().replace(/[_\s-]+/g,"");return e==="broad"?"broad":e==="phrase"?"phrase":e==="exact"?"exact":""}uniqueAdvertisedProducts(t,e){let i=new Map(this.array(e).map(r=>[this.id(r.adGroupId||r.ad_group_id||r.id),String(r.name||r.adGroupName||r.ad_group_name||"")])),n=new Map;for(let r of t||[]){let m=String(r.asin||r.ASIN||r.advertisedAsin||"").trim().toUpperCase(),u=String(r.sku||r.SKU||r.advertisedSku||"").trim();if(!m&&!u)continue;let p=this.id(r.adGroupId||r.ad_group_id),g=`${m}::${u}::${p}`;n.set(g,{asin:m,sku:u,adGroupId:p,adGroupName:i.get(p)||""})}return[...n.values()].slice(0,8)}normalizeTargetText(t){let e=String(t||"").trim().toLowerCase(),i=e.match(/\bB[0-9A-Z]{9}\b/i)?.[0];return i?i.toUpperCase():e.replace(/\s+/g," ")}groupBy(t,e){let i=new Map;for(let n of t){let r=e(n);i.has(r)||i.set(r,[]),i.get(r).push(n)}return i}array(t){return Array.isArray(t)?t:[]}id(t){return String(t??"").trim()}hash(t){let e=0;for(let i=0;i<t.length;i+=1)e=(e<<5)-e+t.charCodeAt(i),e|=0;return Math.abs(e).toString(36)}static \u0275fac=function(e){return new(e||l)};static \u0275prov=ne({token:l,factory:l.\u0275fac,providedIn:"root"})};var Mt=/^B[0-9A-Z]{9}$/i,xe=class l{validateExport(t,e=[],i="approved"){let n=[],r=new Set,m=i!=="audit"&&i!=="negatives",u=i!=="audit"&&i!=="keyword"&&i!=="product";for(let p of t){if(m){let g=`${p.recommendationType}::${p.destinationCampaignId||p.destinationCampaignName}::${p.destinationAdGroupId||p.destinationAdGroupName}::${p.searchTerm}`.toLowerCase();r.has(g)&&n.push({recommendationId:p.id,issue:"Duplicate positive target row",severity:"error",suggestedFix:"Export only one row for the same term, destination campaign, and ad group."}),r.add(g)}if(p.searchTerm.trim()||n.push({recommendationId:p.id,issue:"Search term is empty",severity:"error"}),p.searchTermType==="asin"&&!Mt.test(p.searchTerm)&&n.push({recommendationId:p.id,issue:"ASIN format is invali
1d",severity:"error",suggestedFix:"Use a B0-style ASIN for product targeting."}),m){!p.destinationCampaignName&&!p.destinationCampaignId&&n.push({recommendationId:p.id,issue:"Destination campaign is missing",severity:"error",suggestedFix:"Map the source campaign in Campaign Links."});let g=this.resolveDestination(p,e);g.campaignId||n.push({recommendationId:p.id,issue:"Destination campaign ID is missing",severity:"error",suggestedFix:"Sync campaigns before exporting Amazon upload files."}),g.adGroupId||n.push({recommendationId:p.id,issue:"Destination ad group ID is missing",severity:"error",suggestedFix:"Sync ad groups or choose a destination ad group before export."}),(!Number.isFinite(p.bid.suggestedBid)||p.bid.suggestedBid<=0)&&n.push({recommendationId:p.id,issue:"Suggested bid is invalid",severity:"error"})}if(u){!p.sourceCampaignName&&!p.sourceCampaignId&&n.push({recommendationId:p.id,issue:"Source campaign is missing",severity:"error"});for(let g of this.enabledSources(p)){let y=this.resolveSource(g,e);y.campaignId||n.push({recommendationId:p.id,issue:"Source campaign ID is missing for a source negative",severity:"error",suggestedFix:"Sync campaigns before exporting source negatives."}),p.searchTermType==="asin"&&!y.adGroupVerified?n.push({recommendationId:p.id,issue:"Source ad group ID could not be verified for a negative product target",severity:"error",suggestedFix:"Sync ad groups before exporting product-target source negatives."}):p.searchTermType!=="asin"&&g.sourceAdGroupId&&e.length&&!y.adGroupVerified&&n.push({recommendationId:p.id,issue:"Source ad group ID does not belong to the source campaign; exporting keyword negative at campaign level",severity:"warning",suggestedFix:"Sync ad groups if you need an ad-group-level source negative."})}}p.status==="missing_link"&&n.push({recommendationId:p.id,issue:"Missing campaign link blocks export",severity:"error"}),p.status==="already_isolated"&&n.push({recommendationId:p.id,issue:"Target already exists in destination",severity:"error"}),(p.status==="protected"||p.status==="rejected"||p.status==="skipped")&&n.push({recommendationId:p.id,issue:"Recommendation status is not exportable",severity:"error"}),p.status==="exported"&&n.push({recommendationId:p.id,issue:"Recommendation was already exported",severity:"warning",suggestedFix:"Confirm it was not already uploaded before re-exporting."}),p.bid.maxBidApplied&&n.push({recommendationId:p.id,issue:"Max bid cap was applied",severity:"warning",suggestedFix:"Review bid cap before upload."}),p.bid.fallbackApplied&&n.push({recommendationId:p.id,issue:"Fallback bid was used",severity:"warning",suggestedFix:"Avg CPC could not be calculated from clicks."})}return n}buildKeywordTargetRows(t,e=[]){return t.filter(i=>i.recommendationType==="keyword_exact_create").map(i=>this.keywordPositiveRow(i,e))}buildProductTargetRows(t,e=[]){return t.filter(i=>i.recommendationType==="product_target_create").map(i=>this.productPositiveRow(i,e))}buildSourceNegativeRows(t,e=[]){let i=[];for(let n of t)for(let r of this.enabledSources(n)){let m=this.resolveSource(r,e);if(n.searchTermType==="asin"){if(!m.adGroupVerified)continue;i.push(this.productNegativeRow(n,m))}else i.push(this.keywordNegativeRow(n,m))}return i}generateCsvOrXlsx(t){let e=t.recommendations,i=t.campaigns||[];if(!e.length)return null;let n=[];if(t.mode==="audit"?n=e.map(x=>this.auditRow(x)):t.mode==="keyword"?n=this.buildKeywordTargetRows(e,i):t.mode==="product"?n=this.buildProductTargetRows(e,i):t.mode==="negatives"?n=this.buildSourceNegativeRows(e,i):n=[...this.buildKeywordTargetRows(e,i),...this.buildProductTargetRows(e,i),...this.buildSourceNegativeRows(e,i)],!n.length)return null;let r=new Date().toISOString().slice(0,10),m=this.safeFilename(t.accountName),u=t.mode==="audit",p=new Date().toISOString(),g=`ii-export-${Date.now()}`,y=u?`isolation-intelligence-audit-${m}-${r}.csv`:`isolation-intelligence-bulk-upload-${m}-${r}.xlsx`,f=this.buildExportLineItems(e,i,t.mode||"approved",g,y,p);return u?this.downloadAuditCsv(y,n):this.downloadAmazonBulkXlsx(y,n),{id:g,orgId:e[0]?.orgId||"",accountId:e[0]?.accountId||"",filename:y,fileType:u?"csv":"xlsx",mode:t.mode||"approved",accountName:t.accountName,recommendationIds:u?[]:e.map(x=>x.id),rowCount:n.length,exportedAt:p,status:"created",validationIssues:u?[]:this.validateExport(e,i,t.mode||"approved"),lineItems:f}}
1markExported(t,e,i){let n=new Set(e),r=new Date().toISOString();return i.map(m=>n.has(m.id)?P(I({},m),{status:"exported",exportBatchId:t,exportedAt:r,updatedAt:r}):m)}auditHeaders(){return["Product","Entity","Operation","Campaign ID","Campaign Name","Ad Group ID","Ad Group Name","Keyword Text","Match Type","Targeting Expression / ASIN","Bid","State","Recommendation ID","Source Campaign","Source Ad Group","Source Target","Original Search Term","Rule Triggered","Bid Strategy","Suggested Bid","Source Negative Enabled","Reason","Orders","Sales","Spend","Clicks","ACoS","Confidence","Status"]}enabledSources(t){return(t.sourceBreakdowns?.length?t.sourceBreakdowns:[{sourceCampaignId:t.sourceCampaignId,sourceCampaignName:t.sourceCampaignName,sourceAdGroupId:t.sourceAdGroupId,sourceAdGroupName:t.sourceAdGroupName,metrics:t.metrics,sourceNegativeEnabled:t.sourceNegativeEnabled}]).filter(i=>t.sourceNegativeEnabled||i.sourceNegativeEnabled)}resolveDestination(t,e){let i=this.findCampaign(e,t.destinationCampaignId,t.destinationCampaignName);if(!i)return{campaignId:t.destinationCampaignId||"",campaignName:t.destinationCampaignName||"",adGroupId:t.destinationAdGroupId||"",adGroupName:t.destinationAdGroupName||""};let n=this.resolveAdGroup(i,t.destinationAdGroupId,t.destinationAdGroupName,!0);return{campaignId:i.campaignId,campaignName:i.campaignName,adGroupId:n.adGroupId,adGroupName:n.adGroupName}}resolveSource(t,e){let i=this.findCampaign(e,t.sourceCampaignId,t.sourceCampaignName);if(!i)return{campaignId:t.sourceCampaignId||"",campaignName:t.sourceCampaignName||"",adGroupId:t.sourceAdGroupId||"",adGroupName:t.sourceAdGroupName||"",adGroupVerified:!e.length&&!!t.sourceAdGroupId,metrics:t.metrics};let n=this.resolveAdGroup(i,t.sourceAdGroupId,t.sourceAdGroupName,!1);return{campaignId:i.campaignId,campaignName:i.campaignName,adGroupId:n.adGroupId,adGroupName:n.adGroupName,adGroupVerified:n.verified,metrics:t.metrics}}findCampaign(t,e,i){return t.find(n=>e&&n.campaignId===e)||t.find(n=>this.normalize(n.campaignName)===this.normalize(i||""))}resolveAdGroup(t,e,i,n=!1){let r=t.adGroups||[],m=r.find(p=>e&&p.adGroupId===e);if(m)return{adGroupId:m.adGroupId,adGroupName:m.adGroupName,verified:!0};let u=r.find(p=>this.normalize(p.adGroupName)===this.normalize(i||""));if(u)return{adGroupId:u.adGroupId,adGroupName:u.adGroupName,verified:!0};if(n){let p=r.find(g=>String(g.state||"").toLowerCase()==="enabled")||r[0];if(p)return{adGroupId:p.adGroupId,adGroupName:p.adGroupName,verified:!0}}return{adGroupId:"",adGroupName:"",verified:!1}}buildExportLineItems(t,e,i,n,r,m){let u=[],p=2,g=x=>{u.push(P(I({},x),{id:`${n}-line-${u.length+1}`,batchId:n,filename:r,exportedAt:m}))};if(i==="audit"){for(let x of t)g({recommendationId:x.id,searchTerm:x.searchTerm,actionType:"audit",actionLabel:"Audit row",detail:`Exported audit context for ${x.searchTerm}; no Amazon action was created.`,sourceCampaignName:x.sourceCampaignName,sourceAdGroupName:x.sourceAdGroupName,destinationCampaignName:x.destinationCampaignName,destinationAdGroupName:x.destinationAdGroupName,spreadsheetRowNumber:p++,status:"exported"});return u}let y=i!=="negatives",f=i!=="keyword"&&i!=="product";if(y){for(let x of t.filter(R=>R.recommendationType==="keyword_exact_create")){let R=this.resolveDestination(x,e);g({recommendationId:x.id,searchTerm:x.searchTerm,actionType:"keyword_exact_create",actionLabel:"Moved to Exact keyword",detail:`Added "${x.searchTerm}" as an Exact keyword in ${this.route(R.campaignName,R.adGroupName)} at $${this.roundMoney(x.bid.suggestedBid).toFixed(2)}.`,campaignId:R.campaignId,campaignName:R.campaignName,adGroupId:R.adGroupId,adGroupName:R.adGroupName,destinationCampaignName:R.campaignName,destinationAdGroupName:R.adGroupName,spreadsheetRowNumber:p++,status:"exported"})}for(let x of t.filter(R=>R.recommendationType==="product_target_create")){let R=this.resolveDestination(x,e);g({recommendationId:x.id,searchTerm:x.searchTerm,actionType:"product_target_create",actionLabel:"Moved to Product Target",detail:`Added ${this.asinExpression(x.searchTerm)} as a product target in ${this.route(R.campaignName,R.adGroupName)} at $${this.roundMoney(x.bid.suggestedBid).toFixed(2)}.`,campaignId:R.campaignId,campaignName:R.campaignName,adGroupId:R.adGroupId,adGroupName:R.adGroupName,destinationCampaignName:R.campaignName,destinationAdGroupName:R.adGroupName,spreadsheetRowNumber:p++,status:"exported"})}}if(f)for(let x of t){let R=this.enabledSources(x);if(!R.length&&i!=="negatives"){g({recommendationId:x.id,searchTerm:x.searchTerm,actionType:"source_negative_skipped",actionLabel:"No source negative",detail:`No source negative was exported for "${x.searchTerm}".`,sourceCampaignName:x.sourceCampaignName,sourceAdGroupName:x.sourceAdGroupName,destinationCampaignName:x.destinationCampaignName,destinationAdGroupName:x.destinationAdGroupName,status:"not_applicable"});continue}for(let T of R){let E=this.resolveSource(T,e);if(x.searchTermType==="asin"){if(!E.adGroupVerified)continue;g({recommendationId:x.id,searchTerm:x.searchTerm,actionType:"source_negative_product",actionLabel:"Negative product target",detail:`Added ${this.asinExpression(x.searchTerm)} as a negative product target in ${this.route(E.campaignName,E.adGroupName)}.`,campaignId:E.campaignId,campaignName:E.campaignName,adGroupId:E.adGroupId,adGroupName:E.adGroupName,sourceCampaignName:E.campaignName,sourceAdGroupName:E.adGroupName,spreadsheetRowNumber:p++,status:"exported"})}else{let q=!E.adGroupVerified;g({recommendationId:x.id,searchTerm:x.searchTerm,actionType:q?"campaign_negative_exact":"source_negative_exact",actionLabel:q?"Campaign negative exact":"Negative Exact",detail:`Added "${x.searchTerm}" as a Negative Exact in ${this.route(E.campaignName,q?"":E.adGroupName)}.`,campaignId:E.campaignId,campaignName:E.campaignName,adGroupId:q?"":E.adGroupId,adGroupName:q?"":E.adGroupName,sourceCampaignName:E.campaignName,sourceAdGroupName:q?"":E.adGroupName,spreadsheetRowNumber:p++,status:"exported"})}}}return u}keywordPositiveRow(t,e){let i=this.resolveDestination(t,e);return this.amazonUploadRow(t,{entity:"Keyword",campaignId:i.campaignId,campaignName:i.campaignName,adGroupId:i.adGroupId,adGroupName:i.adGroupName,keywordText:t.searchTerm,matchType:"Exact",expression:"",bid:t.bid.suggestedBid,metrics:t.metrics})}productPositiveRow(t,e){let i=this.resolveDestination(t,e);return this.amazonUploadRow(t,{entity:"Product Targeting",campaignId:i.campaignId,campaignName:i.campaignName,adGroupId:i.adGroupId,adGroupName:i.adGroupName,keywordText:"",matchType:"",expression:this.asinExpression(t.searchTerm),bid:t.bid.suggestedBid,metrics:t.metrics})}keywordNegativeRow(t,e){let i=!e.adGroupVerified;return this.amazonUploadRow(t,{entity:i?"Campaign Negative Keyword":"Negative Keyword",campaignId:e.campaignId,campaignName:e.campaignName,adGroupId:i?"":e.adGroupId,adGroupName:i?"":e.adGroupName,keywordText:t.searchTerm,matchType:"Negative Exact",expression:"",bid:"",metrics:e.metrics})}productNegativeRow(t,e){return this.amazonUploadRow(t,{entity:"Negative Product Targeting",campaignId:e.campaignId,campaignName:e.campaignName,adGroupId:e.adGroupId,adGroupName:e.adGroupName,keywordText:"",matchType:"",expression:this.asinExpression(t.searchTerm),bid:"",metrics:e.metrics})}auditRow(t){return["Sponsored Products",t.searchTermType==="asin"?"Product Targeting":"Keyword","Create",this.textCell(t.de
1stinationCampaignId||""),t.destinationCampaignName||"",this.textCell(t.destinationAdGroupId||""),t.destinationAdGroupName||"",t.searchTermType==="query"?t.searchTerm:"",t.searchTermType==="query"?"Exact":"",t.searchTermType==="asin"?this.asinExpression(t.searchTerm):"",this.roundMoney(t.bid.suggestedBid),"enabled",t.id,t.sourceCampaignName||"",t.sourceAdGroupName||"",t.sourceTargetText||"",t.searchTerm,t.rule.ruleName,t.bid.formula,t.bid.suggestedBid,t.sourceNegativeEnabled?"Yes":"No",t.reason,t.metrics.orders,t.metrics.sales,t.metrics.spend,t.metrics.clicks,t.metrics.acos??"",t.confidence,t.status]}amazonUploadRow(t,e){let i=this.emptySponsoredProductsRecord(),n=e.metrics||t.metrics,r=e.bid===""?"":this.roundMoney(Number(e.bid));return i.Product="Sponsored Products",i.Entity=e.entity,i.Operation="Create",i["Campaign ID"]=this.textCell(e.campaignId),i["Ad Group ID"]=this.textCell(e.adGroupId),i["Campaign Name (Informational only)"]=e.campaignName,i["Ad Group Name (Informational only)"]=e.adGroupName,i["Campaign State (Informational only)"]="enabled",i["Ad Group State (Informational only)"]=e.adGroupId?"enabled":"",i["Targeting Type"]=e.entity==="Keyword"?"Manual":"",i.State="enabled",i.Bid=r,i["Keyword Text"]=e.keywordText,i["Match Type"]=e.matchType,i["Product Targeting Expression"]=e.expression,i["Resolved Product Targeting Expression (Informational only)"]=e.expression,i["ASIN (Informational only)"]=this.extractAsin(e.expression||t.searchTerm),i.Impressions=n.impressions,i.Clicks=n.clicks,i["Click-through Rate"]=this.roundRatio(n.ctr),i.Spend=this.roundMoney(n.spend),i.Sales=this.roundMoney(n.sales),i.Orders=n.orders,i["Conversion Rate"]=this.roundRatio(n.cvr),i.ACOS=n.acos==null?"":this.roundRatio(n.acos),i.CPC=this.roundMoney(n.cpc),i.ROAS=n.roas==null?"":this.roundRatio(n.roas),de.map(m=>i[m]??"")}emptySponsoredProductsRecord(){return Object.fromEntries(de.map(t=>[t,""]))}textCell(t){return t?{t:"s",v:String(t)}:""}asinExpression(t){return`asin="${String(t||"").trim().replace(/"/g,"").toUpperCase()}"`}extractAsin(t){return String(t||"").match(/\bB[0-9A-Z]{9}\b/i)?.[0]?.toUpperCase()||""}roundMoney(t){return Math.round((Number(t)+Number.EPSILON)*100)/100}roundRatio(t){return Math.round((Number(t)+Number.EPSILON)*1e4)/1e4}downloadAmazonBulkXlsx(t,e){let i=[Array.from(de),...e],n=oe.aoa_to_sheet(i);n["!cols"]=de.map(g=>({wch:g.includes("Informational")?28:Math.max(10,Math.min(34,g.length+4))})),n["!freeze"]={xSplit:0,ySplit:1};let r=oe.decode_range(n["!ref"]||"A1");for(let g=r.s.c;g<=r.e.c;g++){let y=oe.encode_cell({r:0,c:g});n[y]&&(n[y].s={font:{bold:!0,sz:11},fill:{fgColor:{rgb:"FF232F3E"},patternType:"solid"},alignment:{horizontal:"center",wrapText:!1}})}let m=oe.book_new();oe.book_append_sheet(m,n,gt);let u=dt(m,{bookType:"xlsx",type:"array"}),p=new Blob([u],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});this.downloadBlob(t,p)}downloadAuditCsv(t,e){let n=[this.auditHeaders(),...e].map(m=>m.map(u=>this.csvEscape(this.csvValue(u))).join(",")).join(`
2`),r=new Blob([n],{type:"text/csv;charset=utf-8;"});this.downloadBlob(t,r)}downloadBlob(t,e){let i=URL.createObjectURL(e),n=document.createElement("a");n.href=i,n.download=t,n.style.visibility="hidden",document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i)}csvValue(t){return t&&typeof t=="object"&&"v"in t?String(t.v??""):String(t??"")}csvEscape(t){return/[",\n\r]/.test(t)?`"${t.replace(/"/g,'""')}"`:t}route(t,e){return e?`${t} > ${e}`:t}normalize(t){return String(t||"").toLowerCase().trim().replace(/\s+/g," ")}safeFilename(t){return String(t||"selected-account").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"selected-account"}static \u0275fac=function(e){return new(e||l)};static \u0275prov=ne({token:l,factory:l.\u0275fac,providedIn:"root"})};var wt=/^B[0-9A-Z]{9}$/i,ve=class l{normalizeColumns(t){return this.excludeSponsoredDisplay((t||[]).map(e=>this.normalizeRow(e))).filter(e=>!!e.searchTerm&&!!e.campaignName)}detectAdProduct(t){let e=this.first(t.adProduct,t["Ad Product"],t.Product,t.product,t.campaignType,t["Campaign Type"],t.recordType).toLowerCase();return e.includes("sponsored display")||e==="sd"||e.includes("sponsoreddisplay")?"SD":e.includes("sponsored brands")||e==="sb"||e.includes("sponsoredbrands")?"SB":(e.includes("sponsored products")||e==="sp"||e.
2includes("sponsoredproducts"),"SP")}detectSearchTermType(t){let e=this.searchTerm(t).trim().toUpperCase();return wt.test(e)?"asin":"query"}excludeSponsoredDisplay(t){return t.filter(e=>e.adProduct!=="SD")}aggregateSearchTermMetrics(t){let e=new Map;for(let i of t){let n=[i.accountId||i.profileId||"",i.adProduct,i.campaignId||i.campaignName,i.adGroupId||i.adGroupName,this.normalize(i.searchTerm)].join("::"),r=e.get(n);if(!r){e.set(n,I({},i));continue}r.impressions+=i.impressions,r.clicks+=i.clicks,r.spend+=i.spend,r.orders+=i.orders,r.sales+=i.sales,this.recalculateRates(r)}return[...e.values()]}normalizeRow(t){let e=this.searchTerm(t),i=this.number(this.pick(t,["impressions","Impressions"])),n=this.number(this.pick(t,["clicks","Clicks"])),r=this.money(this.pick(t,["spend","Spend","cost","Cost"])),m=this.number(this.pick(t,["orders","Orders","purchases","Purchases","7 Day Total Orders (#)","7 Day Total Orders","7 Day Total Purchases (#)","purchases7d","purchases14d","attributedConversions7d","attributedConversions14d"])),u=this.money(this.pick(t,["sales","Sales","7 Day Total Sales","14 Day Total Sales","sales7d","sales14d","attributedSales7d","attributedSales14d"]));return{orgId:String(t.orgId||""),accountId:String(t.accountId||t.profileId||""),profileId:String(t.profileId||""),marketplace:String(t.marketplace||t.countryCode||""),adProduct:this.detectAdProduct(t),campaignId:this.first(t.campaignId,t["Campaign ID"],t["Campaign Id"]),campaignName:this.first(t.campaignName,t["Campaign Name"],t.campaign,t.Campaign),adGroupId:this.first(t.adGroupId,t["Ad Group ID"],t["Ad group ID"],t.ad_group_id),adGroupName:this.first(t.adGroupName,t["Ad Group Name"],t["Ad group"],t.adGroup,t["Ad Group"]),sourceTargetText:this.first(t.sourceTargetText,t.targeting,t.Targeting,t["Matched Target"],t.keyword,t["Keyword Text"],t.keywordText),sourceTargetType:this.first(t.sourceTargetType,t.targetingType,t["Targeting Type"],t.entity,t.Entity),sourceMatchType:this.first(t.sourceMatchType,t.matchType,t["Match Type"]),searchTerm:e,searchTermType:this.detectSearchTermType(P(I({},t),{searchTerm:e})),impressions:i,clicks:n,spend:r,orders:m,sales:u,ctr:i>0?n/i:this.ratioValue(t,["ctr","CTR","Click-through Rate"]),cpc:n>0?r/n:this.money(this.pick(t,["cpc","CPC","costPerClick"])),cvr:n>0?m/n:this.ratioValue(t,["cvr","CVR","Conversion Rate"]),acos:u>0?r/u:this.nullableRatio(t,["acos","ACOS","Total Advertising Cost of Sales","acosClicks7d"]),date:this.first(t.date,t.Date,t.startDate,t["Start Date"]),raw:t}}searchTerm(t){return this.first(t.searchTerm,t.customerSearchTerm,t["Customer Search Term"],t["Search Term"],t["Search Query"],t.Query,t.query,t.asin,t.ASIN)}recalculateRates(t){t.ctr=t.impressions>0?t.clicks/t.impressions:0,t.cpc=t.clicks>0?t.spend/t.clicks:0,t.cvr=t.clicks>0?t.orders/t.clicks:0,t.acos=t.sales>0?t.spend/t.sales:null}pick(t,e){for(let i of e)if(t[i]!==void 0&&t[i]!==null&&String(t[i]).trim()!=="")return t[i]}first(...t){for(let e of t){let i=String(e??"").trim();if(i)return i}return""}number(t){let e=Number(String(t??"").replace(/[$,%]/g,"").replace(/,/g,""));return Number.isFinite(e)?e:0}money(t){return this.number(t)}ratioValue(t,e){let i=this.pick(t,e);if(i===void 0)return 0;let n=String(i).trim(),r=this.number(i);return n.includes("%")?r/100:r}nullableRatio(t,e){let i=this.pick(t,e);if(i===void 0)return null;let n=String(i).trim(),r=this.number(i);return Number.isFinite(r)?n.includes("%")?r/100:r:null}normalize(t){return String(t||"").toLowerCase().trim().replace(/\s+/g," ")}static \u0275fac=function(e){return new(e||l)};static \u0275prov=ne({token:l,factory:l.\u0275fac,providedIn:"root"})};var Tt=/^B[0-9A-Z]{9}$/i;function U(){return new Date().toISOString()}function ht(l){let t=0;for(let e=0;e<l.length;e+=1)t=(t<<5)-t+l.charCodeAt(e),t|=0;return Math.abs(t).toString(36)}function te(l="",t=""){let e=U();return{id:"default-search-term-isolation",orgId:l,accountId:t,name:"Default Search Term Isolation",enabled:!0,lookbackType:"last_x_days",lookbackDays:30,minOrders:2,requireAcosMax:!1,maxAcos:.3,requireClicksMin:!1,minClicks:10,requireSpendMin:!1,minSpend:0,requireCtrMin:!1,minCtr:0,requireCvrMin:!1,minCvr:0,includePhrases:[],excludePhrases:["test","replacement","free","used"],includeAdProducts:["SP","SB"],excludeAdProducts:["SD"],sourceCampaignRoles:["broad_discovery","auto_discovery","phrase_discovery","custom"],keywordDestinationRole:"exact_staging",productDestinationPreference:"pt_exact_staging_then_pt_exact",addNegativeToSource:!0,keywordNegativeType:"negative_exact",productNegativeType:"negative_product_target",bidStrategy:{type:"avg_cpc",fallbackBid:.75,multiplier:1.1,minBid:.3,maxBid:2.5},createdAt:e,updatedAt:e}}var be=class l{readOnlyMode=!0;recommendationChunkByteLimit=42e4;firestore=K(Ue);errors=K(He);async loadSetup(t,e=""){let i=String(t||"local-account"),n=String(e||"");if(n){let r=await this.loadProfileField(n,i,"defaultRule",null,[`ii_rule_${i}`]);if(r)return r}try{let r=localStorage.getItem(`ii_rule_${i}`);return r?JSON.parse(r):te(n,i)}catch{return te(n,i)}}async saveRule(t,e=t.orgId||""){let i=String(t.accountId||"local-account"),n=String(e||""),r=P(I({},t),{orgId:n,accountId:i,updatedAt:U()});if(n){await this.saveProfileField(n,i,{defaultRule:r}),this.clearLocalKeys([`ii_rule_${i}`]);return}localStorage.setItem(`ii_rule_${i}`,JSON.stringify(r))}async loadSavedRules(t,e){return this.loadPortableArray(t,e,"savedRules",[`ii_saved_rules_${t||"no-org"}_${e}`,"ii_saved_rules"])}async saveSavedRules(t,e,i){await this.savePortableArray(t,e,"savedRules",i,[`ii_saved_rules_${t||"no-org"}_${e}`,"ii_saved_rules"])}async loadManualLinks(t,e){return this.loadPortableArray(t,e,"manualLinks",[`ii_manual_links_${e}`])}
2async saveManualLinks(t,e,i){await this.savePortableArray(t,e,"manualLinks",i,[`ii_manual_links_${e}`])}async loadActiveRules(t,e){return this.loadPortableArray(t,e,"activeRules",[`ii_active_rules_${e}`])}async saveActiveRules(t,e,i){await this.savePortableArray(t,e,"activeRules",i,[`ii_active_rules_${e}`])}async loadExportHistory(t,e){return this.loadPortableArray(t,e,"exportHistory",[`ii_exports_${e}`])}async saveExportHistory(t,e,i){await this.savePortableArray(t,e,"exportHistory",i.slice(0,200),[`ii_exports_${e}`])}async loadRecommendationCache(t,e,i){let n=String(t||""),r=String(e||"local-account");if(n)try{let m=await ge(this.profileDoc(n,r)),u=m.exists()?m.data()?.recommendationCache:void 0;if(u?.recommendationStorage==="chunked"){let g=await this.loadChunkedRecommendationCache(n,r,u);if(g)return g}if(u)return u;let p=this.loadLocalValue([i]);if(p)return await this.saveChunkedRecommendationCache(n,r,p),this.clearLocalKeys([i]),p}catch(m){this.errors.handleWarning("Isolation recommendation cache load",m,"Isolation Intelligence loaded local fallback data because cloud sync failed.");let u=this.loadLocalValue([i]);if(u)return u}return this.loadLocalValue([i])}async saveRecommendationCache(t,e,i,n){let r=String(t||""),m=String(e||"local-account");if(r)try{await this.saveChunkedRecommendationCache(r,m,i),this.clearLocalKeys([n]);return}catch(u){this.errors.handleWarning("Isolation recommendation cache save",u,"Recommendation results saved locally, but cloud sync failed.")}this.saveLocalValue(n,i)}async loadPortableArray(t,e,i,n){let r=String(t||""),m=String(e||"local-account");if(r){let u=await this.loadProfileField(r,m,i,null,n);if(Array.isArray(u))return u}return this.loadLocalArray(n)}async savePortableArray(t,e,i,n,r){let m=String(t||""),u=String(e||"local-account");if(m)try{await this.saveProfileField(m,u,{[i]:Array.isArray(n)?n:[]}),this.clearLocalKeys(r);return}catch(p){this.errors.handleWarning(`Isolation Intelligence ${i} save`,p,"Isolation Intelligence changes saved locally, but cloud sync failed.")}this.saveLocalArray(r[0],n)}
2async loadProfileField(t,e,i,n,r){try{let m=await ge(this.profileDoc(t,e)),u=m.exists()?m.data()?.[i]:void 0;if(u!=null)return u;let p=this.loadLocalValue(r);if(p!=null)return await this.saveProfileField(t,e,{[i]:p}),this.clearLocalKeys(r),p}catch(m){this.errors.handleWarning(`Isolation Intelligence ${i} load`,m,"Isolation Intelligence loaded local fallback data because cloud sync failed.");let u=this.loadLocalValue(r);if(u!=null)return u}return n}async saveProfileField(t,e,i){await Re(this.profileDoc(t,e),this.stripUndefined(P(I({orgId:t,accountId:e},i),{updatedAt:U()})),{merge:!0})}profileDoc(t,e){return Pe(this.firestore,`organizations/${t}/isolation_intelligence_profiles/${this.safeDocId(e)}`)}recommendationChunkDoc(t,e,i){return Pe(this.firestore,`organizations/${t}/isolation_intelligence_recommendation_chunks/${this.safeDocId(e)}_${i}`)}async loadChunkedRecommendationCache(t,e,i){let n=Math.max(0,Math.floor(Number(i.recommendationChunkCount)||0)),r=String(i.recommendationCacheId||"");if(!n||!r)return null;let u=(await Promise.all(Array.from({length:n},(p,g)=>ge(this.recommendationChunkDoc(t,e,g))))).flatMap(p=>{let g=p.exists()?p.data():null;return!g||g.cacheId!==r?[]:this.parseRecommendationChunk(g)});return{recommendations:u,lastScanDate:i.lastScanDate||null,rawUploadName:i.rawUploadName||"",savedAt:i.savedAt||U(),recommendationStorage:"chunked",recommendationCacheId:r,recommendationChunkCount:n,recommendationCount:u.length}}async saveChunkedRecommendationCache(t,e,i){let n=Array.isArray(i.recommendations)?i.recommendations:[],r=`${Date.now()}_${ht(`${e}:${i.savedAt}:${n.length}`)}`,m=this.chunkRecommendations(n);for(let[p,g]of m.entries()){let y=this.stripUndefined(g);await Re(this.recommendationChunkDoc(t,e,p),{orgId:t,accountId:e,cacheId:r,chunkIndex:p,chunkCount:m.length,recommendationCount:y.length,recommendationsJson:JSON.stringify(y),updatedAt:U()})}let u={recommendations:[],lastScanDate:i.lastScanDate||null,rawUploadName:i.rawUploadName||"",savedAt:i.savedAt||U(),recommendationStorage:"chunked",recommendationCacheId:r,recommendationChunkCount:m.length,recommendationCount:n.length};await this.saveProfileField(t,e,{recommendationCache:u})}chunkRecommendations(t){let e=[],i=[],n=2;for(let r of t){let m=this.estimateJsonBytes(this.stripUndefined(r))+1;i.length&&n+m>this.recommendationChunkByteLimit&&(e.push(i),i=[],n=2),i.push(r),n+=m}return e.push(i),e}parseRecommendationChunk(t){if(typeof t.recommendationsJson=="string")try{let e=JSON.parse(t.recommendationsJson);return Array.isArray(e)?e:[]}catch{return[]}return Array.isArray(t.recommendations)?t.recommendations:[]}estimateJsonBytes(t){try{return new Blob([JSON.stringify(t)]).size}catch{return JSON.stringify(t||"").length}}stripUndefined(t){if(Array.isArray(t))return t.map(e=>this.stripUndefined(e));if(t&&typeof t=="object"){let e={};for(let[i,n]of Object.entries(t))n!==void 0&&(e[i]=this.stripUndefined(n));return e}return t}loadLocalArray(t){let e=this.loadLocalValue(t);return Array.isArray(e)?e:[]}saveLocalArray(t,e){this.saveLocalValue(t,Array.isArray(e)?e:[])}saveLocalValue(t,e){try{localStorage.setItem(t,JSON.stringify(e))}catch{}}loadLocalValue(t){try{for(let e of t){let i=localStorage.getItem(e);if(i)return JSON.parse(i)}}catch{return null}return null}clearLocalKeys(t){try{t.forEach(e=>localStorage.removeItem(e))}catch{}}safeDocId(t){return String(t||"local-account").replace(/[/?#[\].]/g,"_").slice(0,240)}async runScan(t,e,i){return Promise.resolve()}generateRecommendations(t,e,i,n,r=[],m=[]){let u=new Map(n.map(f=>[f.campaignId,f])),p=new Map(n.map(f=>[this.normalize(f.campaignName),f])),g=new Map;for(let f of i.filter(x=>x.status==="linked"||x.status==="manual_override"))g.set(`${f.sourceCampaignId||this.normalize(f.sourceCampaignName)}::${f.linkType}`,f),g.set(`${this.normalize(f.sourceCampaignName)}::${f.linkType}`,f);let y=new Map;for(let f of t){if(this.isProtected(f,r))continue;let x=f.searchTermType==="asin"?"product_target":"keyword",R=f.campaignId||this.normalize(f.campaignName),T=g.get(`${R}::${x}`)||g.get(`${this.normalize(f.campaignName)}::${x}`),E=T?.destinationCampaignId?u.get(T.destinationCampaignId):T?.destinationCampaignName?p.get(this.normalize(T.destinationCampaignName)):void 0;if(!T||!E)continue;let q=m.find(ee=>ee.toCampaignId===E.campaignId&&(ee.campaignLinkId===`${E.campaignId}::${x}`||ee.campaignLinkId===T.id));if(q&&!q.enabled)continue;let $=q?q.rule:e;if(!this.rowMeetsRule(f,$))continue;let Y=this.resolveDestinationAdGroup(E,f),me=this.normalizeTarget(f.searchTerm);if((E.existingPositiveTargets||[]).some(ee=>this.normalizeTarget(ee)===me))continue;let B=[f.accountId||f.profileId||"",me,E.campaignId||E.campaignName,Y.adGroupId||Y.adGroupName,x==="keyword"?"exact_keyword":"product_target"].join("::"),W=y.get(B);if(W){this.addMetrics(W.metrics,f);let ee=this.buildSourceBreakdown(f,$.addNegativeToSource);
2W.sourceBreakdowns=[...W.sourceBreakdowns||[],ee],W.sourceNegativeEnabled=W.sourceBreakdowns.some(le=>le.sourceNegativeEnabled),W.confidence=this.calculateConfidence(W),W.risk=this.assignRisk(W),W.reason=this.buildReason(W,$);continue}let pe=this.calculateSuggestedBid(f,$.bidStrategy),J={id:`ii-${ht(B)}`,orgId:f.orgId||$.orgId||"",accountId:f.accountId||f.profileId||$.accountId||"",profileId:f.profileId,marketplace:f.marketplace,adProduct:f.adProduct,sourceAdProduct:f.adProduct,destinationAdProduct:E.adProduct||f.adProduct,recommendationType:x==="keyword"?"keyword_exact_create":"product_target_create",searchTerm:f.searchTerm,searchTermType:f.searchTermType,sourceCampaignId:f.campaignId,sourceCampaignName:f.campaignName,sourceAdGroupId:f.adGroupId,sourceAdGroupName:f.adGroupName,sourceTargetText:f.sourceTargetText,sourceTargetType:f.sourceTargetType,sourceMatchType:f.sourceMatchType,destinationCampaignId:E.campaignId,destinationCampaignName:E.campaignName,destinationAdGroupId:Y.adGroupId,destinationAdGroupName:Y.adGroupName,matchingTitle:T.matchingTitle,campaignLinkId:T.id,metrics:{impressions:f.impressions,clicks:f.clicks,spend:f.spend,orders:f.orders,sales:f.sales,ctr:f.ctr,cpc:f.cpc,cvr:f.cvr,acos:f.acos,roas:f.spend>0?f.sales/f.spend:null},bid:pe,rule:{ruleId:$.id,ruleName:$.name,triggeredConditions:this.triggeredConditions(f,$)},sourceNegativeEnabled:$.addNegativeToSource,confidence:0,risk:"medium",status:"pending",reason:"",createdAt:U(),updatedAt:U(),sourceBreakdowns:[this.buildSourceBreakdown(f,$.addNegativeToSource)]};J.confidence=this.calculateConfidence(J),!(J.confidence<50)&&(J.risk=this.assignRisk(J),J.reason=this.buildReason(J,$),y.set(B,J))}return[...y.values()].sort((f,x)=>x.confidence-f.confidence||x.metrics.orders-f.metrics.orders||x.metrics.sales-f.metrics.sales)}calculateSuggestedBid(t,e){return _t(t,e)}calculateConfidence(t){let e=0;return t.metrics.orders>=2&&(e+=45),t.metrics.acos!=null&&t.metrics.acos<=.3&&(e+=10),t.metrics.clicks>=10&&(e+=10),t.metrics.cvr>=.08&&(e+=10),(t.sourceBreakdowns||[]).length>1&&(e+=10),t.destinationCampaignName&&(e+=15),t.campaignLinkId?.includes("manual")&&(e-=5),(t.bid.maxBidApplied||t.bid.fallbackApplied)&&(e-=8),t.metrics.acos!=null&&t.metrics.acos>.75&&(e-=18),Math.max(0,Math.min(100,Math.round(e)))}approveRecommendation(t,e){return this.patch(t,{status:"approved",updatedAt:U()},e)}rejectRecommendation(t,e,i){return this.patch(t,{status:"rejected",rejectionReason:e,updatedAt:U()},i)}protectRecommendation(t,e){return this.patch(t,{status:"protected",updatedAt:U()},e)}toggleSourceNegative(t,e,i){return i.map(n=>n.id===t?P(I({},n),{sourceNegativeEnabled:e,sourceBreakdowns:n.sourceBreakdowns?.map(r=>P(I({},r),{sourceNegativeEnabled:e})),updatedAt:U()}):n)}async exportBulkFile(t){return Promise.resolve()}async createExactKeywordViaApi(){throw new Error("Automatic API writes are disabled. Use bulk export for now.")}async createProductTargetViaApi(){throw new Error("Automatic API writes are disabled. Use bulk export for now.")}async createSourceNegativeExactViaApi(){throw new Error("Automatic API writes are disabled. Use bulk export for now.")}async createSourceNegativeProductViaApi(){throw new Error("Automatic API writes are disabled. Use bulk export for now.")}rowMeetsRule(t,e){if(!e.enabled||t.adProduct==="SD"&&t.searchTermType!=="asin"||!e.includeAdProducts.includes(t.adProduct)||e.excludeAdProducts.includes(t.adProduct)||!t.searchTerm||t.orders<e.minOrders)return!1;let i=this.normalize(t.searchTerm);return!(e.includePhrases.length&&!e.includePhrases.some(n=>i.includes(this.normalize(n)))||e.excludePhrases.some(n=>n&&i.includes(this.normalize(n)))||e.requireAcosMax&&(t.acos==null||t.acos>Number(e.maxAcos))||e.requireClicksMin&&t.clicks<=Number(e.minClicks||0)||e.requireSpendMin&&t.spend<Number(e.minSpend||0)||e.requireCtrMin&&t.ctr<Number(e.minCtr||0)||e.requireCvrMin&&t.cvr<Number(e.minCvr||0)||t.searchTermType==="asin"&&!Tt.test(t.searchTerm))}isProtected(t,e){let i=e.filter(p=>p.enabled),n=this.normalize(t.searchTerm),r=t.searchTerm.toUpperCase(),m=this.normalize(t.campaignName),u=this.normalize(t.adGroupName||"");return i.some(p=>{let g=this.normalize(p.value);return g?p.type==="protected_asin"?r===p.value.toUpperCase():p.type==="protected_campaign"?m.includes(g):p.type==="protected_ad_group"?u.includes(g):n.includes(g):!1})}triggeredConditions(t,e){let i=[`Orders >= ${e.minOrders}`];return e.requireAcosMax&&i.push(`ACoS <= ${Math.round(Number(e.maxAcos||0)*100)}%`),e.requireClicksMin&&i.push(`Clicks > ${e.minClicks}`),e.requireSpendMin&&i.push(`Spend >= ${this.money(e.minSpend||0)}`),e.requireCtrMin&&i.push(`CTR >= ${Math.round(Number(e.minCtr||0)*100)}%`),e.requireCvrMin&&i.push(`CVR >= ${Math.round(Number(e.minCvr||0)*100)}%`),e.includePhrases.length&&i.push(`Contains ${e.includePhrases.join(", ")}`),e.excludePhrases.length&&i.push(`Does not contain ${e.excludePhrases.join(", ")}`),t.adProduct&&i.push(`Ad product ${t.adProduct}`),i}resolveDestinationAdGroup(t,e){let i=t.adGroups||[],n=i.find(m=>this.normalize(m.adGroupName)===this.normalize(e.adGroupName||"")),r=i.find(m=>String(m.state||"").toLowerCase()==="enabled")||i[0];return{adGroupId:n?.adGroupId||r?.adGroupId||"",adGroupName:n?.adGroupName||r?.adGroupName||""}}buildSourceBreakdown(t,e){return{sourceCampaignId:t.campaignId,sourceCampaignName:t.campaignName,sourceAdGroupId:t.adGroupId,sourceAdGroupName:t.adGroupName,adProduct:t.adProduct,sourceAdProduct:t.adProduct,sourceTargetText:t.sourceTargetText,sourceTargetType:t.sourceTargetType,sourceMatchType:t.sourceMatchType,metrics:{impressions:t.impressions,clicks:t.clicks,spend:t.spend,orders:t.orders,sales:t.sales,ctr:t.ctr,cpc:t.cpc,cvr:t.cvr,acos:t.acos,roas:t.spend>0?t.sales/t.spend:null},sourceNegativeEnabled:e}}addMetrics(t,e){t.impressions+=e.impressions,t.clicks+=e.clicks,t.spend+=e.spend,t.orders+=e.orders,t.sales+=e.sales,t.ctr=t.impressions>0?t.clicks/t.impressions:0,t.cpc=t.clicks>0?t.spend/t.clicks:0,t.cvr=t.clicks>0?t.orders/t.clicks:0,t.acos=t.sales>0?t.spend/t.sales:null,t.roas=t.spend>0?t.sales/t.spend:null}buildReason(t,e){let i=t.searchTermType==="asin"?"ASIN":"search term",n=t.searchTermType==="asin"?`added as a product target in ${t.destinationCampaignName}`:`added as an Exact keyword to ${t.destinationCampaignName}`,r=t.sourceNegativeEnabled?t.searchTermType==="asin"?" Source negative product targeting is enabled.":" Source negative exact is enabled.":" Source negative is off for this recommendation.";return`This ${i} generated ${t.metrics.orders} orders in the selected lookback window, meeting ${e.name}. It came from ${t.sourceCampaignName} and will be ${n}. The suggested bid is ${this.money(t.bid.suggestedBid)} based on ${t.bid.formula}.${r}`}assignRisk(t){return!t.destinationCampaignName||t.bid.fallbackApplied?"medium":t.metrics.acos!=null&&t.metrics.acos>.75?"high":t.confidence>=85?"low":"medium"}patch(t,e,i){return i.map(n=>n.id===t?I(I({},n),e):n)}normalize(t){return String(t||"").toLowerCase().trim().replace(/\s+/g," ")}normalizeTarget(t){let e=String(t||"").match(/\bB[0-9A-Z]{9}\b/i)?.[0];return e?e.toUpperCase():this.normalize(t)}roundMoney(t){return Math.round((Number(t)+Number.EPSILON)*100)/100}money(t){return`$${this.roundMoney(Number(t)||0).toFixed(2)}`}static \u0275fac=function(e){return new(e||l)};static \u0275prov=ne({token:l,factory:l.\u0275fac,providedIn:"root"})};var Pt=new Set(["linked","manual_override"]);function vt(l,t){let e=new Map((t||[]).map(n=>
2[String(n.campaignId||"").trim(),n])),i=new Map;for(let n of l||[]){if(!Pt.has(n.status))continue;let r=String(n.destinationCampaignId||"").trim();if(!r)continue;let m=e.get(r);if(m?.state!=="enabled")continue;let u=r,p=n.manualOverride||n.status==="manual_override",g=i.get(u);g?g.entry.confidence=Math.min(g.entry.confidence,xt(n.confidence)):(g={entry:{key:u,campaignId:r,campaignName:m?.campaignName||n.destinationCampaignName||r,status:p?"manual_override":"linked",confidence:xt(n.confidence),state:m.state,adProduct:m.adProduct},linkTypes:new Set,feeders:new Map,hasDetectedLink:!1,hasManualLink:!1},i.set(u,g)),g.linkTypes.add(n.linkType),g.hasManualLink||=p,g.hasDetectedLink||=!p;let y=String(n.sourceCampaignId||"").trim(),f=String(n.sourceCampaignName||y||"Unknown campaign"),x=y||Rt(f),R=e.get(y),T=g.feeders.get(x);if(T){T.roles.add(n.sourceRole),T.linkTypes.add(n.linkType),T.hasManualLink||=p,T.hasDetectedLink||=!p;continue}g.feeders.set(x,{campaignId:y,campaignName:R?.campaignName||f,roles:new Set([n.sourceRole]),linkTypes:new Set([n.linkType]),targetingMix:R?Et(R.targetingMix):"-",hasDetectedLink:!p,hasManualLink:p})}return[...i.values()].map(({entry:n,linkTypes:r,feeders:m,hasDetectedLink:u,hasManualLink:p})=>{let g=Ct(r);return P(I({},n),{linkTypes:g,linkKeys:g.map(y=>`${n.campaignId}::${y}`),status:u?"linked":"manual_override",setupSource:ft(u,p),discoveryFeeders:[...m.values()].map(y=>({campaignId:y.campaignId,campaignName:y.campaignName,roles:[...y.roles].sort(),linkTypes:Ct(y.linkTypes),targetingMix:y.targetingMix,setupSource:ft(y.hasDetectedLink,y.hasManualLink)})).sort((y,f)=>y.campaignName.localeCompare(f.campaignName)||y.campaignId.localeCompare(f.campaignId))})}).sort((n,r)=>n.campaignName.localeCompare(r.campaignName)||n.campaignId.localeCompare(r.campaignId))}function Ct(l){return[...l].sort((t,e)=>{let i=n=>n==="keyword"?0:1;return i(t)-i(e)})}function ft(l,t){return l&&t?"mixed":t?"manual":"detected"}function xt(l){let t=Number(l);return Number.isFinite(t)?Math.max(0,Math.min(100,t)):0}function Rt(l){return String(l||"").toLowerCase().trim().replace(/\s+/g," ")}function Et(l){let t=[];return l.autoTargetCount>0&&t.push(`Auto: ${l.autoTargetCount}`),l.broadKeywordCount>0&&t.push(`Broad: ${l.broadKeywordCount}`),l.phraseKeywordCount>0&&t.push(`Phrase: ${l.phraseKeywordCount}`),l.exactKeywordCount>0&&t.push(`Exact: ${l.exactKeywordCount}`),l.productTargetCount>0&&t.push(`PT: ${l.productTargetCount}`),l.negativeKeywordCount>0&&t.push(`Neg KW: ${l.negativeKeywordCount}`),l.negativeProductTargetCount>0&&t.push(`Neg PT: ${l.negativeProductTargetCount}`),t.length?t.join(" | "):"No targeting data"}var ce=()=>[],At=l=>({rows:l,product:!1}),Ot=l=>({rows:l,product:!0}),ye=(l,t)=>t.key,Nt=(l,t)=>t.campaignId+t.campaignName,Ee=(l,t)=>t.campaignId,ie=(l,t)=>t.id,Oe=(l,t)=>t.label,Lt=(l,t)=>
2t.sourceCampaignName+t.sourceAdGroupName,Dt=(l,t)=>t.recommendationId+t.issue;function Vt(l,t){if(l&1){let e=w();o(0,"div",5)(1,"span"),s(2),a(),o(3,"button",24),C("click",function(){_(e);let n=c();return h(n.message.set(null))}),s(4,"Dismiss"),a()()}if(l&2){let e=c();d(2),b(e.message())}}function Ft(l,t){if(l&1&&(o(0,"div",6),s(1),a()),l&2){let e=c();d(),b(e.error())}}function Gt(l,t){if(l&1&&(o(0,"em"),s(1),a()),l&2){let e=c();d(),Me("",e.monitorAccountMeta().connectionLabel," / ",e.monitorAccountMeta().amazonEmail||"No email on file"," / Profile ",e.monitorAccountMeta().profileId||"-")}}function zt(l,t){if(l&1){let e=w();o(0,"button",25),C("click",function(){_(e);let n=c();return h(n.loadApiCampaignData())}),s(1),a()}if(l&2){let e=c();v("disabled",e.isLoadingApi()||!e.hasMonitorAccount()),d(),F(" ",e.isLoadingApi()?"Refreshing...":"Refresh Links"," ")}}function $t(l,t){l&1&&(o(0,"div",29),Z(1,"span",31),o(2,"strong"),s(3,"Loading campaign links..."),a(),o(4,"span"),s(5,"Checking the latest Monitor campaign snapshot."),a()())}function Bt(l,t){if(l&1&&(o(0,"em",52),s(1),a()),l&2){let e=t.$implicit;d(),b(e==="keyword"?"Keyword":"Product target")}}function Kt(l,t){if(l&1&&(o(0,"div",55)(1,"div",57)(2,"strong"),s(3),a(),o(4,"span"),s(5),a()(),o(6,"div",58),L(7,Bt,2,1,"em",52,Ie),o(9,"em",51),s(10),a()()()),l&2){let e=t.$implicit,i=c(5);d(3),b(e.campaignName),d(2),X("",e.roles.join(" / ")," / ",e.targetingMix),d(2),D(e.linkTypes),d(2),A("ii-badge--manual",e.setupSource==="manual")("ii-badge--mixed",e.setupSource==="mixed"),d(),b(i.setupSourceLabel(e.setupSource))}}function qt(l,t){l&1&&(o(0,"div",56)(1,"span"),s(2,"No discovery campaigns linked."),a()())}function jt(l,t){if(l&1&&(o(0,"div",53)(1,"div",54)(2,"span"),s(3,"Discovery campaigns feeding this isolation campaign"),a()(),L(4,Kt,11,8,"div",55,Nt,!1,qt,3,0,"div",56),a()),l&2){let e=c().$implicit,i=c(3);v("id",i.campaignLinkPanelId(e.key)),H("aria-label","Discovery campaigns feeding "+e.campaignName),d(4),D(e.discoveryFeeders)}}function Wt(l,t){if(l&1){let e=w();o(0,"article",42)(1,"div",43)(2,"input",44),C("change",function(){let n=_(e).$implicit,r=c(3);return h(r.toggleLinkSelection(n.key))}),a(),o(3,"button",45),C("click",function(){let n=_(e).$implicit,r=c(3);return h(r.toggleIsolationExpand(n.key))}),o(4,"span",46),s(5),a(),o(6,"span",47)(7,"strong"),s(8),a(),o(9,"span"),s(10),a(),o(11,"em",48),s(12),a()()(),o(13,"div",49)(14,"em",50),s(15,"Running"),a(),o(16,"em",51),s(17),a(),o(18,"em",52),s(19),a()()(),k(20,jt,7,3,"div",53),a()}if(l&2){let e=t.$implicit,i=c(3);A("ii-iso-row--expanded",i.expandedIsolationKey()===e.key)("ii-iso-row--selected",i.isLinkSelected(e.key)),d(2),v("checked",i.isLinkSelected(e.key)),H("aria-label","Select "+e.campaignName),d(),H("aria-expanded",i.expandedIsolationKey()===e.key)("aria-controls",i.campaignLinkPanelId(e.key)),d(2),b(i.expandedIsolationKey()===e.key?"\u2212":"+"),d(3),b(e.campaignName),d(2),X("",i.campaignLinkTypeLabel(e.linkTypes)," / ",e.adProduct),d(),A("ii-rule-status--default",i.campaignLinkUsesOnlyDefaultRule(e.linkKeys)),d(),b(i.campaignLinkRuleLabel(e.linkKeys)),d(4),A("ii-badge--manual",e.setupSource==="manual")("ii-badge--mixed",e.setupSource==="mixed"),d(),b(i.setupSourceLabel(e.setupSource)),d(2),X("",e.discoveryFeeders.length," source",e.discoveryFeeders.length===1?"":"s"),d(),M(i.expandedIsolationKey()===e.key?20:-1)}}function Ut(l,t){if(l&1){let e=w();o(0,"div",32)(1,"p",33),s(2,"Select isolation campaigns to assign a rule. Expand a campaign to review its discovery sources."),a(),o(3,"div",34)(4,"button",35),C("click",function(){_(e);let n=c(2);return h(n.selectAllLinks())}),s(5,"Select All"),a(),o(6,"button",36),C("click",function(){_(e);let n=c(2);return h(n.deselectAllLinks())}),s(7,"Deselect All"),a(),o(8,"button",12),C("click",function(){_(e);let n=c(2);return h(n.openRuleModal())}),s(9),a()()(),o(10,"div",37)(11,"div",38)(12,"label",39)(13,"input",40),C("change",function(n){_(e);let r=c(2);return h(r.toggleSelectAllCampaignLinks(n))}),a(),o(14,"span"),s(15),a()(),o(16,"small"),s(17,"Detected and manually configured campaign links"),a()(),L(18,Wt,21,23,"article",41,ye),a()}if(l&2){let e=c(2);d(6),v("disabled",!e.selectedLinkKeys().size),d(2),v("disabled",!e.selectedLinkKeys().size),d(),F("Create or Select Rule (",e.
2selectedLinkKeys().size,")"),d(4),v("checked",e.isAllCampaignLinksSelected()),d(2),F("Running isolation campaigns (",e.campaignLinkEntries().length,")"),d(3),D(e.campaignLinkEntries())}}function Ht(l,t){if(l&1){let e=w();o(0,"div",30)(1,"span",59),s(2,"\u2197"),a(),o(3,"strong"),s(4,"Set up your campaign links"),a(),o(5,"span"),s(6,"No running isolation campaigns are linked yet. Detect links from the latest Monitor snapshot or create them manually."),a(),o(7,"button",60),C("click",function(){_(e);let n=c(2);return h(n.activeTab.set("setup"))}),s(8,"Setup Campaign Links"),a()()}}function Xt(l,t){if(l&1){let e=w();o(0,"section",20)(1,"div",26)(2,"div")(3,"span",27),s(4,"Isolation setup"),a(),o(5,"h2"),s(6,"Campaign Links"),a(),o(7,"p"),s(8,"Running isolation campaigns and the discovery campaigns feeding them."),a()(),o(9,"button",28),C("click",function(){_(e);let n=c();return h(n.activeTab.set("setup"))}),s(10,"Setup Campaign Links"),a()(),k(11,$t,6,0,"div",29)(12,Ut,20,5)(13,Ht,9,0,"div",30),a()}if(l&2){let e=c();d(11),M(e.isLoadingCampaignLinks()&&!e.campaignLinkEntries().length?11:e.campaignLinkEntries().length?12:13)}}function Qt(l,t){if(l&1){let e=w();o(0,"em",51),s(1,"Removed"),a(),o(2,"button",35),C("click",function(){_(e);let n=c().$implicit,r=c(3);return h(r.restoreAutoLink(n.sourceCampaignId||"",n.linkType))}),s(3,"Restore"),a()}}function Jt(l,t){if(l&1){let e=w();o(0,"em",50),s(1,"Linked"),a(),o(2,"button",87),C("click",function(){_(e);let n=c().$implicit,r=c(3);return h(r.removeAutoLink(n.sourceCampaignId||"",n.linkType))}),s(3,"Remove"),a()}}function Zt(l,t){if(l&1&&(o(0,"div",84)(1,"div",85)(2,"span"),s(3,"FROM"),a(),o(4,"strong"),s(5),a()(),o(6,"div",86),s(7,"\u2192"),a(),o(8,"div",85)(9,"span"),s(10,"TO"),a(),o(11,"strong"),s(12),a()(),o(13,"em",52),s(14),a(),k(15,Qt,4,0)(16,Jt,4,0),a()),l&2){let e=t.$implicit;A("ii-detected-link-row--removed",e.status==="ignored"),d(5),b(e.sourceCampaignName),d(7),b(e.destinationCampaignName),d(2),b(e.linkType==="keyword"?"Keyword":"Product target"),d(),M(e.status==="ignored"?15:16)}}function Yt(l,t){if(l&1&&(o(0,"section",65)(1,"div",62)(2,"div")(3,"span",27),s(4,"Detected setup"),a(),o(5,"h2"),s(6,"Detected campaign links"),a(),o(7,"p"),s(8,"Review detected discovery-to-isolation paths. Removed links stay out of Campaign Links until detection runs again or you restore them."),a()(),o(9,"span",68),s(10),a()(),o(11,"div",82),L(12,Zt,17,6,"div",83,ie),a()()),l&2){let e=c(2);d(10),b(e.detectedCampaignLinksForSetup().length),d(2),D(e.detectedCampaignLinksForSetup())}}function ei(l,t){if(l&1){let e=w();o(0,"div",89)(1,"div")(2,"strong"),s(3),a(),o(4,"span"),s(5),a()(),o(6,"button",35),C("click",function(){let n=_(e).$implicit,r=c(3);return h(r.linkMissingAsFrom(n.sourceCampaignId||""))}),s(7,"Link Manually"),a()()}if(l&2){let e=t.$implicit,i=c(3);d(3),b(e.sourceCampaignName),d(2),Me("",e.sourceRole," / ",e.linkType==="keyword"?"Keyword":"Product target"," / Key: ",i.matchingTitleLabel(e.matchingTitle))}}function ti(l,t){if(l&1&&(o(0,"section",66)(1,"div",88)(2,"div")(3,"span",27),s(4,"Needs attention"),a(),o(5,"strong"),s(6,"Missing destinations"),a()(),o(7,"span"),s(8,"These discovery campaigns have no matching isolation campaign."),a()(),L(9,ei,8,4,"div",89,ie),a()),l&2){let e=c(2);d(9),D(e.missingDestinationLinks())}}function ii(l,t){if(l&1&&(o(0,"span",68),s(1),a()),l&2){let e=c(2);d(),F("",e.manualLinks().length," saved")}}function ni(l,t){if(l&1){let e=w();o(0,"div",91)(1,"div",92)(2,"span"),s(3,"FROM"),a(),o(4,"strong"),s(5),a()(),o(6,"div",93),s(7,"\u2192"),a(),o(8,"div",94)(9,"span"),s(10,"TO"),a(),o(11,"strong"),s(12),a()(),o(13,"em",95),s(14),a(),o(15,"button",87),C("click",function(){let n=_(e).$implicit,r=c(3);return h(r.deleteManualLink(n.id))}),s(16,"Delete"),a()()}if(l&2){let e=t.$implicit;d(5),b(e.fromCampaignName),d(7),b(e.toCampaignName),d(2),b(e.linkType)}}function ai(l,t){if(l&1&&(o(0,"div",69)(1,"div",90)(2,"strong"),s(3,"Existing manual links"),a()(),L(4,ni,17,3,"div",91,ie),a()),l&2){let e=c(2);d(4),D(e.manualLinks())}}function oi(l,t){if(l&1){let e=w();o(0,"tr")(1,"td")(2,"input",40),C("change",function(){let n=_(e).$implicit,r=c(2);return h(r.toggleFromCampaign(n.campaignId))}),a()(),o(3,"td")(4,"strong"),s(5),a()(),o(6,"td"),s(7),a(),o(8,"td"),s(9),a(),o(10,"td"),s(11),a()()}if(l&2){let e=t.$implicit,i=c(2);A("selected",i.isFromSelected(e.campaignId)),d(2),v("checked",i.isFromSelected(e.campaignId)),H("aria-label","Select "+e.campaignName+" as a discovery campaign"),d(3),b(e.campaignName),d(2),b(i.formatMix(e)),d(2),b(e.state),d(2),b(e.linkedStatus)}}function ri(l,t){l&1&&(o(0,"tr")(1,"td",96),s(2,"No matching discovery campaigns."),a()())}function si(l,t){if(l&1){let e=w();o(0,"tr")(1,"td")(2,"input",97),C("change",function(){let n=_(e).$implicit,r=c(2);return h(r.toggleToCampaign(n.campaignId))}),a()(),o(3,"td")(4,"strong"),s(5),a()(),o(6,"td"),s(7),a(),o(8,"td"),s(9),a(),o(10,"td"),s(11),a()()}if(l&2){let e=t.$implicit,i=c(2);A("selected",i.isToSelected(e.campaignId)),d(2),v("checked",i.isToSelected(e.campaignId)),H("aria-label","Select "+e.campaignName+" as the isolation campaign"),d(3),b(e.campaignName),d(2),b(i.formatMix(e)),d(2),b(e.state),d(2),b(i.linkedFromCount(e.campaignId))}}function li(l,t){l&1&&(o(0,"tr")(1,"td",96),s(2,"No matching isolation campaigns."),a()())}function di(l,t){if(l&1){let e=w();o(0,"div",79)(1,"span"),s(2,"From: "),o(3,"strong"),s(4),a()(),o(5,"span"),s(6,"To: "),o(7,"strong"),s(8),a()(),o(9,"label")(10,"span"),s(11,"Link type"),a(),o(12,"select",98),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.manualLinkType.set(n))}),o(13,"option",99),s(14,"Keyword isolation"),a(),o(15,"option",100),s(16,"Product target isolation"),a(),o(17,"option",101),s(18,"Both"),a(),o(19,"o
2ption",102),s(20,"Custom"),a()()(),o(21,"button",60),C("click",function(){_(e);let n=c(2);return h(n.createManualLink())}),s(22,"Create Campaign Link"),a()()}if(l&2){let e=c(2);d(4),b(e.selectedFromCampaignName()),d(4),b(e.selectedToCampaignName()),d(4),v("ngModel",e.manualLinkType())}}function ci(l,t){if(l&1){let e=w();o(0,"tr")(1,"td")(2,"strong"),s(3),a()(),o(4,"td"),s(5),a(),o(6,"td"),s(7),a(),o(8,"td"),s(9),a(),o(10,"td"),s(11),a(),o(12,"td"),s(13),a(),o(14,"td")(15,"div",103)(16,"button",87),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.selectAsFrom(n))}),s(17,"Link as FROM"),a(),o(18,"button",87),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.selectAsTo(n))}),s(19,"Link as TO"),a(),o(20,"button",87),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.ignoreCampaign(n.campaignId))}),s(21,"Ignore"),a()()()()}if(l&2){let e=t.$implicit,i=c(2);d(3),b(e.campaignName),d(2),b(e.adProduct),d(2),b(e.state),d(2),b(i.formatMix(e)),d(2),b(e.nameDetectedRole),d(2),b(e.adProduct==="SD"?"Sponsored Display excluded":"No match found")}}function mi(l,t){l&1&&(o(0,"tr")(1,"td",104),s(2,"All eligible campaigns are linked or ignored."),a()())}function pi(l,t){if(l&1){let e=w();o(0,"section",61)(1,"div",62)(2,"div")(3,"button",63),C("click",function(){_(e);let n=c();return h(n.setTab("links"))}),s(4,"\u2190 Back to Campaign Links"),a(),o(5,"span",27),s(6,"Campaign link setup"),a(),o(7,"h2"),s(8,"Connect discovery to isolation"),a(),o(9,"p"),s(10,"Detect campaign links from your latest Monitor snapshot, then fill any gaps manually."),a()(),o(11,"button",12),C("click",function(){_(e);let n=c();return h(n.loadApiCampaignData())}),s(12),a()(),o(13,"div",64)(14,"div")(15,"span"),s(16,"Running links"),a(),o(17,"strong"),s(18),a()(),o(19,"div")(20,"span"),s(21,"Missing destinations"),a(),o(22,"strong"),s(23),a()(),o(24,"div")(25,"span"),s(26,"Unlinked campaigns"),a(),o(27,"strong"),s(28),a()()()(),k(29,Yt,14,1,"section",65),k(30,ti,11,0,"section",66),o(31,"section",67)(32,"div",62)(33,"div")(34,"span",27),s(35,"Manual setup"),a(),o(36,"h2"),s(37,"Link campaigns manually"),a(),o(38,"p"),s(39,"Select one or more discovery campaigns (FROM) and one isolation campaign (TO)."),a()(),k(40,ii,2,1,"span",68),a(),k(41,ai,6,0,"div",69),o(42,"div",70)(43,"div")(44,"h3"),s(45,"FROM campaigns (Discovery)"),a(),o(46,"label",71)(47,"span"),s(48,"Filter"),a(),o(49,"input",72),C("ngModelChange",function(n){_(e);let r=c();return h(r.manualFromFilter.set(n))}),a()(),o(50,"div",73)(51,"table",74)(52,"thead")(53,"tr")(54,"th",75)(55,"span",76),s(56,"Select"),a()(),o(57,"th",75),s(58,"Campaign name"),a(),o(59,"th",75),s(60,"Targeting mix"),a(),o(61,"th",75),s(62,"State"),a(),o(63,"th",75),s(64,"Status"),a()()(),o(65,"tbody"),L(66,oi,12,8,"tr",77,Ee,!1,ri,3,0,"tr"),a()()()(),o(69,"div")(70,"h3"),s(71,"TO campaign (Isolation)"),a(),o(72,"label",71)(73,"span"),s(74,"Filter"),a(),o(75,"input",78),C("ngModelChange",function(n){_(e);let r=c();return h(r.manualToFilter.set(n))}),a()(),o(76,"div",73)(77,"table",74)(78,"thead")(79,"tr")(80,"th",75)(81,"span",76),s(82,"Select"),a()(),o(83,"th",75),s(84,"Campaign name"),a(),o(85,"th",75),s(86,"Targeting mix"),a(),o(87,"th",75),s(88,"State"),a(),o(89,"th",75),s(90,"Linked from"),a()()(),o(91,"tbody"),L(92,si,12,8,"tr",77,Ee,!1,li,3,0,"tr"),a()()()()(),k(95,di,23,3,"div",79),a(),o(96,"section",80)(97,"div",62)(98,"div")(99,"span",27),s(100,"Review"),a(),o(101,"h2"),s(102,"Unlinked campaigns"),a(),o(103,"p"),s(104,"Link eligible campaigns manually or ignore campaigns that do not belong in isolation."),a()(),o(105,"span",68),s(106),a()(),o(107,"div",81)(108,"table",74)(109,"thead")(110,"tr")(111,"th",75),s(112,"Campaign name"),a(),o(113,"th",75),s(114,"Ad product"),a(),o(115,"th",75),s(116,"State"),a(),o(117,"th",75),s(118,"Targeting mix"),a(),o(119,"th",75),s(120,"Suggested role"),a(),o(121,"th",75),s(122,"Why unlinked"),a(),o(123,"th",75),s(124,"Actions"),a()()(),o(125,"tbody"),L(126,ci,22,6,"tr",null,Ee,!1,mi,3,0,"tr"),a()()()()}if(l&2){let e=c();d(11),v("disabled",e.isLoadingCampaignLinks()||e.isLoadingApi()||!e.hasMonitorAccount()),d(),b(e.isLoadingCampaignLinks()?"Detecting...":"Auto-Detect Campaign Links"),d(6),b(e.campaignLinkEntries().length),d(5),b(e.missingDestinationLinks().length),d(5),b(e.unlinkedCampaigns().length),d(),M(e.detectedCampaignLinksForSetup().length?29:-1),d(),M(e.missingDestinationLinks().length?30:-1),d(10),M(e.manualLinks().length?40:-1),d(),M(e.manualLinks().length?41:-1),d(8),v("ngModel",e.manualFromFilter()),d(17),D(e.fromCampaigns()),d(9),v("ngModel",e.manualToFilter()),d(17),D(e.toCampaigns()),d(3),M(e.selectedFromCampaignIds().size&&e.selectedToCampaignId()?95:-1),d(11),b(e.unlinkedCampaigns().length),d(20),D(e.unlinkedCampaigns())}}function ui(l,t){if(l&1){let e=w();o(0,"article",133)(1,"button",134),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.editSavedRule(n))}),o(2,"strong"),s(3),a(),o(4,"span"),s(5),a(),o(6,"em"),s(7),a()(),o(8,"div",135)(9,"button",87),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.duplicateSavedRule(n))}),s(10,"Duplicate"),a(),o(11,"button",87),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.deleteSavedRule(n.id))}),s(12,"Delete"),a()()()}if(l&2){let e=t.$implicit,i=c(2);A("active",i.rulesTabEditingId()===e.id),d(3),b(e.name),d(2),b(i.getRuleSummary(e)),d(2),X("",i.savedRuleUsageCount(e.id)," active assignment",i.savedRuleUsageCount(e.id)===1?"":"s")}}function gi(l,t){l&1&&(o(0,"div",110),s(1,"No saved rules yet. Create one on the right."),a())}function _i(l,t){if(l&1){let e=w();o(0,"label",118)(1,"span"),s(2,"Lookback Days"),a(),o(3,"input",121),
2C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRulesTabDraft({lookbackDays:+n||30}))}),a()()}if(l&2){let e=c(2);d(3),v("ngModel",e.rulesTabDraft().lookbackDays)}}function hi(l,t){if(l&1){let e=w();o(0,"label",118)(1,"span"),s(2,"Start Date"),a(),o(3,"input",136),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRulesTabDraft({startDate:n}))}),a()(),o(4,"label",118)(5,"span"),s(6,"End Date"),a(),o(7,"input",136),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRulesTabDraft({endDate:n}))}),a()()}if(l&2){let e=c(2);d(3),v("ngModel",e.rulesTabDraft().startDate),d(4),v("ngModel",e.rulesTabDraft().endDate)}}function Ci(l,t){if(l&1){let e=w();o(0,"label",125)(1,"span"),s(2,"Max ACoS %"),a(),o(3,"input",137),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRulesTabDraft({maxAcos:(+n||0)/100}))}),a()()}if(l&2){let e=c(2);d(3),v("ngModel",(e.rulesTabDraft().maxAcos||0)*100)}}function fi(l,t){if(l&1){let e=w();o(0,"label",125)(1,"span"),s(2,"Min Clicks"),a(),o(3,"input",138),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRulesTabDraft({minClicks:+n||0}))}),a()()}if(l&2){let e=c(2);d(3),v("ngModel",e.rulesTabDraft().minClicks)}}function xi(l,t){if(l&1){let e=w();o(0,"label",125)(1,"span"),s(2,"Min Spend"),a(),o(3,"input",137),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRulesTabDraft({minSpend:+n||0}))}),a()()}if(l&2){let e=c(2);d(3),v("ngModel",e.rulesTabDraft().minSpend)}}function vi(l,t){if(l&1){let e=w();o(0,"label",125)(1,"span"),s(2,"Min CTR %"),a(),o(3,"input",139),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRulesTabDraft({minCtr:(+n||0)/100}))}),a()()}if(l&2){let e=c(2);d(3),v("ngModel",(e.rulesTabDraft().minCtr||0)*100)}}function bi(l,t){if(l&1){let e=w();o(0,"label",125)(1,"span"),s(2,"Min CVR %"),a(),o(3,"input",139),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRulesTabDraft({minCvr:(+n||0)/100}))}),a()()}if(l&2){let e=c(2);d(3),v("ngModel",(e.rulesTabDraft().minCvr||0)*100)}}function yi(l,t){if(l&1){let e=w();o(0,"label",118)(1,"span"),s(2,"Multiplier"),a(),o(3,"input",140),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRulesTabBidStrategy({multiplier:+n||1}))}),a()()}if(l&2){let e=c(2);d(3),v("ngModel",e.rulesTabDraft().bidStrategy.multiplier||1.1)}}function Ii(l,t){if(l&1){let e=w();o(0,"label",118)(1,"span"),s(2,"Fixed Bid"),a(),o(3,"input",130),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRulesTabBidStrategy({fixedBid:+n||.75}))}),a()()}if(l&2){let e=c(2);d(3),v("ngModel",e.rulesTabDraft().bidStrategy.fixedBid||.75)}}function Si(l,t){if(l&1){let e=w();o(0,"section",21)(1,"div",62)(2,"div")(3,"h2"),s(4,"Reusable Rules"),a(),o(5,"p"),s(6,"Create and save isolation rules for later use. Saved rules can be applied to campaign links from the Campaign Links tab."),a()(),o(7,"div",105)(8,"button",28),C("click",function(){_(e);let n=c();return h(n.loadDefaultRuleIntoDraft())}),s(9,"Copy Profile Default"),a(),o(10,"button",60),C("click",function(){_(e);let n=c();return h(n.startCreateRule())}),s(11,"New Rule"),a()()(),o(12,"div",106)(13,"aside",107)(14,"div",108)(15,"strong"),s(16,"Saved Rules"),a(),o(17,"span"),s(18),a()(),L(19,ui,13,6,"article",109,ie,!1,gi,2,0,"div",110),a(),o(22,"div",111)(23,"div",112)(24,"div")(25,"span"),s(26),a(),o(27,"strong"),s(28),a()(),o(29,"div",105)(30,"button",28),C("click",function(){_(e);let n=c();return h(n.useDraftAsDefaultRule())}),s(31,"Use as Profile Default"),a(),o(32,"button",60),C("click",function(){_(e);let n=c();return h(n.saveRulesTabDraft())}),s(33,"Save Rule"),a()()(),o(34,"div",113)(35,"div",114),s(36,"Rule Identity"),a(),o(37,"div",115)(38,"label",116)(39,"span"),s(40,"Rule Name"),a(),o(41,"input",117),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabDraft({name:n}))}),a()(),o(42,"label",118)(43,"span"),s(44,"Lookback Type"),a(),o(45,"select",98),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabDraft({lookbackType:n}))}),o(46,"option",119),s(47,"Last X days"),a(),o(48,"option",120),s(49,"Custom date range"),a()()(),k(50,_i,4,1,"label",118)(51,hi,8,2),o(52,"label",118)(53,"span"),s(54,"Minimum Orders"),a(),o(55,"input",121),
2C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabDraft({minOrders:+n||2}))}),a()()()(),o(56,"div",113)(57,"div",114),s(58,"Qualification Filters"),a(),o(59,"div",115)(60,"label",122)(61,"input",123),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabDraft({requireAcosMax:n}))}),a(),o(62,"div",124)(63,"strong"),s(64,"Require Max ACoS"),a(),o(65,"span"),s(66,"Only isolate search terms below this ACoS threshold."),a()(),k(67,Ci,4,1,"label",125),a(),o(68,"label",122)(69,"input",123),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabDraft({requireClicksMin:n}))}),a(),o(70,"div",124)(71,"strong"),s(72,"Require Min Clicks"),a(),o(73,"span"),s(74,"Only isolate terms with enough click data."),a()(),k(75,fi,4,1,"label",125),a(),o(76,"label",122)(77,"input",123),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabDraft({requireSpendMin:n}))}),a(),o(78,"div",124)(79,"strong"),s(80,"Require Min Spend"),a(),o(81,"span"),s(82,"Only isolate terms with meaningful spend."),a()(),k(83,xi,4,1,"label",125),a(),o(84,"label",122)(85,"input",123),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabDraft({requireCtrMin:n}))}),a(),o(86,"div",124)(87,"strong"),s(88,"Require Min CTR"),a(),o(89,"span"),s(90,"Only isolate terms above this click-through rate."),a()(),k(91,vi,4,1,"label",125),a(),o(92,"label",122)(93,"input",123),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabDraft({requireCvrMin:n}))}),a(),o(94,"div",124)(95,"strong"),s(96,"Require Min CVR"),a(),o(97,"span"),s(98,"Only isolate terms above this conversion rate."),a()(),k(99,bi,4,1,"label",125),a()()(),o(100,"div",113)(101,"div",114),s(102,"Phrase Filters"),a(),o(103,"div",115)(104,"label",116)(105,"span"),s(106,"Must Contain"),a(),o(107,"textarea",126),C("ngModelChange",function(n){_(e);let r=c();return h(r.updateRulesTabIncludePhrases(n))}),a()(),o(108,"label",116)(109,"span"),s(110,"Must Not Contain"),a(),o(111,"textarea",126),C("ngModelChange",function(n){_(e);let r=c();return h(r.updateRulesTabExcludePhrases(n))}),a()()()(),o(112,"div",113)(113,"div",114),s(114,"Bid And Source Negative"),a(),o(115,"div",115)(116,"label",118)(117,"span"),s(118,"Bid Strategy"),a(),o(119,"select",98),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabBidStrategy({type:n}))}),o(120,"option",127),s(121,"Avg CPC"),a(),o(122,"option",128),s(123,"Avg CPC Multiplier"),a(),o(124,"option",129),s(125,"Fixed Bid"),a()()(),k(126,yi,4,1,"label",118),k(127,Ii,4,1,"label",118),o(128,"label",118)(129,"span"),s(130,"Fallback Bid"),a(),o(131,"input",130),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabBidStrategy({fallbackBid:+n||.75}))}),a()(),o(132,"label",118)(133,"span"),s(134,"Min Bid"),a(),o(135,"input",131),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabBidStrategy({minBid:+n||void 0}))}),a()(),o(136,"label",118)(137,"span"),s(138,"Max Bid"),a(),o(139,"input",131),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabBidStrategy({maxBid:+n||void 0}))}),a()(),o(140,"label",132)(141,"input",123),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRulesTabDraft({addNegativeToSource:n}))}),a(),o(142,"span"),s(143,"Add negative back to source discovery campaign"),a()()()()()()()}if(l&2){let e=c();d(18),F("",e.savedRules().length," total"),d(),D(e.savedRulesSorted()),d(7),b(e.rulesTabEditingId()?"Editing saved rule":"New reusable rule"),d(2),b(e.rulesTabDraft().name||"Untitled Rule"),d(13),v("ngModel",e.rulesTabDraft().name),d(4),v("ngModel",e.rulesTabDraft().lookbackType),d(5),M(e.rulesTabDraft().lookbackType==="last_x_days"?50:51),d(5),v("ngModel",e.rulesTabDraft().minOrders),d(5),A("ii-rule-toggle--on",e.rulesTabDraft().requireAcosMax),d(),v("ngModel",e.rulesTabDraft().requireAcosMax),d(6),M(e.rulesTabDraft().requireAcosMax?67:-1),d(),A("ii-rule-toggle--on",e.rulesTabDraft().requireClicksMin),d(),v("ngModel",e.rulesTabDraft().requireClicksMin),d(6),M(e.rulesTabDraft().requireClicksMin?75:-1),d(),A("ii-rule-toggle--on",e.rulesTabDraft().requireSpendMin),d(),v("ngModel",e.rulesTabDraft().requireSpendMin),d(6),M(e.rulesTabDraft().requireSpendMin?83:-1),d(),A("ii-rule-toggle--on",e.rulesTabDraft().requireCtrMin),d(),v("ngModel",e.rulesTabDraft().requireCtrMin),d(6),M(e.rulesTabDraft().requireCtrMin?91:-1),d(),A("ii-rule-toggle--on",e.rulesTabDraft().requireCvrMin),d(),v("ngModel",e.rulesTabDraft().requireCvrMin),d(6),M(e.rulesTabDraft().requireCvrMin?99:-1),d(8),v("ngModel",(e.rulesTabDraft().includePhrases||se(37,ce)).join(`
3`)),d(4),v("ngModel",(e.rulesTabDraft().excludePhrases||se(38,ce)).join(`
4`)),d(8),v("ngModel",e.rulesTabDraft().bidStrategy.type),d(7),M(e.rulesTabDraft().bidStrategy.type==="avg_cpc_multiplier"?126:-1),d(),M(e.rulesTabDraft().bidStrategy.type==="fixed"?127:-1),d(4),v("ngModel",e.rulesTabDraft().bidStrategy.fallbackBid),d(4),v("ngModel",e.rulesTabDraft().bidStrategy.minBid),d(4),v("ngModel",e.rulesTabDraft().bidStrategy.maxBid),d(2),v("ngModel",e.rulesTabDraft().addNegativeToSource)}}function ki(l,t){if(l&1&&s(0),l&2){let e=c(3);X(" for ",e.handoffStartDate()," to ",e.handoffEndDate()," ")}}function Mi(l,t){if(l&1){let e=w();o(0,"div",141)(1,"span"),s(2," Search Intelligence handoff: showing recommendations matching "),o(3,"strong"),s(4),a(),k(5,ki,1,2),a(),o(6,"button",24),C("click",function(){_(e);let n=c(2);return h(n.clearSearchIntelligenceHandoff())}),s(7,"Clear filter"),a()()}if(l&2){let e=c(2);d(4),b(e.handoffFocus()),d(),M(e.handoffStartDate()&&e.handoffEndDate()?5:-1)}}function wi(l,t){if(l&1&&(o(0,"div")(1,"span"),s(2),a(),o(3,"strong"),s(4),a()()),l&2){let e=t.$implicit;d(2),b(e.label),d(2),b(e.display)}}function Ti(l,t){l&1&&(o(0,"div",143)(1,"span"),s(2,"Recommendations"),a(),o(3,"strong"),s(4,"No Opportunities"),a()())}function Pi(l,t){if(l&1&&s(0),l&2){let e=c(3);F(" / ",e.rawUploadName()," ")}}function Ri(l,t){if(l&1&&(s(0),k(1,Pi,1,1)),l&2){let e=c(2);
4F(" Last scan: ",e.lastScanDate()," "),d(),M(e.rawUploadName()?1:-1)}}function Ei(l,t){l&1&&s(0," Opening this screen loads saved search terms and scans automatically when data is available. ")}function Ai(l,t){if(l&1){let e=w();o(0,"button",163),C("click",function(){_(e);let n=c(2);return h(n.clearSearchIntelligenceHandoff())}),s(1,"Clear"),a()}}function Oi(l,t){if(l&1){let e=w();o(0,"section",21)(1,"div",164)(2,"span"),s(3),V(4,"number"),V(5,"number"),a(),o(6,"app-ads-manager-grid-filter-chips",165),C("removeFilter",function(n){_(e);let r=c(2);return h(r.recommendationGrid.setFilter(n,null))}),a(),o(7,"button",163),C("click",function(){_(e);let n=c(2);return h(n.recommendationGrid.clearFilters())}),s(8,"Clear all"),a()()()}if(l&2){let e=c(2);d(3),X("Showing ",j(4,3,e.filteredActiveRecommendations().length)," of ",j(5,5,e.activeRecommendations().length)," recommendations"),d(3),v("chips",e.recommendationGrid.activeFilterChips())}}function Ni(l,t){if(l&1&&(o(0,"span",158)(1,"i",166),s(2,"\u{1F552}"),a(),s(3," Last downloaded: "),o(4,"strong"),s(5),a()()),l&2){let e=c(2);d(5),b(e.lastDownloadedDate())}}function Li(l,t){if(l&1&&(o(0,"div",160)(1,"div")(2,"strong"),s(3),a(),o(4,"span"),s(5),a()(),o(6,"div",167),Z(7,"span"),a()()),l&2){let e=c(2);d(3),b(e.exportProgressLabel()||"Exporting"),d(2),F("",e.exportProgress(),"%"),d(2),ke("width",e.exportProgress(),"%")}}function Di(l,t){if(l&1){let e=w();o(0,"div",161)(1,"strong"),s(2),a(),o(3,"button",168),C("click",function(){_(e);let n=c(2);return h(n.approveSelected())}),s(4,"Approve selected"),a(),o(5,"button",169),C("click",function(){_(e);let n=c(2);return h(n.rejectSelected())}),s(6,"Reject selected"),a(),o(7,"button",169),C("click",function(){_(e);let n=c(2);return h(n.protectSelected())}),s(8,"Protect selected"),a(),o(9,"button",169),C("click",function(){_(e);let n=c(2);return h(n.toggleNegativeSelected())}),s(10,"Toggle source negative"),a(),o(11,"button",170),C("click",function(){_(e);let n=c(2);return h(n.stageSelectedIsolationRecommendationsToApiQueue())}),s(12),a(),o(13,"span",171),s(14,"Preview-only; Amazon send disabled."),a()()}if(l&2){let e=c(2);d(2),F("",e.selectedCount()," selected"),d(9),v("disabled",e.apiQueueStageLoading()||e.selectedIsolationQueueStageCount()===0),d(),F(" ",e.apiQueueStageLoading()?"Staging...":"Add Selected to API Queue"," ")}}function Vi(l,t){l&1&&Se(0)}function Fi(l,t){l&1&&Se(0)}function Gi(l,t){if(l&1){let e=w();k(0,Mi,8,2,"div",141),o(1,"section",142),L(2,wi,5,2,"div",null,Oe,!1,Ti,5,0,"div",143),a(),o(5,"section",144)(6,"div",145)(7,"div")(8,"strong"),s(9),a(),o(10,"span"),k(11,Ri,2,2)(12,Ei,1,0),a()(),o(13,"button",146),C("click",function(){_(e);let n=c();return h(n.refreshRecommendations())}),s(14),a()()(),o(15,"section",21)(16,"div",147)(17,"label",118)(18,"span"),s(19,"Filter recommendations"),a(),o(20,"input",148),C("ngModelChange",function(n){_(e);let r=c();return h(r.recommendationSearch.set(n))}),a()(),k(21,Ai,2,0,"button",149),a()(),k(22,Oi,9,7,"section",21),o(23,"section",21)(24,"div",150)(25,"div",105)(26,"select",98),C("ngModelChange",function(n){_(e);let r=c();return h(r.exportMode.set(n))}),o(27,"option",151),s(28,"Export all approved"),a(),o(29,"option",152),s(30,"Export selected"),a(),o(31,"option",153),s(32,"Export keyword targets only"),a(),o(33,"option",154),s(34,"Export product targets only"),a(),o(35,"option",155),s(36,"Export source negatives only"),a(),o(37,"option",156),s(38,"Export full audit CSV"),a()(),o(39,"div",157)(40,"button",12),C("click",function(){_(e);let n=c();return h(n.exportFromButton())}),s(41),a(),k(42,Ni,6,1,"span",158),a(),o(43,"button",159),s(44,"Automatic"),a()(),o(45,"span"),s(46,"Automatic API writes are disabled. Bulk export is the implementation path."),a()(),k(47,Li,8,4,"div",160),k(48,Di,15,3,"div",161),a(),o(49,"section",21)(50,"div",62)(51,"div")(52,"h2"),s(53,"Keyword Target Isolation"),a(),o(54,"p"),s(55,"Customer search terms that should become Exact keywords in linked campaigns."),a()()(),ue(56,Vi,1,0,"ng-container",162),a(),o(57,"section",21)(58,"div",62)(59,"div")(60,"h2"),s(61,"Product Target Isolation"),a(),o(62,"p"),s(63,"ASIN search terms that should become product targets in linked PT campaigns."),a()()(),ue(64,Fi,1,0,"ng-container",162),a()}if(l&2){let e=c(),i=De(64);M(e.handoffFocus()?0:-1),d(2),D(e.visibleRecommendationSummaryCards()),d(7),b(e.isLoadingApi()||e.isScanning()?"Preparing recommendations":e.lastScanDate(
4)?"Recommendations ready":"No scan available yet"),d(2),M(e.lastScanDate()?11:12),d(2),v("disabled",e.isLoadingApi()||e.isScanning()),d(),F(" ",e.isLoadingApi()||e.isScanning()?"Refreshing...":"Refresh Recommendations"," "),d(6),v("ngModel",e.recommendationSearch()),d(),M(e.recommendationSearch()?21:-1),d(),M(e.recommendationGrid.activeFilterCount()?22:-1),d(4),v("ngModel",e.exportMode()),d(14),v("disabled",e.exportInProgress()),d(),F(" ",e.exportInProgress()?"Exporting...":"Export Bulk File"," "),d(),M(e.lastDownloadedDate()?42:-1),d(5),M(e.exportInProgress()?47:-1),d(),M(e.selectedCount()>0?48:-1),d(8),v("ngTemplateOutlet",i)("ngTemplateOutletContext",Te(19,At,e.keywordRecommendations())),d(8),v("ngTemplateOutlet",i)("ngTemplateOutletContext",Te(21,Ot,e.productRecommendations()))}}function zi(l,t){if(l&1&&(Z(0,"br"),o(1,"small",201),s(2),a()),l&2){let e=c().$implicit;d(2),F("ID: ",e.toCampaignId)}}function $i(l,t){if(l&1&&(o(0,"div",193),s(1),a()),l&2){let e=c().$implicit,i=c(2);d(),b(i.getRuleSummary(e.rule))}}function Bi(l,t){if(l&1&&(s(0),V(1,"number")),l&2){let e=c().$implicit;F(" | \u2264 ",ae(1,1,(e.rule.maxAcos||0)*100,"1.0-0"),"% ACoS ")}}function Ki(l,t){if(l&1){let e=w();o(0,"tr")(1,"td")(2,"strong"),s(3),a(),k(4,zi,3,1),a(),o(5,"td")(6,"span",192),s(7),a(),k(8,$i,2,1,"div",193),o(9,"div",194),s(10),Z(11,"br"),s(12),k(13,Bi,2,4),a()(),o(14,"td")(15,"input",195),C("blur",function(n){let r=_(e).$implicit,m=c(2);return h(m.updateActiveRuleDescription(r.id,n))}),a()(),o(16,"td",196)(17,"div",175)(18,"label",197)(19,"input",40),C("change",function(){let n=_(e).$implicit,r=c(2);return h(r.toggleActiveRuleEnabled(n.id))}),a(),Z(20,"span",198),a(),o(21,"span",199),s(22),a()()(),o(23,"td")(24,"button",200),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.deleteActiveRule(n.id))}),s(25,"Delete"),a()()()}if(l&2){let e=t.$implicit,i=c(2);d(3),b(e.toCampaignName),d(),M(i.debugMode.enabled()?4:-1),d(3),b(e.rule.name),d(),M(i.debugMode.enabled()?-1:8),d(2),F(" \u{1F3AF} Lookback: ",e.rule.lookbackDays," days "),d(2),F(" \u{1F4CA} Thresholds: \u2265 ",e.rule.minOrders," Orders "),d(),M(e.rule.requireAcosMax?13:-1),d(2),v("ngModel",e.description),d(4),v("checked",e.enabled),d(2),ke("color",e.enabled?"var(--ii-green)":"var(--ii-muted)"),d(),F(" ",e.enabled?"Active":"Paused"," ")}}function qi(l,t){l&1&&(o(0,"tr")(1,"td",202)(2,"div",203),s(3,"\u2699\uFE0F"),a(),o(4,"strong"),s(5,"No active campaign-level rules found."),a(),o(6,"p",204),s(7,"Select campaign links in the "),o(8,"strong"),s(9,"Campaign Links"),a(),s(10," tab and click "),o(11,"strong"),s(12,"Create or Select Rule"),a(),s(13," to assign custom parameters."),a()()())}function ji(l,t){if(l&1){let e=w();o(0,"label",118)(1,"span"),s(2,"Lookback Days"),a(),o(3,"input",121),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRule({lookbackDays:+n||30}))}),a()()}if(l&2){let e=c(2);d(3),v("ngModel",e.rule().lookbackDays)}}function Wi(l,t){if(l&1){let e=w();o(0,"label",118)(1,"span"),s(2,"Start Date"),a(),o(3,"input",136),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRule({startDate:n}))}),a()(),o(4,"label",118)(5,"span"),s(6,"End Date"),a(),o(7,"input",136),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchRule({endDate:n}))}),a()()}if(l&2){let e=c(2);d(3),v("ngModel",e.rule().startDate),d(4),v("ngModel",e.rule().endDate)}}function Ui(l,t){if(l&1){let e=w();o(0,"section",21)(1,"div",62)(2,"div")(3,"h2"),s(4,"Active Rules"),a(),o(5,"p"),s(6,'Custom rules assigned to specific "To" destination campaigns. Paused rules will skip recommendation scanning for that destination.'),a()()(),o(7,"div",81)(8,"table",74)(9,"thead")(10,"tr")(11,"th"),s(12,'"To" Campaign'),a(),o(13,"th"),s(14,"Rule Target / Configuration"),a(),o(15,"th",172),s(16,"Description"),a(),o(17,"th"),s(18,"Status"),a(),o(19,"th"),s(20,"Actions"),a()()(),o(21,"tbody"),L(22,Ki,26,12,"tr",null,ie,!1,qi,14,0,"tr"),a()()()(),o(25,"details",173)(26,"summary",174)(27,"span",175),s(28,"\u2699\uFE0F Profile Fallback Settings (Global Defaults)"),a(),o(29,"small",176),s(30,"Applies to links without custom active rules"),a()(),o(31,"div",177)(32,"div",178)(33,"section",179)(34,"div",180)(35,"div")(36,"h2"),s(37,"Default Search Term Isolation"),a(),o(38,"p"),s(39,"Criteria for search terms without a custom rule."),a()()(),o(40,"div",181)(41,"div",182)(42,"label",118)(43,"
4span"),s(44,"Lookback Type"),a(),o(45,"select",98),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRule({lookbackType:n}))}),o(46,"option",119),s(47,"Last X days"),a(),o(48,"option",120),s(49,"Custom date range"),a()()(),k(50,ji,4,1,"label",118)(51,Wi,8,2),o(52,"label",118)(53,"span"),s(54,"Minimum Orders/Sales"),a(),o(55,"input",121),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRule({minOrders:+n||2}))}),a()(),o(56,"label",183)(57,"input",123),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRule({requireAcosMax:n}))}),a(),s(58," Require ACoS threshold"),a(),o(59,"label",118)(60,"span"),s(61,"Max ACoS"),a(),o(62,"input",131),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRule({maxAcos:+n||0}))}),a()(),o(63,"label",183)(64,"input",123),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRule({requireClicksMin:n}))}),a(),s(65," Require clicks threshold"),a(),o(66,"label",118)(67,"span"),s(68,"Minimum Clicks"),a(),o(69,"input",138),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRule({minClicks:+n||0}))}),a()()()()(),o(70,"section",179)(71,"div",180)(72,"div")(73,"h2"),s(74,"Fallback Bid Strategy"),a(),o(75,"p"),s(76,"Default bidding configuration."),a()()(),o(77,"div",181)(78,"div",182)(79,"label",118)(80,"span"),s(81,"Bid Option"),a(),o(82,"select",98),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchBidStrategy({type:n}))}),o(83,"option",127),s(84,"Use Avg CPC"),a(),o(85,"option",129),s(86,"Fixed Bid"),a(),o(87,"option",128),s(88,"Avg CPC Multiplier"),a()()(),o(89,"label",118)(90,"span"),s(91,"Fixed Bid"),a(),o(92,"input",184),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchBidStrategy({fixedBid:+n||0}))}),a()(),o(93,"label",118)(94,"span"),s(95,"Multiplier"),a(),o(96,"input",184),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchBidStrategy({multiplier:+n||1}))}),a()(),o(97,"label",118)(98,"span"),s(99,"Fallback Bid"),a(),o(100,"input",185),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchBidStrategy({fallbackBid:+n||.75}))}),a()(),o(101,"label",118)(102,"span"),s(103,"Safe Max Bid"),a(),o(104,"input",184),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchBidStrategy({maxBid:+n||void 0}))}),a()(),o(105,"label",118)(106,"span"),s(107,"Minimum Bid"),a(),o(108,"input",184),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchBidStrategy({minBid:+n||void 0}))}),a()()()()()(),o(109,"div",186)(110,"section",179)(111,"div",180)(112,"div")(113,"h2"),s(114,"Original Campaign Negative"),a(),o(115,"p"),s(116,"Control double-serving traffic."),a()()(),o(117,"div",181)(118,"label",187)(119,"input",123),C("ngModelChange",function(n){_(e);let r=c();return h(r.patchRule({addNegativeToSource:n}))}),a(),o(120,"span"),s(121,"Add negative back to source discovery campaign"),a()()()(),o(122,"section",179)(123,"div",180)(124,"div")(125,"h2"),s(126,"Protection Settings"),a(),o(127,"p"),s(128,"Global protected phrases to skip."),a()()(),o(129,"div",188)(130,"label",118)(131,"span"),s(132,"Protected words"),a(),o(133,"textarea",189),C("ngModelChange",function(n){_(e);let r=c();return h(r.protectedWords.set(n))}),a()(),o(134,"label",118)(135,"span"),s(136,"Protected phrases"),a(),o(137,"textarea",189),C("ngModelChange",function(n){_(e);let r=c();return h(r.protectedPhrases.set(n))}),a()()()()(),o(138,"div",190)(139,"button",191),C("click",function(){_(e);let n=c();return h(n.resetDefaultRule())}),s(140,"Reset Defaults"),a(),o(141,"button",60),C("click",function(){_(e);let n=c();return h(n.saveSetup())}),s(142,"Save Profile Settings"),a()()()()}if(l&2){let e=c();d(22),D(e.activeRules()),d(23),v("ngModel",e.rule().lookbackType),d(5),M(e.rule().lookbackType==="last_x_days"?50:51),d(5),v("ngModel",e.rule().minOrders),d(2),v("ngModel",e.rule().requireAcosMax),d(5),v("ngModel",e.rule().maxAcos),d(2),v("ngModel",e.rule().requireClicksMin),d(5),v("ngModel",e.rule().minClicks),d(13),v("ngModel",e.rule().bidStrategy.type),d(10),v("ngModel",e.rule().bidStrategy.fixedBid),d(4),v("ngModel",e.rule().bidStrategy.multiplier),d(4),v("ngModel",e.rule().bidStrategy.fallbackBid),d(4),v("ngModel",e.rule().bidStrategy.maxBid),d(4),v("ngModel",e.rule().bidStrategy.minBid),d(11),v("ngModel",e.rule().addNegativeToSource),d(14),v("ngModel",e.protectedWords()),d(4),v("ngModel",e.protectedPhrases())}}function Hi(l,t){if(l&1){let e=w();o(0,"div",164)(1,"span"),s(2),V(3,"number"),V(4,"number"),a(),o(5,"app-ads-manager-grid-filter-chips",206),C("removeFilter",function(n){_(e);let r=c(3);return h(r.exportBatchGrid.setFilter(n,null))}),a(),o(6,"button",163),C("click",function(){_(e);let n=c(3);return h(n.exportBatchGrid.clearFilters())}),s(7,"Clear all"),a()()}if(l&2){let e=c(3);d(2),X("Showing ",j(3,3,e.filteredExportHistory().length)," of ",j(4,5,e.exportHistory().length)," export files"),d(3),v("chips",e.exportBatchGrid.activeFilterChips())}}function Xi(l,t){if(l&1&&(o(0,"th"),Z(1,"app-ads-manager-grid-header-cell",207),a()),l&2){let e=t.$implicit,i=c(3);d(),v("label",e.label)("columnKey",e.key)("grid",i.exportBatchGrid)("resizable",!1)}}function Qi(l,t){if(l&1&&(o(0,"tr")(1,"td")(2,"strong"),s(3),a()(),o(4,"td"),s(5),V(6,"uppercase"),a(),o(7,"td"),s(8),a(),o(9,"td"),s(10),a(),o(11,"td"),s(12),a(),o(13,"td"),s(14),V(15,"date"),a(),o(16,"td"),s(17),a(),o(18,"td"),s(19),a()()),l&2){let e=t.$implicit;d(3),b(e.filename),d(2),b(j(6,8,e.fileType||(e.filename.endsWith(".csv")?"csv":"xlsx"))),d(3),b(e.mode||"-"),d(2),b(e.rowCount),d(2),b(e.recommendationIds.length),d(2),b(ae(15,10,e.exportedAt,"short")),d(3),b(e.status),d(2),b((e.validationIssues==null?null:e.validationIssues.length)||0)}}function Ji(l,t){if(l&1&&(o(0,"tr")(1,"td",208),s(2),a()()),l&2){let e=c(3);d(2),b(e.exportBatchGrid.activeFilterCount()?"No export batches match the current filters.":"No export batches yet.")}}function Zi(l,t){if(l&1&&(k(0,Hi,8,7,"div",164),o(1,"div",81)(2,"table",74)(3,"thead")(4,"tr"),L(5,Xi,2,4,"th",null,ye),a()(),o(7,"tbody"),L(8,Qi,20,13,"tr",null,ie,!1,Ji,3,1,"tr"),a()()()),l&2){let e=c(2);M(e.exportBatchGrid.activeFilterCount()?0:-1),d(5),D(e.exportBatchGrid.columns),d(3),D(e.filteredExportHistory())}}function Yi(l,t){if(l&1){let e=w();o(0,"div",164)(1,"span"),s(2),V(3,"number"),V(4,"number"),a(),o(5,"app-ads-manager-grid-filter-chips",209),C("removeFilter",function(n){_(e);let r=c(3);return h(r.exportLineGrid.setFilter(n,null))}),a(),o(6,"button",163),C("click",function(){_(e);let n=c(3);return h(n.exportLineGrid.clearFilters())}),s(7,"Clear all"),a()()}if(l&2){let e=c(3);d(2),X("Showing ",j(3,3,e.filteredExportLineHistory().length)," of ",j(4,5,e.exportLineHistory().length)," exported lines"),d(3),v("chips",e.exportLineGrid.activeFilterChips())}}function en(l,t){if(l&1&&(o(0,"th"),Z(1,"app-ads-manager-grid-header-cell",207),a()),l&2){let e=t.$implicit,i=c(3);d(),v("label",e.label)("columnKey",e.key)("grid",i.exportLineGrid)("resizable",!1)}}function tn(l,t){if(l&1&&(Z(0,"br"),o(1,"small"),s(2),a()),l&2){let e=c().$implicit;d(2),b(e.adGroupName||e.destinationAdGroupName||e.sourceAdGroupName)}}function nn(l,t){if(l&1&&(o(0,"tr")(1,"td"),s(2),V(3,"date"),a(),o(4,"td"),s(5),a(),o(6,"td")(7,"strong"),s(8),a()(),o(9,"td")(10,"span",210),s(11),a()(),o(12,"td"),s(13),a(),o(14,"td"),s(15),k(16,tn,3,1),a(),o(17,"td"),s(18),a()()),l&2){let e=t.$implicit;d(2),b(ae(3,9,e.exportedAt,"short")),d(3),b(e.spreadsheetRowNumber||"-"),d(3),b(e.searchTerm),d(2),v("ngClass",e.status==="exported"?"ii-badge--green":"ii-badge--muted"),d(),b(e.actionLabel),d(2),b(e.detail),d(2),F("",e.campaignName||e.destinationCampaignName||e.sourceCampaignName||"-"," "),d(),M(e.adGroupName||e.destinationAdGroupName||e.sourceAdGroupName?16:-1),d(2),b(e.filename)}}function an(l,t){if(l&1&&(o(0,"tr")(1,"td",104),s(2),a()()),l&2){let e=c(3);d(2),b(e.exportLineGrid.activeFilterCount()?"No exported lines match the current filters.":"No exported line history yet.")}}function on(l,t){if(l&1&&(k(0,Yi,8,7,"div",164),o(1,"div",81)(2,"table",74)(3,"thead")(4,"tr"),L(5,en,2,4,"th",null,ye),a()(),o(7,"tbody"),L(8,nn,19,12,"tr",null,ie,!1,an,3,1,"tr"),a()()()),l&2){let e=c(2);M(e.exportLineGrid.activeFilterCount()?0:-1),d(5),D(e.exportLineGrid.columns),d(3),D(e.filteredExportLineHistory())}}function rn(l,t){if(l&1){let e=w();o(0,"section",21)(1,"div",62)(2,"div")(3,"h2"),s(4,"Export History"),a(),o(5,"p"),s(6,"Files created from Isolation Intelligence and the exact line-level actions exported."),a()(),o(7,"div",205)(8,"button",24),C("click",function(){_(e);let n=c();return h(n.exportHistoryTab.set("files"))}),s(9,"Files"),a(),o(10,"button",24),C("click",function(){_(e);let n=c();return h(n.exportHistoryTab.set("lines"))}),s(11,"Exported Lines"),a()()(),k(12,Zi,11,2)(13,on,11,2),a()}if(l&2){let e=c();d(8),A("active",e.exportHistoryTab()==="files"),d(2),A("active",e.exportHistoryTab()==="lines"),d(2),M(e.exportHistoryTab()==="files"?12:13)}}function sn(l,t){if(l&1){let e=w();o(0,"input",213),C("change",function(){_(e);let n=c(2).rows,r=c();return h(r.selectAll(n))}),a()}}function ln(l,t){if(l&1&&Z(0,"app-ads-manager-grid-header-cell",207),l&2){let e=c().$implicit,i=c(2);v("label",e.label)("columnKey",e.key)("grid",i.recommendationGrid)("resizable",!1)}}function dn(l,t){if(l&1&&(o(0,"th"),k(1,sn,1,0,"input",212)(2,ln,1,4,"app-ads-manager-grid-header-cell",207),a()),l&2){let e=t.$implicit;d(),M(e.key==="select"?1:2)}}function cn(l,t){if(l&1){let e=w();o(0,"tr")(1,"td")(2,"input",40),C("change",function(){let n=_(e).$implicit,r=c(2);return h(r.toggleSelect(n.id))}),a()(),o(3,"td")(4,"strong"),s(5),a()(),o(6,"td"),s(7),a(),o(8,"td"),s(9),a(),o(10,"td"),s(11),a(),o(12,"td"),s(13),a(),o(14,"td"),s(15),a(),o(16,"td"),s(17),a(),o(18,"td"),s(19),V(20,"currency"),a(),o(21,"td"),s(22),V(23,"currency"),a(),o(24,"td"),s(25),V(26,"percent"),a(),o(27,"td"),s(28),a(),o(29,"td"),s(30),V(31,"percent"),a(),o(32,"td"),s(33),V(34,"currency"),a(),o(35,"td"),s(36),V(37,"percent"),a(),o(38,"td"),s(39),V(40,"currency"),a(),o(41,"td")(42,"strong"),s(43),V(44,"currency"),a()(),o(45,"td")(46,"button",214),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.toggleSourceNegative(n))}),s(47),a()(),o(48,"td"),s(49),a(),o(50,"td")(51,"span",215),s(52),a(),o(53,"em"),s(54),a()(),o(55,"td")(56,"span",210),s(57),a()(),o(58,"td")(59,"div",103)(60,"button",169),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.openDrawer(n))}),s(61,"View Why"),a(),o(62,"button",216),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.approve(n))}),s(63,"Approve"),a(),o(64,"button",217),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.openRejectDialog(n))}),s(65,"Reject"),a(),o(66,"button",217),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.protect(n))}),s(67,"Protect"),a(),o(68,"button",216),C("click",function(){let n=_(e).$implicit,r=c(2);return h(r.implement(n))}),s(69,"Implement"),a()()()()}if(l&2){let e=t.$implicit,i=c(2);A("ii-handoff-row",i.isHandoffMatch(e)),d(2),v("checked",i.isSelected(e.id)),d(3),b(e.searchTerm),d(2),b(e.sourceCampaignName),d(2),b(e.sourceAdGroupName||"-"),d(2),b(e.sourceTargetText||"-"),d(2),b(e.destinationCampaignName),d(2),b(e.destinationAdGroupName||"-"),d(2),b(e.metrics.orders),d(2),b(j(20,31,e.metrics.sales)),d(3),b(j(23,33,e.metrics.spend)),d(3),b(e.metrics.acos==null?"-":ae(26,35,e.metrics.acos,"1.1-1")),d(3),b(e.metrics.clicks),d(2),b(ae(31,38,e.metrics.ctr,"1.1-1")),d(3),b(j(34,41,e.metrics.cpc)),d(3),b(ae(37,43,e.metrics.cvr,"1.1-1")),d(3),b(e.bid.avgCpc==null?"-":j(40,46,e.bid.avgCpc)),d(4),b(j(44,48,e.bi
4d.suggestedBid)),d(3),A("on",e.sourceNegativeEnabled),d(),b(e.sourceNegativeEnabled?"Yes":"No"),d(2),b(e.rule.ruleName),d(3),b(e.confidence),d(2),b(i.confidenceLabel(e.confidence)),d(2),v("ngClass",i.badgeClass(e.status)),d(),b(e.status),d(5),v("disabled",e.status==="approved"||e.status==="exported"),d(2),v("disabled",e.status==="exported"),d(2),v("disabled",e.status==="exported"),d(2),v("disabled",e.status==="exported"||e.status==="protected")}}function mn(l,t){l&1&&(o(0,"tr")(1,"td",218),s(2,"No isolation opportunities found for the selected rule and lookback window."),a()())}function pn(l,t){if(l&1&&(o(0,"div",81)(1,"table",74)(2,"thead")(3,"tr"),L(4,dn,3,1,"th",null,ye),a()(),o(6,"tbody"),L(7,cn,70,50,"tr",211,ie,!1,mn,3,0,"tr"),a()()()),l&2){let e=t.rows,i=c();d(4),D(i.recommendationGrid.columns),d(3),D(e)}}function un(l,t){if(l&1&&(o(0,"div")(1,"span"),s(2),a(),o(3,"strong"),s(4),a()()),l&2){let e=t.$implicit;d(2),b(e.label),d(2),b(e.value)}}function gn(l,t){if(l&1&&(o(0,"div")(1,"span"),s(2),a(),o(3,"strong"),s(4),a()()),l&2){let e=t.$implicit;A("passed",e.value==="Passed")("failed",e.value==="Failed"),d(2),b(e.label),d(2),b(e.value)}}function _n(l,t){if(l&1&&(o(0,"div")(1,"span"),s(2),a(),o(3,"strong"),s(4),V(5,"currency"),a()()),l&2){let e=t.$implicit;d(2),X("",e.sourceCampaignName," / ",e.sourceAdGroupName||"-"),d(2),X("",e.metrics.orders," orders / ",j(5,4,e.metrics.sales))}}function hn(l,t){if(l&1){let e=w();o(0,"div",219),C("click",function(){_(e);let n=c();return h(n.closeDrawer())}),o(1,"aside",220),C("click",function(n){return _(e),h(n.stopPropagation())}),o(2,"header")(3,"div")(4,"span"),s(5,"Why this search term should be isolated"),a(),o(6,"h2"),s(7),a(),o(8,"p"),s(9),V(10,"currency"),a()(),o(11,"button",221),C("click",function(){_(e);let n=c();return h(n.closeDrawer())}),s(12,"Close"),a()(),o(13,"div",222)(14,"section",223),s(15),a(),o(16,"section")(17,"h3"),s(18,"Stats"),a(),o(19,"div",224),L(20,un,5,2,"div",null,Oe),a()(),o(22,"section")(23,"h3"),s(24,"Rule Match"),a(),o(25,"div",225),L(26,gn,5,6,"div",226,Oe),a()(),o(28,"section")(29,"h3"),s(30,"Source Breakdown"),a(),o(31,"div",225),L(32,_n,6,6,"div",null,Lt),a()()(),o(34,"footer")(35,"button",227),C("click",function(){let n=_(e),r=c();return h(r.approve(n))}),s(36,"Approve"),a(),o(37,"button",221),C("click",function(){let n=_(e),r=c();return h(r.openRejectDialog(n))}),s(38,"Reject"),a(),o(39,"button",221),C("click",function(){let n=_(e),r=c();return h(r.protect(n))}),s(40,"Protect"),a(),o(41,"button",227),C("click",function(){let n=_(e),r=c();return h(r.implement(n))}),s(42,"Add to Bulk Export"),a(),o(43,"button",221),C("click",function(){_(e);let n=c();return h(n.closeDrawer())}),s(44,"Close"),a()()()()}if(l&2){let e=t,i=c();d(7),b(e.searchTerm),d(2),we("",e.recommendationType," / ",e.sourceCampaignName," -> ",e.destinationCampaignName," / ",j(10,6,e.bid.suggestedBid)),d(6),b(e.reason),d(5),D(i.statRows(e)),d(6),D(i.ruleRows(e)),d(6),D(e.sourceBreakdowns||se(8,ce))}}function Cn(l,t){if(l&1&&(o(0,"option",230),s(1),a()),l&2){let e=t.$implicit;v("value",e),d(),b(e)}}function fn(l,t){if(l&1){let e=w();o(0,"div",228),C("click",function(){_(e);let n=c();return h(n.rejectDialogOpen.set(!1))}),o(1,"div",229),C("click",function(n){return _(e),h(n.stopPropagation())}),o(2,"header")(3,"h3"),s(4,"Reject Recommendation"),a()(),o(5,"label",118)(6,"span"),s(7,"Rejection reason"),a(),o(8,"select",98),C("ngModelChange",function(n){_(e);let r=c();return h(r.rejectReason.set(n))}),L(9,Cn,2,2,"option",230,Ie),a()(),o(11,"footer")(12,"button",221),C("click",function(){_(e);let n=c();return h(n.rejectDialogOpen.set(!1))}),s(13,"Cancel"),a(),o(14,"button",227),C("click",function(){_(e);let n=c();return h(n.confirmReject())}),s(15,"Reject"),a()()()()}if(l&2){let e=c();d(8),v("ngModel",e.rejectReason()),d(),D(e.rejectionReasons)}}function xn(l,t){if(l&1&&(o(0,"div")(1,"span",210),s(2),a(),o(3,"strong"),s(4),a(),o(5,"em"),s(6),a(),o(7,"code"),s(8),a()()),l&2){let e=t.$implicit;d(),v("ngClass",e.severity==="error"?"ii-badge--red":"ii-badge--amber"),d(),b(e.severity),d(2),b(e.issue),d(2),b(e.suggestedFix||"Review the row before upload."),d(2),b(e.recommendationId)}}function vn(l,t){if(l&1){let e=w();o(0,"div",228),C("click",function(){_(e);let n=c();return h(n.exportIssueModalOpen.set(!1))}
4),o(1,"div",231),C("click",function(n){return _(e),h(n.stopPropagation())}),o(2,"header")(3,"h3"),s(4,"Pre-Export Validation"),a(),o(5,"p"),s(6,"Blocking issues must be fixed or excluded before export."),a()(),o(7,"div",232),L(8,xn,9,5,"div",null,Dt),a(),o(10,"footer")(11,"button",221),C("click",function(){_(e);let n=c();return h(n.exportIssueModalOpen.set(!1))}),s(12,"Exclude invalid rows"),a(),o(13,"button",227),C("click",function(){_(e);let n=c();return h(n.exportValidRowsOnly())}),s(14,"Export valid rows only"),a()()()()}if(l&2){let e=c();d(8),D(e.exportIssues())}}function bn(l,t){if(l&1){let e=w();o(0,"div",236),C("click",function(){let n=_(e).$implicit,r=c(3);return h(r.selectPresetRule(n))}),o(1,"strong"),s(2),a(),o(3,"span"),s(4),a(),o(5,"div",240)(6,"em",52),s(7,"Saved"),a(),o(8,"button",87),C("click",function(n){let r=_(e).$implicit,m=c(3);return n.stopPropagation(),h(m.deleteSavedRule(r.id))}),s(9,"\u2715"),a()()()}if(l&2){let e=t.$implicit;d(2),b(e.name),d(2),we("Lookback: ",e.lookbackDays||30," days | Min orders: ",e.minOrders," | Bid: ",e.bidStrategy.type," | Negative: ",e.addNegativeToSource?"Yes":"No")}}function yn(l,t){l&1&&(o(0,"p",239),s(1,"No saved rules yet. Create one and save it for future use."),a())}function In(l,t){if(l&1){let e=w();o(0,"div",233)(1,"div",236),C("click",function(){_(e);let n=c(2);return h(n.selectPresetRule(n.resetDefaultRuleObject()))}),o(2,"strong"),s(3,"Default \u2014 30 Days, 2+ Conversions"),a(),o(4,"span"),s(5,"Lookback: 30 days | Min orders: 2 | Avg CPC bid | Negative to source: Yes"),a(),o(6,"em",237),s(7,"Built-in"),a()(),L(8,bn,10,5,"div",238,ie,!1,yn,2,0,"p",239),a()}if(l&2){let e=c(2);d(8),D(e.savedRules())}}function Sn(l,t){if(l&1){let e=w();o(0,"label",125)(1,"span"),s(2,"Max ACoS (%)"),a(),o(3,"div",253)(4,"input",254),V(5,"number"),C("ngModelChange",function(n){_(e);let r=c(3);return h(r.patchEditingRule({maxAcos:(+n||0)/100}))}),a(),o(6,"em"),s(7,"%"),a()()()}if(l&2){let e=c(3);d(4),v("ngModel",ae(5,1,+(e.editingRule().maxAcos||0)*100,"1.0-0"))}}function kn(l,t){if(l&1){let e=w();o(0,"label",125)(1,"span"),s(2,"Min Clicks"),a(),o(3,"input",138),C("ngModelChange",function(n){_(e);let r=c(3);return h(r.patchEditingRule({minClicks:+n||0}))}),a()()}if(l&2){let e=c(3);d(3),v("ngModel",e.editingRule().minClicks)}}function Mn(l,t){if(l&1){let e=w();o(0,"label",125)(1,"span"),s(2,"Min Spend ($)"),a(),o(3,"div",248)(4,"em"),s(5,"$"),a(),o(6,"input",137),C("ngModelChange",function(n){_(e);let r=c(3);return h(r.patchEditingRule({minSpend:+n||0}))}),a()()()}if(l&2){let e=c(3);d(6),v("ngModel",e.editingRule().minSpend)}}function wn(l,t){if(l&1){let e=w();o(0,"label",125)(1,"span"),s(2,"Min CTR (%)"),a(),o(3,"div",253)(4,"input",255),C("ngModelChange",function(n){_(e);let r=c(3);return h(r.patchEditingRule({minCtr:(+n||0)/100}))}),a(),o(5,"em"),s(6,"%"),a()()()}if(l&2){let e=c(3);d(4),v("ngModel",(e.editingRule().minCtr||0)*100)}}function Tn(l,t){if(l&1){let e=w();o(0,"label",125)(1,"span"),s(2,"Min CVR (%)"),a(),o(3,"div",253)(4,"input",255),C("ngModelChange",function(n){_(e);let r=c(3);return h(r.patchEditingRule({minCvr:(+n||0)/100}))}),a(),o(5,"em"),s(6,"%"),a()()()}if(l&2){let e=c(3);d(4),v("ngModel",(e.editingRule().minCvr||0)*100)}}function Pn(l,t){if(l&1){let e=w();o(0,"label",118)(1,"span"),s(2,"Multiplier"),a(),o(3,"div",256)(4,"input",257),C("ngModelChange",function(n){_(e);let r=c(3);return h(r.patchEditingBidStrategy({multiplier:+n||1}))}),a(),o(5,"em"),s(6,"\xD7"),a()(),o(7,"small"),s(8,"e.g. 1.1 = Avg CPC + 10%"),a()()}if(l&2){let e=c(3);d(4),v("ngModel",e.editingRule().bidStrategy.multiplier||1.1)}}function Rn(l,t){if(l&1){let e=w();o(0,"label",118)(1,"span"),s(2,"Fixed Bid ($)"),a(),o(3,"div",248)(4,"em"),s(5,"$"),a(),o(6,"input",185),C("ngModelChange",function(n){_(e);let r=c(3);return h(r.patchEditingBidStrategy({fixedBid:+n||.75}))}),a()()()}if(l&2){let e=c(3);d(6),v("ngModel",e.editingRule().bidStrategy.fixedBid||.75)}}function En(l,t){if(l&1){let e=w();o(0,"div",234)(1,"div",113)(2,"div",114),s(3,"Rule Identity"),a(),o(4,"div",115)(5,"label",241)(6,"span"),s(7,"Rule Name"),a(),o(8,"input",242),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingRule({name:n}))}),a()(),o(9,"label",118)(10,"span"),s(11,"Lookback Window (days)"),a(),o(12,"input",121),
4C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingRule({lookbackDays:+n||30}))}),a()(),o(13,"label",118)(14,"span"),s(15,"Min Orders / Conversions"),a(),o(16,"input",121),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingRule({minOrders:+n||2}))}),a()()()(),o(17,"div",113)(18,"div",114),s(19,"Qualification Filters"),a(),o(20,"div",115)(21,"label",122)(22,"input",123),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingRule({requireAcosMax:n}))}),a(),o(23,"div",124)(24,"strong"),s(25,"Require Max ACoS"),a(),o(26,"span"),s(27,"Only isolate search terms where ACoS is below this threshold"),a()(),k(28,Sn,8,4,"label",125),a(),o(29,"label",122)(30,"input",123),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingRule({requireClicksMin:n}))}),a(),o(31,"div",124)(32,"strong"),s(33,"Require Min Clicks"),a(),o(34,"span"),s(35,"Only isolate search terms with enough click data to be statistically meaningful"),a()(),k(36,kn,4,1,"label",125),a(),o(37,"label",122)(38,"input",123),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingRule({addNegativeToSource:n}))}),a(),o(39,"div",124)(40,"strong"),s(41,"Add Negative to Source Campaign"),a(),o(42,"span"),s(43,"After isolating a term, add it as a negative exact/product target back to the discovery campaign to prevent double-serving"),a()()()()(),o(44,"div",243)(45,"div",114),s(46,"Advanced Qualification Filters"),a(),o(47,"div",244)(48,"label",122)(49,"input",123),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingRule({requireSpendMin:n}))}),a(),o(50,"div",124)(51,"strong"),s(52,"Require Min Spend"),a(),o(53,"span"),s(54,"Only isolate terms with at least this amount of spend"),a()(),k(55,Mn,7,1,"label",125),a(),o(56,"label",122)(57,"input",123),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingRule({requireCtrMin:n}))}),a(),o(58,"div",124)(59,"strong"),s(60,"Require Min CTR (%)"),a(),o(61,"span"),s(62,"Only isolate terms with high CTR"),a()(),k(63,wn,7,1,"label",125),a(),o(64,"label",122)(65,"input",123),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingRule({requireCvrMin:n}))}),a(),o(66,"div",124)(67,"strong"),s(68,"Require Min CVR (%)"),a(),o(69,"span"),s(70,"Only isolate terms with high Conversion Rate"),a()(),k(71,Tn,7,1,"label",125),a(),o(72,"label",245)(73,"span"),s(74,"Exclude Words / Phrases (does not contain) \u2014 One word/phrase per line"),a(),o(75,"textarea",246),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.updateEditingExcludePhrases(n))}),a()(),o(76,"label",245)(77,"span"),s(78,"Restrict to Words / Phrases (must contain) \u2014 One word/phrase per line"),a(),o(79,"textarea",247),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.updateEditingIncludePhrases(n))}),a()()()(),o(80,"div",113)(81,"div",114),s(82,"Bid Strategy"),a(),o(83,"div",115)(84,"label",118)(85,"span"),s(86,"Strategy"),a(),o(87,"select",98),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingBidStrategy({type:n}))}),o(88,"option",127),s(89,"Avg CPC \u2014 use the search term's average cost per click as the new bid"),a(),o(90,"option",128),s(91,"Avg CPC \xD7 Multiplier \u2014 scale the avg CPC by a factor (e.g. 1.1 = 10% higher)"),a(),o(92,"option",129),s(93,"Fixed Bid \u2014 always use a specific dollar amount"),a()()(),k(94,Pn,9,1,"label",118),k(95,Rn,7,1,"label",118),o(96,"label",118)(97,"span"),s(98,"Min Bid ($)"),a(),o(99,"div",248)(100,"em"),s(101,"$"),a(),o(102,"input",184),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingBidStrategy({minBid:+n||void 0}))}),a()()(),o(103,"label",118)(104,"span"),s(105,"Max Bid ($)"),a(),o(106,"div",248)(107,"em"),s(108,"$"),a(),o(109,"input",184),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingBidStrategy({maxBid:+n||void 0}))}),a()()(),o(110,"label",249)(111,"span"),s(112,"Fallback Bid ($) "),o(113,"abbr",250),s(114,"?"),a()(),o(115,"div",248)(116,"em"),s(117,"$"),a(),o(118,"input",185),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.patchEditingBidStrategy({fallbackBid:+n||.75}))}),a()()()()(),o(119,"div",251)(120,"div",114),s(121,"Rule Description & Label"),a(),o(122,"div",115)(123,"label",116)(124,"span"),s(125,"Description / What is this rule for?"),a(),o(126,"input",252),C("ngModelChange",function(n){_(e);let r=c(2);return h(r.editingRuleDescription.set(n))}),a()()()()()}if(l&2){let e=c(2);d(8),v("ngModel",e.editingRule().name),d(4),v("ngModel",e.editingRule().lookbackDays),d(4),v("ngModel",e.editingRule().minOrders),d(5),A("ii-rule-toggle--on",e.editingRule().requireAcosMax),d(),v("ngModel",e.editingRule().requireAcosMax),d(6),M(e.editingRule().requireAcosMax?28:-1),d(),A("ii-rule-toggle--on",e.editingRule().requireClicksMin),d(),v("ngModel",e.editingRule().requireClicksMin),d(6),M(e.editingRule().requireClicksMin?36:-1),d(),A("ii-rule-toggle--on",e.editingRule().addNegativeToSource),d(),v("ngModel",e.editingRule().addNegativeToSource),d(10),A("ii-rule-toggle--on",e.editingRule().requireSpendMin),d(),v("ngModel",e.editingRule().requireSpendMin),d(6),M(e.editingRule().requireSpendMin?55:-1),d(),A("ii-rule-toggle--on",e.editingRule().requireCtrMin),d(),v("ngModel",e.editingRule().requireCtrMin),d(6),M(e.editingRule().requireCtrMin?63:-1),d(),A("ii-rule-toggle--on",e.editingRule().requireCvrMin),d(),v("ngModel",e.editingRule().requireCvrMin),d(6),M(e.editingRule().requireCvrMin?71:-1),d(4),v("ngModel",(e.editingRule().excludePhrases||se(35,ce)).join(`
5`)),d(4),v("ngModel",(e.editingRule().includePhrases||se(36,ce)).join(`
6`)),d(8),v("ngModel",e.editingRule().bidStrategy.type),d(7),M(e.editingRule().bidStrategy.type==="avg_cpc_multiplier"?94:-1),d(),M(e.editingRule().bidStrategy.type==="fixed"?95:-1),d(7),v("ngModel",e.editingRule().bidStrategy.minBid),d(7),v("ngModel",e.editingRule().bidStrategy.maxBid),d(9),v("ngModel",e.editingRule().bidStrategy.fallbackBid),d(8),v("ngModel",e.editingRuleDescription())}}function An(l,t){if(l&1){let e=w();o(0,"button",28),C("click",function(){_(e);let n=c(2);return h(n.saveCurrentRuleAsPreset())}),s(1,"Save as Preset"),a()}}function On(l,t){if(l&1){let e=w();o(0,"div",228),C("click",function(){_(e);let n=c();return h(n.closeRuleModal())}
6),o(1,"div",231),C("click",function(n){return _(e),h(n.stopPropagation())}),o(2,"header")(3,"div")(4,"h3"),s(5,"Create or Select Rule"),a(),o(6,"p"),s(7),a()(),o(8,"div",205)(9,"button",24),C("click",function(){_(e);let n=c();return h(n.ruleModalTab.set("presets"))}),s(10,"Presets"),a(),o(11,"button",24),C("click",function(){_(e);let n=c();return h(n.ruleModalTab.set("create"))}),s(12,"Create / Edit"),a()()(),k(13,In,11,1,"div",233),k(14,En,127,37,"div",234),o(15,"footer"),k(16,An,2,0,"button",235),o(17,"button",163),C("click",function(){_(e);let n=c();return h(n.closeRuleModal())}),s(18,"Cancel"),a(),o(19,"button",60),C("click",function(){_(e);let n=c();return h(n.applyRuleToSelectedLinks())}),s(20,"Apply Rule & Run Scan"),a()()()()}if(l&2){let e=c();d(7),F("Apply a rule to ",e.selectedLinkKeys().size," selected campaign link(s). Source negative settings come from this rule."),d(2),A("active",e.ruleModalTab()==="presets"),d(2),A("active",e.ruleModalTab()==="create"),d(2),M(e.ruleModalTab()==="presets"?13:-1),d(),M(e.ruleModalTab()==="create"?14:-1),d(2),M(e.ruleModalTab()==="create"?16:-1)}}var Ae=["Not relevant enough","Already managed manually","Wrong destination campaign","Bid too high","Bid too low","Do not negative source campaign","Strategic discovery term","Other"];function G(){return new Date().toISOString()}var bt=class l{vm;isolation=K(be);linking=K(Ce);importMapper=K(ve);exportService=K(xe);amazonApi=K(_e);orgService=K(Xe);accountService=K(st);route=K(We);debugMode=K(ct);gridLayout=K(ut);recommendationGrid=new he(this.gridLayout,"ads-manager.isolation.recommendations",[{key:"select",label:"Select",defaultWidth:44,hideable:!1},{key:"term",label:"Search Term / ASIN",defaultWidth:220,filter:{kind:"text",placeholder:"Search term or ASIN",suggestions:{label:"Terms in these recommendations",placeholder:"Choose a term"}}},{key:"sourceCampaign",label:"Source Campaign",defaultWidth:190,filter:{kind:"text",placeholder:"Search source campaign",suggestions:{label:"Source campaigns represented here",placeholder:"Choose a campaign"}}},{key:"sourceAdGroup",label:"Source Ad Group",defaultWidth:170,filter:{kind:"text",placeholder:"Search source ad group",suggestions:{label:"Source ad groups represented here",placeholder:"Choose an ad group"}}},{key:"sourceTarget",label:"Source Target",defaultWidth:170,filter:{kind:"text",placeholder:"Search source target",suggestions:{label:"Source targets represented here",placeholder:"Choose a target"}}},{key:"destinationCampaign",label:"Destination Campaign",defaultWidth:200,filter:{kind:"text",placeholder:"Search destination campaign",suggestions:{label:"Destination campaigns represented here",placeholder:"Choose a campaign"}}},{key:"destinationAdGroup",label:"Destination Ad Group",defaultWidth:180,filter:{kind:"text",placeholder:"Search destination ad group",suggestions:{label:"Destination ad groups represented here",placeholder:"Choose an ad group"}}},{key:"orders",label:"Orders",defaultWidth:85,filter:{kind:"number",step:1}},{key:"sales",label:"Sales",defaultWidth:95,filter:{kind:"number",step:.01}},{key:"spend",label:"Spend",defaultWidth:95,filter:{kind:"number",step:.01}},{key:"acos",label:"ACoS",defaultWidth:85,filter:{kind:"number",minLabel:"Minimum ratio",maxLabel:"Maximum ratio",step:.01}},{key:"clicks",label:"Clicks",defaultWidth:85,filter:{kind:"number",step:1}},{key:"ctr",label:"CTR",defaultWidth:85,filter:{kind:"number",minLabel:"Minimum ratio",maxLabel:"Maximum ratio",step:.001}},{key:"cpc",label:"CPC",defaultWidth:85,filter:{kind:"number",step:.01}},{key:"cvr",label:"CVR",defaultWidth:85,filter:{kind:"number",minLabel:"Minimum ratio",maxLabel:"Maximum ratio",step:.001}},{key:"avgCpc",label:"Avg CPC",defaultWidth:95,filter:{kind:"number",step:.01}},{key:"suggestedBid",label:"Suggested Bid",defaultWidth:110,filter:{kind:"number",step:.01}},{key:"sourceNegative",label:"Source Negative",defaultWidth:130,filter:{kind:"select",options:[{value:"yes",label:"Yes"},{value:"no",label:"No"}]}},{key:"rule",label:"Rule Triggered",defaultWidth:175,filter:{kind:"text",placeholder:"Search rule",suggestions:{label:"Rules represented here",placeholder:"Choose a rule"}}},{key:"confidence",label:"Confidence",defaultWidth:105,filter:{kind:"number",minLabel:"Minimum score",maxLabel:"Maximum score",step:1}},{key:"status",label:"Status",defaultWidth:105,filter:{kind:"select",options:[{value:"pending",label:"Pending"},{value:"approved",label:"Approved"},{value:"rejected",label:"Rejected"},{value:"protected",label:"Protected"},{value:"implemented",label:"Implemented"},{value:"exported",label:"Exported"}]}},{key:"actions",label:"Actions",defaultWidth:260,hideable:!1}]);
6exportBatchGrid=new he(this.gridLayout,"ads-manager.isolation.export-history.files",[{key:"filename",label:"Filename",defaultWidth:260,filter:{kind:"text",placeholder:"Search filename",suggestions:{label:"Files in export history",placeholder:"Choose a file"}}},{key:"type",label:"Type",defaultWidth:85,filter:{kind:"select",options:[{value:"xlsx",label:"Excel"},{value:"csv",label:"CSV"}]}},{key:"mode",label:"Mode",defaultWidth:120,filter:{kind:"select",options:[{value:"approved",label:"Approved"},{value:"selected",label:"Selected"},{value:"audit",label:"Audit"},{value:"keyword",label:"Keyword targets"},{value:"product",label:"Product targets"},{value:"negatives",label:"Source negatives"}]}},{key:"rows",label:"Rows",defaultWidth:85,filter:{kind:"number",step:1}},{key:"recommendations",label:"Recommendations",defaultWidth:130,filter:{kind:"number",step:1}},{key:"exported",label:"Exported",defaultWidth:150,filter:{kind:"date"}},{key:"status",label:"Status",defaultWidth:105,filter:{kind:"select",options:[{value:"created",label:"Created"},{value:"downloaded",label:"Downloaded"},{value:"failed",label:"Failed"}]}},{key:"issues",label:"Validation Issues",defaultWidth:135,filter:{kind:"number",step:1}}]);exportLineGrid=new he(this.gridLayout,"ads-manager.isolation.export-history.lines",[{key:"exported",label:"Exported",defaultWidth:150,filter:{kind:"date"}},{key:"row",label:"Row",defaultWidth:80,filter:{kind:"number",step:1}},{key:"term",label:"Search Term",defaultWidth:210,filter:{kind:"text",placeholder:"Search term or ASIN",suggestions:{label:"Terms in exported lines",placeholder:"Choose a term"}}},{key:"action",label:"Action",defaultWidth:170,filter:{kind:"text",placeholder:"Search action",suggestions:{label:"Actions in exported lines",placeholder:"Choose an action"}}},{key:"details",label:"Details",defaultWidth:260,filter:{kind:"text",placeholder:"Search export details"}},{key:"campaign",label:"Campaign / Ad Group",defaultWidth:240,filter:{kind:"text",placeholder:"Search campaign or ad group",suggestions:{label:"Campaigns and ad groups in exported lines",placeholder:"Choose a campaign or ad group"}}},{key:"file",label:"File",defaultWidth:240,filter:{kind:"text",placeholder:"Search filename",suggestions:{label:"Files represented here",placeholder:"Choose a file"}}}]);readOnlyMode=!0;activeTab=S("links");recommendationSearch=S("");handoffFocus=S("");handoffKind=S("");handoffStartDate=S("");handoffEndDate=S("");expandedIsolationKey=S("");ruleMode=S("simple");message=S(null);error=S(null);isLoadingApi=S(!1);isLoadingCampaignLinks=S(!0);isScanning=S(!1);lastScanDate=S(null);connections=S([]);profiles=S([]);syncedProfiles=S([]);selectedConnectionId=S("");selectedProfileId=S("");selectedAccountName=S("selected-account");rule=S(te());protectedWords=S("");protectedPhrases=S("");protectedAsins=S("");protectedCampaigns=S("");protectedAdGroups=S("");uploadedRows=S([]);rawUploadName=S("");campaigns=S([]);campaignLinks=S([]);manualLinks=S([]);recommendations=S([]);selectedRecommendationIds=S(new Set);apiQueueStageLoading=S(!1);selectedFromCampaignIds=S(new Set);selectedToCampaignId=S("");manualFromFilter=S("");manualToFilter=S("");manualLinkType=S("keyword_isolation");manualAdGroupBehavior=S("match_source_ad_group_name");savedRules=S([]);activeRules=S([]);editingRuleDescription=S("");ruleModalOpen=S(!1);ruleModalTab=S("presets");selectedLinkKeys=S(new Set);editingRule=S(te());rulesTabDraft=S(te());rulesTabEditingId=S(null);drawerOpen=S(!1);drawerRec=S(null);rejectDialogOpen=S(!1);rejectTarget=S(null);rejectReason=S(Ae[0]);rejectionReasons=Ae;exportMode=S("approved");exportIssues=S([]);exportIssueModalOpen=S(!1);lastExportBatch=S(null);exportHistory=S([]);exportHistoryTab=S("files");exportInProgress=S(!1);exportProgress=S(0);exportProgressLabel=S("");activeRecommendations=O(()=>this.recommendations().filter(t=>t.status!=="exported"));filteredActiveRecommendations=O(()=>{let t=this.recommendationSearch().trim().toLowerCase(),e=this.activeRecommendations();return t&&(e=e.filter(i=>[i.searchTerm,i.sourceCampaignName,i.sourceAdGroupName,i.sourceTargetText,i.destinationCampaignName,i.destinationAdGroupName,i.rule?.ruleName].some(n=>String(n||"").toLowerCase().includes(t)))),this.recommendationGrid.filterRows(e,(i,n)=>this.recommendationFilterValue(i,n),(i,n)=>this.recommendationFilterSuggestionValue(i,n))});keywordRecommendations=O(()=>this.filteredActiveRecommendations().filter(t=>
6t.recommendationType==="keyword_exact_create"));productRecommendations=O(()=>this.filteredActiveRecommendations().filter(t=>t.recommendationType==="product_target_create"));filteredExportHistory=O(()=>this.exportBatchGrid.filterRows(this.exportHistory(),(t,e)=>this.exportBatchFilterValue(t,e),(t,e)=>this.exportBatchFilterSuggestionValue(t,e)));exportLineHistory=O(()=>this.exportHistory().flatMap(t=>t.lineItems||[]).sort((t,e)=>String(e.exportedAt||"").localeCompare(String(t.exportedAt||""))||(t.spreadsheetRowNumber||999999)-(e.spreadsheetRowNumber||999999)));filteredExportLineHistory=O(()=>this.exportLineGrid.filterRows(this.exportLineHistory(),(t,e)=>this.exportLineFilterValue(t,e),(t,e)=>this.exportLineFilterSuggestionValue(t,e)));selectedCount=O(()=>this.selectedRecommendationIds().size);selectedIsolationQueueStageCount=O(()=>this.selectedIsolationQueueRows().length);savedRulesSorted=O(()=>[...this.savedRules()].sort((t,e)=>String(e.updatedAt||"").localeCompare(String(t.updatedAt||""))||t.name.localeCompare(e.name)));activeProfile=O(()=>this.syncedProfiles().find(t=>t.connectionId===this.selectedConnectionId()&&String(t.profileId)===String(this.selectedProfileId()))||this.syncedProfiles().find(t=>String(t.profileId)===String(this.selectedProfileId()))||this.profiles().find(t=>String(t.profileId)===String(this.selectedProfileId()))||null);currentOrgId=O(()=>this.orgService.getCurrentOrgId()||"");currentAccountId=O(()=>String(this.selectedProfileId()||this.activeProfile()?.profileId||this.vm?.activeProfileId?.()||this.accountService.getCurrentAccountId()||"local-account"));monitorAccountMeta=O(()=>{let t=this.vm?.selectedAccountMeta?.()||null,e=this.activeProfile(),i=this.workspaceMonitorCache(),n=String(t?.profileId||this.selectedProfileId()||this.vm?.activeProfileId?.()||"");return{accountName:t?.accountName||e?.accountName||this.selectedAccountName()||(n?`Profile ${n}`:"No Monitor Account selected"),connectionLabel:t?.connectionLabel||e?.connectionLabel||this.activeConnectionLabel(),amazonEmail:t?.amazonEmail||e?.amazonEmail||this.activeAmazonEmail(),profileId:n,marketplace:t?.marketplace||e?.countryCode||"-",dataThrough:t?.dataThrough||i?.dataDate||i?.todaysOverview?.latestDataDate||"-",lastSync:t?.lastSync||i?.lastSyncAt||i?.updatedAt||"-"}});hasMonitorAccount=O(()=>!!this.monitorAccountMeta().profileId);summary=O(()=>{let t=this.activeRecommendations();return{total:t.length,keyword:t.filter(e=>e.recommendationType==="keyword_exact_create").length,product:t.filter(e=>e.recommendationType==="product_target_create").length,negatives:t.filter(e=>e.sourceNegativeEnabled).reduce((e,i)=>e+Math.max(1,i.sourceBreakdowns?.length||1),0),sales:t.reduce((e,i)=>e+i.metrics.sales,0),ready:t.filter(e=>e.status==="approved").length,review:t.filter(e=>e.risk!=="low"||e.confidence<75).length,missing:this.campaignLinks().filter(e=>e.status==="missing_destination"||e.status==="ambiguous_match").length}});visibleRecommendationSummaryCards=O(()=>{let t=this.summary(),e=[{label:"Total Opportunities",value:t.total,display:t.total.toLocaleString()},{label:"Keyword Targets to Create",value:t.keyword,display:t.keyword.toLocaleString()},{label:"Product Targets to Create",value:t.product,display:t.product.toLocaleString()},{label:"Source Negatives to Add",value:t.negatives,display:t.negatives.toLocaleString()},{label:"Estimated Sales Captured",value:t.sales,display:this.money(t.sales)},{label:"Ready for Export",value:t.ready,display:t.ready.toLocaleString()},{label:"Needs Review",value:t.review,display:t.review.toLocaleString()},{label:"Missing Links",value:t.missing,display:t.missing.toLocaleString()}];return this.debugMode.enabled()?e:e.filter(i=>i.value>0)});linkSummary=O(()=>{let t=this.campaignLinks();return{keyword:t.filter(e=>e.linkType==="keyword"&&(e.status==="linked"||e.status==="manual_override")).length,product:t.filter(e=>e.linkType==="product_target"&&(e.status==="linked"||e.status==="manual_override")).length,missing:t.filter(e=>e.status==="missing_destination").length,manual:t.filter(e=>e.manualOverride).length,unlinked:this.unlinkedCampaigns().length,issues:t.filter(e=>e.status==="ambiguous_match").length}});visibleLinkSummaryCards=O(()=>{let t=this.linkSummary(),e=[{label:"Keyword Links",value:t.keyword},{label:"Product Target Links",value:t.product},{label:"Missing Destinations",value:t.missing},{label:"Manual Overrides",value:t.manual},{label:"Unlinked Campaigns",value:t.unlinked},{label:"Confidence Issues",value:t.issues}];return this.debugMode.enabled()?e:e.filter(i=>i.value>0)});activeCampaigns=O(()=>this.campaigns().filter(t=>t.adProduct!=="SD"&&t.state!=="paused"&&t.state!=="archived"));constructor(){Ne(t=>{let e=this.message();if(!e)return;let i=window.setTimeout(()=>{this.message()===e&&this.message.set(null)},5e3);t(()=>window.clearTimeout(i))})}fromCampaigns=O(()=>this.filterCampaigns(this.activeCampaigns(),this.manualFromFilter()));toCampaigns=O(()=>this.filterCampaigns(this.activeCampaigns(),this.manualToFilter()));autoLinkGroups=O(()=>{let t=new Map;for(let e of this.campaignLinks().filter(i=>!i.manualOverride)){let i=e.matchingTitle||this.linking.extractMatchingTitle(e.sourceCampaignName||e.destinationCampaignName||"");t.has(i)||t.set(i,{matchingTitle:i,discoveryLinks:[],keywordLinks:[],productLinks:[],isolationCampaigns:[]});let n=t.get(i);
6if(n.discoveryLinks.push(e),e.linkType==="keyword"&&n.keywordLinks.push(e),e.linkType==="product_target"&&n.productLinks.push(e),e.destinationCampaignName){let r=`${e.destinationCampaignId||e.destinationCampaignName}::${e.linkType}`;n.isolationCampaigns.some(m=>`${m.campaignId||m.campaignName}::${m.role}`===r)||n.isolationCampaigns.push({campaignId:e.destinationCampaignId,campaignName:e.destinationCampaignName,role:e.destinationRole,status:e.status,confidence:e.confidence})}}return[...t.values()].sort((e,i)=>e.matchingTitle.localeCompare(i.matchingTitle))});campaignLinkEntries=O(()=>vt(this.campaignLinks(),this.campaigns()));detectedCampaignLinksForSetup=O(()=>this.campaignLinks().filter(t=>!t.manualOverride&&(t.status==="linked"||t.status==="ignored")&&!!t.destinationCampaignId).sort((t,e)=>String(t.destinationCampaignName||"").localeCompare(String(e.destinationCampaignName||""))||String(t.sourceCampaignName||"").localeCompare(String(e.sourceCampaignName||""))||t.linkType.localeCompare(e.linkType)));missingDestinationLinks=O(()=>this.campaignLinks().filter(t=>!t.manualOverride&&t.status==="missing_destination"));unlinkedCampaigns=O(()=>{let t=new Set;for(let e of this.campaignLinks().filter(i=>["linked","manual_override"].includes(i.status)))e.sourceCampaignId&&t.add(e.sourceCampaignId),e.destinationCampaignId&&t.add(e.destinationCampaignId);return this.activeCampaigns().filter(e=>e.linkedStatus!=="ignored"&&!t.has(e.campaignId))});lastDownloadedDate=S("");lastLoadedProfile="";lastLoadedRange="";lastWorkspaceHydrationKey="";setupRequests=new Q;connectionRequests=new Q;syncedProfileRequests=new Q;profileRequests=new Q;campaignRequests=new Q;searchTermRequests=new Q;recommendationReadyRequests=new Q;savedRuleRequests=new Q;recommendationCacheRequests=new Q;portableStateRequests=new Q;bidPreview=O(()=>{let t={adProduct:"SP",campaignName:"Broad - Discovery - Pickleball Paddle",adGroupName:"Default",searchTerm:"carbon fiber pickleball paddle",searchTermType:"query",impressions:1200,clicks:24,spend:36,orders:3,sales:120,ctr:.02,cpc:1.5,cvr:.125,acos:.3};return this.isolation.calculateSuggestedBid(t,this.rule().bidStrategy)});async ngOnInit(){try{if(this.vm){this.syncWorkspaceActiveAccount(!1),await this.loadSetup(),this.applySearchIntelligenceHandoff(),await this.bootstrapFromAmazonWorkspace();return}await this.loadSetup(),this.applySearchIntelligenceHandoff(),await this.loadAmazonConnections(),this.selectedConnectionId()&&this.selectedProfileId()&&await this.loadApiCampaignData(!0)}finally{this.isLoadingCampaignLinks.set(!1)}}async bootstrapFromAmazonWorkspace(t=!1){let e=this.syncWorkspaceActiveAccount(),i=this.currentAccountContextKey(),n=this.campaignRequests.begin(i),r=()=>this.campaignRequests.isCurrent(n,this.currentAccountContextKey()),m=this.syncedProfiles();if(!e)return r()&&(m.length?this.message.set("Select a Monitor Account from the top-right account selector."):this.message.set("No synced Amazon Ads accounts found. Add Formline or OC Product in Sync Center first.")),!1;let u=this.currentAccountId(),p=this.workspaceCampaignSnapshot(),g=this.workspaceMonitorCache(),y=this.workspaceHydrationKey(e,p,g);if(!t&&this.campaigns().length&&this.lastWorkspaceHydrationKey===y)return r()?(this.autoLoadSearchTerms(!1),!0):!1;if((!p||!this.snapshotHasTargetingDetails(p)||t)&&this.vm?.loadCampaignManagerRange){try{await this.vm.loadCampaignManagerRange()}catch(f){if(r())throw f;return!1}if(!r())return!1;p=this.workspaceCampaignSnapshot()}if(!p&&(!g||t)&&this.vm?.loadMonitorSnapshot){try{await this.vm.loadMonitorSnapshot(t)}catch(f){if(r())throw f;return!1}if(!r())return!1;p=this.workspaceCampaignSnapshot(),g=this.workspaceMonitorCache()}if(!p&&g&&(p=P(I({},g),{campaignManager:g.campaignManagerCampaignRows||[]})),p){let f;try{f=await this.ensureWorkspaceAdGroupDetails(this.linking.buildCampaignSummariesFromSnapshot(u,p))}catch(x){if(r())throw x;return!1}return r()?(this.campaigns.set(this.applySearchTermCounts(f)),this.lastWorkspaceHydrationKey=this.workspaceHydrationKey(e,p,this.workspaceMonitorCache()),this.refreshLinks(),t||this.message.set(`Loaded ${this.campaigns().length} campaign(s) from the active Amazon Ads workspace campaign data.`),this.autoLoadSearchTerms(t),!0):!1}return r()&&(m.length?this.message.set("No cached campaign snapshot found for this Monitor Account yet. Use Refresh Campaign Links after the Monitor cache loads."):this.message.set("No synced Amazon Ads accounts found. Add Formline or OC Product in Sync Center first.")),!1}async autoLoadSearchTerms(t=!1){let e=this.getActiveAccountContext();if(!e?.orgId||!e.profileId)return;let{orgId:i,profileId:n}=e,r=this.selectedDateRange(),m=this.currentSearchTermContextKey(r);if(!t&&this.uploadedRows().length&&this.lastLoadedProfile===n&&this.lastLoadedRange===m)return;let u=this.searchTermRequests.begin(m),p=()=>this.searchTermRequests.isCurrent(u,this.currentSearchTermContextKey());if(this.error.set(null),this.vm?.searchTermReportRows()?.length)try{let g=this.vm.searchTermReportRows(),y=this.importMapper.normalizeColumns(g.map(x=>P(I({},x),{orgId:i,accountId:n,profileId:n}
6))),f=this.importMapper.aggregateSearchTermMetrics(y);if(f.length&&p()){this.uploadedRows.set(f),this.rawUploadName.set(`Workspace Search Terms (${f.length.toLocaleString()} row(s))`),this.lastLoadedProfile=n,this.lastLoadedRange=m,this.campaigns.set(this.applySearchTermCounts(this.campaigns())),this.refreshLinks(),this.generateAndStoreRecommendations(f);return}}catch(g){p()&&console.warn("Could not load search terms from parent workspace:",g)}if(p()){this.isLoadingApi.set(!0);try{let g=await this.amazonApi.getHistoricalSearchTerms(i,n,r.startDate,r.endDate);if(!p())return;let y=g?.rows||[];if(y.length){let f=this.importMapper.normalizeColumns(y.map(R=>P(I({},R),{orgId:i,accountId:n,profileId:n}))),x=this.importMapper.aggregateSearchTermMetrics(f);this.uploadedRows.set(x),this.rawUploadName.set(`Historical Database Search Terms (${x.length.toLocaleString()} row(s))`),this.lastLoadedProfile=n,this.lastLoadedRange=m,this.campaigns.set(this.applySearchTermCounts(this.campaigns())),this.refreshLinks(),this.generateAndStoreRecommendations(x)}}catch(g){p()&&console.warn("Could not auto-load historical search terms:",g)}finally{this.searchTermRequests.isLatest(u)&&this.isLoadingApi.set(!1)}}}recommendationFilterValue(t,e){switch(e){case"select":return t.id;case"term":return t.searchTerm;case"sourceCampaign":return t.sourceCampaignName;case"sourceAdGroup":return t.sourceAdGroupName;case"sourceTarget":return t.sourceTargetText;case"destinationCampaign":return t.destinationCampaignName;case"destinationAdGroup":return t.destinationAdGroupName;case"orders":return t.metrics.orders;case"sales":return t.metrics.sales;case"spend":return t.metrics.spend;case"acos":return t.metrics.acos;case"clicks":return t.metrics.clicks;case"ctr":return t.metrics.ctr;case"cpc":return t.metrics.cpc;case"cvr":return t.metrics.cvr;case"avgCpc":return t.bid.avgCpc;case"suggestedBid":return t.bid.suggestedBid;case"sourceNegative":return t.sourceNegativeEnabled?"yes":"no";case"rule":return t.rule?.ruleName;case"confidence":return t.confidence;case"status":return t.status;case"actions":return""}}recommendationFilterSuggestionValue(t,e){return this.recommendationFilterValue(t,e)}exportBatchFilterValue(t,e){switch(e){case"filename":return t.filename;case"type":return t.fileType||(t.filename.endsWith(".csv")?"csv":"xlsx");case"mode":return t.mode;case"rows":return t.rowCount;case"recommendations":return t.recommendationIds.length;case"exported":return t.exportedAt;case"status":return t.status;case"issues":return t.validationIssues?.length||0}}exportBatchFilterSuggestionValue(t,e){return this.exportBatchFilterValue(t,e)}exportLineFilterValue(t,e){switch(e){case"exported":return t.exportedAt;case"row":return t.spreadsheetRowNumber;case"term":return t.searchTerm;case"action":return[t.actionLabel,t.actionType,t.status];case"details":return t.detail;case"campaign":return[t.campaignName,t.adGroupName,t.sourceCampaignName,t.sourceAdGroupName,t.destinationCampaignName,t.destinationAdGroupName];case"file":return t.filename}}exportLineFilterSuggestionValue(t,e){return e==="action"?t.actionLabel:this.exportLineFilterValue(t,e)}setTab(t){this.activeTab.set(t),t==="recommendations"&&this.ensureRecommendationsReady()}clearSearchIntelligenceHandoff(){this.recommendationSearch.set(""),this.handoffFocus.set(""),this.handoffKind.set("")}isHandoffMatch(t){let e=this.handoffFocus().trim().toLowerCase(),i=String(t.searchTerm||"").trim().toLowerCase();return!e||!i?!1:this.handoffKind()==="term"?i===e:i.includes(e)}applySearchIntelligenceHandoff(){let t=this.route.snapshot.queryParamMap;if(String(t.get("from")||"").trim().toLowerCase()!=="search-intelligence")return!1;let e=String(t.get("searchTerm")||"").trim(),i=String(t.get("pattern")||"").trim(),n=e||i,r=String(t.get("startDate")||"").trim(),m=String(t.get("endDate")||"").trim();return this.activeTab.set("recommendations"),this.handoffFocus.set(n),this.handoffKind.set(e?"term":i?"pattern":""),this.recommendationSearch.set(n),this.isIsoDate(r)&&this.isIsoDate(m)&&r<=m&&(this.handoffStartDate.set(r),this.handoffEndDate.set(m),this.rule.update(u=>P(I({},u),{lookbackType:"custom_date_range",startDate:r,endDate:m}))),!0}isIsoDate(t){return/^\d{4}-\d{2}-\d{2}$/.test(t)&&Number.isFinite(Date.parse(t+"T00:00:00Z"))}async loadSetup(){let t=this.currentOrgId(),e=this.currentAccountId(),i=this.currentAccountContextKey(),n=this.setupRequests.begin(i),r=()=>this.setupRequests.isCurrent(n,this.currentAccountContextKey()),m=await this.isolation.loadSetup(e,t);r()&&(this.rule.set(P(I({},m),{accountId:e,orgId:t}
6)),await this.loadPortableWorkspaceState(),r()&&(this.lastDownloadedDate.set(localStorage.getItem(`ii_last_downloaded_${e}`)||""),await this.loadRecommendationCache()))}async saveSetup(){await this.isolation.saveRule(P(I({},this.rule()),{accountId:this.currentAccountId(),orgId:this.currentOrgId()}),this.currentOrgId()),this.saveManualLinks(),this.message.set("Isolation setup saved.")}resetDefaultRule(){this.rule.set(te(this.currentOrgId(),this.currentAccountId())),this.message.set("Default 30-day, 2-sales isolation rule restored.")}resetDefaultRuleObject(){return te(this.currentOrgId(),this.currentAccountId())}async loadAmazonConnections(){let t=this.currentOrgId();if(!t)return;let e=this.connectionRequests.begin(t),i=()=>this.connectionRequests.isCurrent(e,this.currentOrgId());try{let n=await this.amazonApi.listConnections(t);if(!i()||(this.connections.set(n.connections||[]),await this.loadSyncedWorkspaceProfiles(),!i()))return;let r=this.readActiveAccountSelection(),u=(r?this.syncedProfiles().find(p=>p.connectionId===r.connectionId&&p.profileId===r.profileId):null)||this.syncedProfiles()[0];u?this.selectWorkspaceProfile(u,!1):n.connections?.length&&!this.selectedConnectionId()&&(this.selectedConnectionId.set(n.connections[0].connectionId),await this.loadProfilesForConnection())}catch(n){i()&&this.error.set(n?.message||"Could not load Amazon Ads connections.")}}async loadSyncedWorkspaceProfiles(){let t=this.currentOrgId();if(!t)return;let e=this.syncedProfileRequests.begin(t),i=()=>this.syncedProfileRequests.isCurrent(e,this.currentOrgId()),n=[],r=[],m=[...this.connections()];for(let u of m){if(!i())return;let p=[];try{let g=await this.amazonApi.getCachedProfiles(u.connectionId,t);if(!i())return;p=g.profiles||[],r.push(...p)}catch{p=[]}try{let g=(await this.amazonApi.getMonitorSyncSettings(u.connectionId,t)).settings||null;if(!i())return;let y=Array.isArray(g?.selectedProfiles)?g.selectedProfiles:[],f=new Map(p.map(x=>[String(x.profileId),x]));for(let x of y){let R=f.get(String(x.profileId));n.push({connectionId:u.connectionId,connectionLabel:u.connectionLabel,amazonEmail:u.amazonEmail,region:u.region,profileId:String(x.profileId),accountName:R?.accountName||x.accountName||`Profile ${x.profileId}`,countryCode:R?.countryCode||x.countryCode||"",timezone:R?.timezone||x.timezone||"",accessMode:x.accessMode||"read_only"})}}catch{}}i()&&(this.profiles.set(r),this.syncedProfiles.set(n.sort((u,p)=>u.accountName.localeCompare(p.accountName))))}async loadProfilesForConnection(){let t=this.currentOrgId(),e=this.selectedConnectionId();if(!t||!e)return;let i=`${t}::${e}`,n=this.profileRequests.begin(i),r=()=>this.profileRequests.isCurrent(n,`${this.currentOrgId()}::${this.selectedConnectionId()}`);try{let m=await this.amazonApi.getCachedProfiles(e,t);if(!r())return;this.profiles.set(m.profiles||[]);let u=m.profiles?.[0];if(u&&!this.selectedProfileId()){let p=this.currentAccountContextKey();this.selectedProfileId.set(String(u.profileId)),this.selectedAccountName.set(u.accountName||"selected-account"),p!==this.currentAccountContextKey()&&this.invalidateAccountScopedRequests()}}catch(m){r()&&this.error.set(m?.message||"Could not load Amazon Ads profiles.")}}async loadApiCampaignData(t=!1){if(this.isLoadingCampaignLinks.set(!0),this.vm){let p=this.currentAccountContextKey();this.isLoadingApi.set(!0),this.error.set(null);try{await this.bootstrapFromAmazonWorkspace(!0)&&p===this.currentAccountContextKey()&&!t&&this.message.set(`Refreshed ${this.activeCampaigns().length} active campaign(s) from the selected Amazon Ads workspace account.`)}catch(g){p===this.currentAccountContextKey()&&this.error.set(g?.message||"Could not refresh campaign links.")}finally{p===this.currentAccountContextKey()&&(this.isLoadingApi.set(!1),this.isLoadingCampaignLinks.set(!1))}return}let e=this.currentOrgId(),i=this.selectedConnectionId(),n=this.selectedProfileId();if(!e||!i||!n){this.error.set("Select an Amazon Ads connection and profile first."),this.isLoadingCampaignLinks.set(!1);return}let r=`${e}::${i}::${n}`,m=this.campaignRequests.begin(r),u=()=>this.campaignRequests.isCurrent(m,this.currentAccountContextKey());this.isLoadingApi.set(!0),this.error.set(null);try{let p=await this.linking.loadCampaignsFromApi(n,{orgId:e,connectionId:i,profileId:n}
6);if(!u())return;this.campaigns.set(this.applySearchTermCounts(p)),this.refreshLinks(),t||this.message.set(`Loaded ${p.length} campaign(s) from cached Amazon Ads API data.`),this.autoLoadSearchTerms()}catch(p){u()&&this.error.set(p?.message||"Could not load API campaign data.")}finally{this.campaignRequests.isLatest(m)&&(this.isLoadingApi.set(!1),this.isLoadingCampaignLinks.set(!1))}}async loadHistoricalSearchTerms(t=!1){let e=this.getActiveAccountContext();if(!e?.orgId||!e.profileId){this.searchTermRequests.invalidate(),this.isLoadingApi.set(!1),this.error.set("Select an Amazon Ads profile first.");return}let{orgId:i,profileId:n}=e,r=this.selectedDateRange(),m=this.currentSearchTermContextKey(r),u=this.searchTermRequests.begin(m),p=()=>this.searchTermRequests.isCurrent(u,this.currentSearchTermContextKey());this.isLoadingApi.set(!0),this.error.set(null);try{let g=await this.amazonApi.getHistoricalSearchTerms(i,n,r.startDate,r.endDate);if(!p())return;let y=this.importMapper.normalizeColumns((g.rows||[]).map(x=>P(I({},x),{orgId:i,accountId:n,profileId:n}))),f=this.importMapper.aggregateSearchTermMetrics(y);if(this.uploadedRows.set(f),this.rawUploadName.set(`API search terms ${r.startDate} to ${r.endDate}`),this.lastLoadedProfile=n,this.lastLoadedRange=m,this.campaigns.set(this.applySearchTermCounts(this.campaigns())),this.refreshLinks(),!f.length){this.setRecommendations([]),this.lastScanDate.set(null),this.persistRecommendationCache(),this.message.set(`No saved search terms found for ${r.startDate} to ${r.endDate}.`);return}this.runScan(t)}catch(g){p()&&this.error.set(g?.message||"Could not load historical search terms.")}finally{this.searchTermRequests.isLatest(u)&&this.isLoadingApi.set(!1)}}async onFileSelected(t){let e=t.target,i=e.files?.[0];if(!i)return;let n=this.currentAccountContextKey(),r=this.searchTermRequests.begin(n),m=()=>this.searchTermRequests.isCurrent(r,this.currentAccountContextKey()),u=await i.arrayBuffer();if(!m())return;let p=lt(u,{type:"array"}),g=[];for(let f of p.SheetNames){let x=p.Sheets[f];g.push(...oe.sheet_to_json(x,{defval:""}))}if(!m())return;let y=this.importMapper.aggregateSearchTermMetrics(this.importMapper.normalizeColumns(g));this.rawUploadName.set(i.name),this.uploadedRows.set(y),this.campaigns.set(this.mergeCampaignsFromRows(this.applySearchTermCounts(this.campaigns()),y)),this.refreshLinks(),this.message.set(`Uploaded ${y.length.toLocaleString()} usable Sponsored Products / Sponsored Brands search-term row(s). Sponsored Display rows were excluded.`),e.value="",this.runScan()}runScan(t=!1){let e=this.uploadedRows();if(!e.length){this.error.set("Upload an Excel/bulk file or load saved search terms before scanning.");return}this.isScanning.set(!0);let i=this.generateAndStoreRecommendations(e);this.isScanning.set(!1),this.message.set(`Scan complete. Found ${i.length} isolation opportunit${i.length===1?"y":"ies"}.`),t||this.activeTab.set("recommendations")}async refreshRecommendations(){await this.ensureRecommendationsReady(!0)}async ensureRecommendationsReady(t=!1){if(this.isLoadingApi()||this.isScanning())return;let e=this.currentAccountContextKey(),i=this.recommendationReadyRequests.begin(e),n=()=>this.recommendationReadyRequests.isCurrent(i,this.currentAccountContextKey());if(!(!t&&this.recommendations().length)){if(!t){let r=await this.loadRecommendationCache();if(!n())return;if(r&&this.recommendations().length){this.message.set(`Showing ${this.recommendations().length.toLocaleString()} recommendation(s) from the previous scan.`);return}}if(n()){if(this.uploadedRows().length){this.runScan(!0);return}await this.loadHistoricalSearchTerms(!0)}}}refreshLinks(){let t=this.campaigns(),e=new Set(this.activeCampaigns().map(g=>g.campaignId)),i=this.manualLinks().filter(g=>e.has(g.fromCampaignId)&&e.has(g.toCampaignId)),n=this.linking.suggestCampaignLinks(this.activeCampaigns(),i),r=new Set(n.filter(g=>["linked","manual_override"].includes(g.status)).map(g=>g.sourceCampaignId)),m=new Set(n.filter(g=>["linked","manual_override"].includes(g.status)).map(g=>g.destinationCampaignId)),u=new Set;for(let g of n.filter(y=>y.status==="manual_override"))g.sourceCampaignId&&u.add(g.sourceCampaignId),g.destinationCampaignId&&u.add(g.destinationCampaignId);let p=new Set(n.filter(g=>g.status==="missing_destination").map(g=>g.sourceCampaignId));this.campaignLinks.set(n),this.campaigns.set(t.map(g=>P(I({},g),{linkedStatus:r.has(g.campaignId)||m.has(g.campaignId)?u.has(g.campaignId)?"manual_override":"linked":p.has(g.campaignId)?"missing_destination":g.linkedStatus==="ignored"?"ignored":"unlinked",linkedToCampaignId:n.find(y=>y.sourceCampaignId===g.campaignId&&y.destinationCampaignId)?.destinationCampaignId,linkedToCampaignName:n.find(y=>y.sourceCampaignId===g.campaignId&&y.destinationCampaignName)?.destinationCampaignName})))}createManualLink(){let t=[...this.selectedFromCampaignIds()],e=this.selectedToCampaignId();if(!t.length||!e){this.message.set("Select at least one FROM campaign and one TO campaign first.");return}let i=t.map(n=>{let r=this.linking.createManualCampaignLink(n,e,this.manualLinkType(),this.campaigns(),this.currentAccountId(),this.currentOrgId());return r.sourceNegativeDefault=this.rule().addNegativeToSource,r.destinationAdGroupBehavior=this.manualAdGroupBehavior(),r});this.manualLinks.update(n=>[...n.filter(r=>
6!t.includes(r.fromCampaignId)),...i]),this.saveManualLinks(),this.refreshLinks(),this.selectedFromCampaignIds.set(new Set),this.selectedToCampaignId.set(""),this.message.set(`Manual campaign link${i.length===1?"":"s"} saved and applied to future scans.`)}ignoreCampaign(t){this.campaigns.set(this.linking.ignoreCampaignForIsolation(t,this.campaigns())),this.refreshLinks()}toggleIsolationExpand(t){this.expandedIsolationKey.set(this.expandedIsolationKey()===t?"":t)}removeAutoLink(t,e){t&&(this.campaignLinks.update(i=>i.map(n=>n.sourceCampaignId===t&&n.linkType===e&&!n.manualOverride?P(I({},n),{status:"ignored"}):n)),this.message.set("Auto-detected link removed. Use Refresh Campaign Links to restore."))}restoreAutoLink(t,e){t&&(this.campaignLinks.update(i=>i.map(n=>n.sourceCampaignId===t&&n.linkType===e&&n.status==="ignored"?P(I({},n),{status:"linked"}):n)),this.message.set("Auto-detected link restored."))}deleteManualLink(t){this.manualLinks.update(e=>this.linking.deleteManualCampaignLink(t,e)),this.saveManualLinks(),this.refreshLinks(),this.message.set("Manual link deleted.")}removeManualLinkByFromAndType(t,e){let i=e==="product_target",n=this.manualLinks().find(r=>r.fromCampaignId===t&&(r.linkType==="both"||i&&r.linkType==="product_target_isolation"||!i&&r.linkType==="keyword_isolation"));n?this.deleteManualLink(n.id):this.message.set("Could not find manual link to delete.")}selectAsFrom(t){this.toggleFromCampaign(t.campaignId),this.activeTab.set("setup")}selectAsTo(t){this.toggleToCampaign(t.campaignId),this.activeTab.set("setup")}linkMissingAsFrom(t){t&&this.selectedFromCampaignIds.update(e=>{let i=new Set(e);return i.add(t),i}),this.activeTab.set("setup")}isAllCampaignLinksSelected=O(()=>{let t=this.campaignLinkEntries();return t.length?t.every(e=>this.selectedLinkKeys().has(e.key)):!1});toggleSelectAllCampaignLinks(t){let e=t.target.checked,i=this.campaignLinkEntries().map(n=>n.key);this.selectedLinkKeys.update(n=>{let r=new Set(n);for(let m of i)e?r.add(m):r.delete(m);return r})}toggleLinkSelection(t){this.selectedLinkKeys.update(e=>{let i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i})}selectAllLinks(){this.selectedLinkKeys.set(new Set(this.campaignLinkEntries().map(t=>t.key)))}campaignLinkPanelId(t){return"ii-campaign-link-"+t.replace(/[^a-zA-Z0-9_-]/g,"-")}setupSourceLabel(t){return t==="mixed"?"Detected + manual":t==="manual"?"Manual":"Detected"}campaignLinkTypeLabel(t){return t.map(e=>e==="keyword"?"Keyword isolation":"Product target isolation").join(" + ")}campaignLinkRuleLabel(t){let e=t.map(r=>this.getLinkActiveRule(r)).filter(r=>!!r);if(!e.length)return"Rule: "+this.rule().name+" (profile default)";let i=new Set(e.map(r=>r.rule.id));if(e.length===t.length&&i.size===1)return"Rule: "+e[0].rule.name+" "+this.getRuleSummary(e[0].rule);let n=t.length-e.length;return"Rules: "+e.length+" custom"+(n?" / "+n+" profile default":" across isolation types")}campaignLinkUsesOnlyDefaultRule(t){return!t.some(e=>this.getLinkActiveRule(e))}deselectAllLinks(){this.selectedLinkKeys.set(new Set)}isLinkSelected(t){return this.selectedLinkKeys().has(t)}openRuleModal(){if(!this.selectedLinkKeys().size){this.message.set("Select at least one campaign link first, then assign a rule.");return}this.editingRule.set(I({},this.rule())),this.ruleModalTab.set("presets"),this.ruleModalOpen.set(!0)}closeRuleModal(){this.ruleModalOpen.set(!1)}async loadSavedRules(){let t=this.currentOrgId(),e=this.currentAccountId(),i=this.currentAccountContextKey(),n=this.savedRuleRequests.begin(i),r=await this.isolation.loadSavedRules(t,e);this.savedRuleRequests.isCurrent(n,this.currentAccountContextKey())&&(this.savedRules.set(r),this.rulesTabEditingId()||this.startCreateRule(!1))}persistSavedRules(){this.isolation.saveSavedRules(this.currentOrgId(),this.currentAccountId(),this.savedRules())}saveCurrentRuleAsPreset(){let t=this.editingRule(),e=this.savedRules().find(r=>r.id===t.id),i=t.id==="default-search-term-isolation",n=P(I({},t),{id:e&&!i?t.id:`preset-${Date.now()}`,orgId:this.currentOrgId(),accountId:this.currentAccountId(),name:t.name||"Custom Rule",createdAt:e&&!i?e.createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()});this.savedRules.update(r=>e&&!i?r.map(m=>m.id===n.id?n:m):[...r,n]),this.persistSavedRules(),this.message.set(`Rule "${n.name}" saved for future use.`)}deleteSavedRule(t){this.savedRules.update(e=>e.filter(i=>i.id!==t)),this.persistSavedRules(),this.rulesTabEditingId()===t&&this.startCreateRule(!1),this.message.set("Saved rule deleted.")}selectPresetRule(t){this.editingRule.set(I({},t)),this.ruleModalTab.set("create")}patchEditingRule(t){this.editingRule.update(e=>I(I({},e),t))}patchEditingBidStrategy(t){this.editingRule.update(e=>P(I({},e),{bidStrategy:I(I({},e.bidStrategy),t)}
6))}updateEditingExcludePhrases(t){let e=t.split(`
7`).map(i=>i.trim()).filter(Boolean);this.patchEditingRule({excludePhrases:e})}updateEditingIncludePhrases(t){let e=t.split(`
8`).map(i=>i.trim()).filter(Boolean);this.patchEditingRule({includePhrases:e})}startCreateRule(t=!0){let e=te(this.currentOrgId(),this.currentAccountId());this.rulesTabDraft.set(P(I({},e),{id:`saved-rule-${Date.now()}`,name:"New Isolation Rule",createdAt:G(),updatedAt:G()})),this.rulesTabEditingId.set(null),t&&this.message.set("Started a new reusable isolation rule.")}editSavedRule(t){this.rulesTabDraft.set(P(I({},t),{bidStrategy:I({},t.bidStrategy)})),this.rulesTabEditingId.set(t.id)}duplicateSavedRule(t){let e=G(),i=P(I({},t),{id:`saved-rule-${Date.now()}`,orgId:this.currentOrgId(),accountId:this.currentAccountId(),name:`${t.name} Copy`,bidStrategy:I({},t.bidStrategy),createdAt:e,updatedAt:e});this.savedRules.update(n=>[i,...n]),this.persistSavedRules(),this.editSavedRule(i),this.message.set(`Duplicated "${t.name}".`)}saveRulesTabDraft(){let t=this.rulesTabDraft(),e=String(t.name||"").trim();if(!e){this.message.set("Name the rule before saving it.");return}let i=G(),n=P(I({},t),{id:this.rulesTabEditingId()||t.id||`saved-rule-${Date.now()}`,orgId:this.currentOrgId(),accountId:this.currentAccountId(),name:e,includePhrases:this.cleanRuleList(t.includePhrases),excludePhrases:this.cleanRuleList(t.excludePhrases),bidStrategy:I({},t.bidStrategy),createdAt:this.rulesTabEditingId()?this.savedRules().find(r=>r.id===this.rulesTabEditingId())?.createdAt||t.createdAt||i:t.createdAt||i,updatedAt:i});this.savedRules.update(r=>r.some(u=>u.id===n.id)?r.map(u=>u.id===n.id?n:u):[n,...r]),this.rulesTabDraft.set(n),this.rulesTabEditingId.set(n.id),this.persistSavedRules(),this.message.set(`Saved reusable rule "${n.name}".`)}async useDraftAsDefaultRule(){let t=this.rulesTabDraft();this.rule.set(P(I({},t),{id:t.id||"default-search-term-isolation",orgId:this.currentOrgId(),accountId:this.currentAccountId(),includePhrases:this.cleanRuleList(t.includePhrases),excludePhrases:this.cleanRuleList(t.excludePhrases),bidStrategy:I({},t.bidStrategy),updatedAt:G()})),await this.saveSetup(),this.message.set(`"${t.name}" is now the profile fallback rule.`)}loadDefaultRuleIntoDraft(){let t=this.rule();this.rulesTabDraft.set(P(I({},t),{id:`saved-rule-${Date.now()}`,name:`${t.name||"Profile Default"} Copy`,bidStrategy:I({},t.bidStrategy),createdAt:G(),updatedAt:G()})),this.rulesTabEditingId.set(null)}patchRulesTabDraft(t){this.rulesTabDraft.update(e=>P(I(I({},e),t),{updatedAt:G()}))}patchRulesTabBidStrategy(t){this.rulesTabDraft.update(e=>P(I({},e),{bidStrategy:I(I({},e.bidStrategy),t),updatedAt:G()}))}updateRulesTabExcludePhrases(t){this.patchRulesTabDraft({excludePhrases:this.list(t)})}updateRulesTabIncludePhrases(t){this.patchRulesTabDraft({includePhrases:this.list(t)})}savedRuleUsageCount(t){return this.activeRules().filter(e=>e.rule.id===t).length}ruleBidLabel(t){return t.bidStrategy.type==="fixed"?`Fixed $${Number(t.bidStrategy.fixedBid||t.bidStrategy.fallbackBid||0).toFixed(2)}`:t.bidStrategy.type==="avg_cpc_multiplier"?`Avg CPC x ${Number(t.bidStrategy.multiplier||1).toFixed(2)}`:"Avg CPC"}applyRuleToSelectedLinks(){let t=this.editingRule(),e=this.editingRuleDescription(),i=[...this.selectedLinkKeys()],n=this.campaignLinkEntries(),r=[...this.activeRules()];for(let m of i){let u=n.find(p=>p.key===m);if(u)for(let p of u.linkKeys){let g=r.findIndex(x=>x.toCampaignId===u.campaignId&&x.campaignLinkId===p),y=new Date().toISOString(),f={id:g>=0?r[g].id:this.createLocalId("ar"),orgId:this.currentOrgId(),accountId:this.currentAccountId(),campaignLinkId:p,toCampaignId:u.campaignId,toCampaignName:u.campaignName,rule:I({},t),description:e||"Rule: "+t.name,enabled:!0,createdAt:g>=0?r[g].createdAt:y,updatedAt:y};g>=0?r[g]=f:r.push(f)}}this.activeRules.set(r),this.saveActiveRules(),this.rule.set(t),this.isolation.saveRule(P(I({},t),{orgId:this.currentOrgId(),accountId:this.currentAccountId()}),this.currentOrgId()),this.closeRuleModal(),this.runScan(!0),this.message.set(`Rule "${t.name}" applied to ${i.length} linked campaign(s). Check the Active Rules or Recommendations tab.`),this.selectedLinkKeys.set(new Set),this.editingRuleDescription.set("")}updateActiveRuleDescription(t,e){let n=e.target.value;this.activeRules.update(r=>r.map(m=>m.id===t?P(I({},m),{description:n,updatedAt:new Date().toISOString()}):m)),this.saveActiveRules(),this.message.set("Active rule description updated.")}toggleActiveRuleEnabled(t){this.activeRules.update(i=>i.map(n=>n.id===t?P(I({},n),{enabled:!n.enabled,updatedAt:new Date().toISOString()}):n)),this.saveActiveRules(),this.runScan();let e=this.activeRules().find(i=>i.id===t);this.message.set(`Active rule is now ${e?.enabled?"enabled":"paused"}. Recommendations re-scanned.`)}deleteActiveRule(t){this.activeRules.update(e=>e.filter(i=>i.id!==t)),this.saveActiveRules(),this.runScan(),this.message.set("Active rule deleted. Campaign link reverted to profile default settings.")}approve(t){this.setRecommendations(this.isolation.approveRecommendation(t.id,this.recommendations()))}implement(t){this.approve(t),this.message.set(`${t.searchTerm} approved and ready for bulk export.`)}protect(t){t.searchTermType==="asin"?this.protectedAsins.set(this.appendListValue(this.protectedAsins(),t.searchTerm)):this.protectedPhrases.set(this.appendListValue(this.protectedPhrases(),t.searchTerm)),this.setRecommendations(this.isolation.protectRecommendation(t.id,this.recommendations()))}openRejectDialog(t){this.rejectTarget.set(t),this.rejectReason.set(Ae[0]),this.rejectDialogOpen.set(!0)}confirmReject(){let t=this.rejectTarget();t&&(this.setRecommendations(this.isolation.rejectRecommendation(t.id,this.rejectReason(),this.recommendations())),this.rejectDialogOpen.set(!1))}toggleSourceNegative(t){this.setRecommendations(this.isolation.toggleSourceNegative(t.id,!t.sourceNegativeEnabled,this.recommendations()))}toggleSelect(t){this.selectedRecommendationIds.update(e=>{let i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i})}selectAll(t){let e=t.every(i=>this.selectedRecommendationIds().has(i.id));this.selectedRecommendationIds.update(i=>{let n=new Set(i);return t.forEach(r=>e?n.delete(r.id):n.add(r.id)),n})}isSelected(t){return this.selectedRecommendationIds().has(t)}approveSelected(){let t=this.selectedRecommendationIds();this.recommendations.update(e=>e.map(i=>t.has(i.id)?P(I({},i),{status:"approved",updatedAt:G()}):i)),this.selectedRecommendationIds.set(new Set),this.persistRecommendationCache()}rejectSelected(){let t=this.selectedRecommendationIds();this.recommendations.update(e=>e.map(i=>t.has(i.id)?P(I({},i),{status:"rejected",rejectionReason:"Bulk rejected",updatedAt:G()}):i)),this.selectedRecommendationIds.set(new Set),this.persistRecommendationCache()}protectSelected(){let t=this.selectedRecommendationIds();this.recommendations.update(e=>e.map(i=>t.has(i.id)?P(I({},i),{status:"protected",updatedAt:G()}):i)),this.selectedRecommendationIds.set(new Set),this.persistRecommendationCache()}toggleNegativeSelected(){let t=this.selectedRecommendationIds();this.recommendations.update(e=>e.map(i=>{if(!t.has(i.id))return i;let n=!i.sourceNegativeEnabled;return P(I({},i),{sourceNegativeEnabled:n,sourceBreakdowns:i.sourceBreakdowns?.map(r=>P(I({},r),{sourceNegativeEnabled:n})),updatedAt:G()})})),this.persistRecommendationCache()}async stageSelectedIsolationRecommendationsToApiQueue(){let t=this.getActiveAccountContext();if(!t?.connectionId){this.message.set("Select a connected Amazon Ads account before staging preview queue items.");return}let e=this.selectedIsolationQueueRows();if(!e.length){this.message.set("Select at least one actionable isolation recommendation before staging.");return}let i=this.selectedCount()-e.length;this.apiQueueStageLoading.set(!0),this.error.set(null);try{let n=await this.amazonApi.stageIsolationIntelligenceToApiQueue(t.connectionId,t.profileId,t.orgId,e),r=[`Preview-only API Queue staged ${n.itemCount.toLocaleStr
8ing()} isolation item(s)`,`${n.blockedCount.toLocaleString()} blocked`,`${n.warningCount.toLocaleString()} warning`];n.duplicateCount&&r.push(`${n.duplicateCount.toLocaleString()} duplicate/update`),i>0&&r.push(`${i.toLocaleString()} non-actionable selection skipped`),this.message.set(`${r.join("; ")}. Send to Amazon remains disabled.`),this.selectedRecommendationIds.set(new Set),await this.vm?.loadApiQueueItems?.()}catch(n){this.error.set(n?.message||"Could not stage Isolation Intelligence rows to the preview queue.")}finally{this.apiQueueStageLoading.set(!1)}}async exportFromButton(t=!1){if(!this.exportInProgress()){this.exportInProgress.set(!0),this.exportProgress.set(8),this.exportProgressLabel.set("Preparing export rows"),this.error.set(null),await this.waitForPaint();try{let e=this.exportMode(),i=e==="audit",n=this.rowsForExportMode();if(!n.length){this.message.set("No recommendations match that export option.");return}this.exportProgress.set(22),this.exportProgressLabel.set("Validating Amazon bulk rules"),await this.waitForPaint();let r=i?[]:this.exportService.validateExport(n,this.campaigns(),e);if(r.some(f=>f.severity==="error")&&!t){this.exportIssues.set(r),this.exportIssueModalOpen.set(!0),this.message.set("Review the export validation issues before downloading this file.");return}let u=new Set(r.filter(f=>f.severity==="error").map(f=>f.recommendationId)),p=t?n.filter(f=>!u.has(f.id)):n;if(!p.length){this.message.set("No valid rows were available to export.");return}if(!i){this.exportProgress.set(42),this.exportProgressLabel.set("Recording export audit event"),await this.waitForPaint();try{let f=this.selectedDateRange();await this.amazonApi.recordBulkExportAuditEvent({connectionId:this.selectedConnectionId(),profileId:this.selectedProfileId(),orgId:this.currentOrgId(),exportType:"isolation_intelligence_bulk_export",rowCount:p.length,accountName:this.selectedAccountName(),dateRange:`${f.startDate} to ${f.endDate}`,startDate:f.startDate,endDate:f.endDate,actionKeys:p.flatMap(x=>(x.sourceBreakdowns?.length?x.sourceBreakdowns:[{sourceCampaignId:x.sourceCampaignId,sourceAdGroupId:x.sourceAdGroupId,sourceTargetText:x.sourceTargetText,sourceNegativeEnabled:x.sourceNegativeEnabled}]).filter(T=>x.sourceNegativeEnabled||T.sourceNegativeEnabled).map(T=>({action:x.searchTermType==="asin"?"negative_product_target":"negative_exact",searchTerm:x.searchTerm,campaignId:T.sourceCampaignId||x.sourceCampaignId,adGroupId:T.sourceAdGroupId||x.sourceAdGroupId}))),sampleActions:p.slice(0,12).flatMap(x=>(x.sourceBreakdowns?.length?x.sourceBreakdowns:[{sourceCampaignId:x.sourceCampaignId,sourceAdGroupId:x.sourceAdGroupId,sourceTargetText:x.sourceTargetText,sourceNegativeEnabled:x.sourceNegativeEnabled}]).filter(T=>x.sourceNegativeEnabled||T.sourceNegativeEnabled).map(T=>({action:x.searchTermType==="asin"?"negative_product_target":"negative_exact",searchTerm:x.searchTerm,campaignId:T.sourceCampaignId||x.sourceCampaignId,adGroupId:T.sourceAdGroupId||x.sourceAdGroupId,sourceTarget:T.sourceTargetText||x.sourceTargetText,confidence:x.confidence,status:x.status}))).slice(0,12)})}catch(f){this.message.set(f?.message||"Could not record this Isolation Intelligence export in the audit log.")}}this.exportProgress.set(68),this.exportProgressLabel.set("Writing file and line history"),await this.waitForPaint();let g=this.exportService.generateCsvOrXlsx({recommendations:p,accountName:this.selectedAccountName(),mode:e,campaigns:this.campaigns()});if(!g){this.message.set("No valid rows were available to export.");return}g.validationIssues=r,this.lastExportBatch.set(g),this.exportHistory.update(f=>[g,...f].slice(0,200)),this.exportProgress.set(88),this.exportProgressLabel.set("Saving export history"),await this.waitForPaint(),await this.saveExportHistory(),i||this.setRecommendations(this.exportService.markExported(g.id,g.recommendationIds,this.recommendations())),this.selectedRecommendationIds.set(new Set),this.exportIssueModalOpen.set(!1),this.activeTab.set("exports"),this.exportHistoryTab.set(g.lineItems?.length?"lines":"files");
8let y=new Date().toLocaleString();this.lastDownloadedDate.set(y),localStorage.setItem(`ii_last_downloaded_${this.currentAccountId()}`,y),this.exportProgress.set(100),this.exportProgressLabel.set("Export complete"),this.message.set(i?`Exported ${g.rowCount} audit row(s) to ${g.filename}.`:`Exported ${g.rowCount} Amazon bulk row(s) to ${g.filename}.`)}catch(e){this.error.set(e?.message||"The export could not be completed.")}finally{window.setTimeout(()=>{this.exportInProgress.set(!1),this.exportProgress.set(0),this.exportProgressLabel.set("")},this.exportProgress()===100?900:0)}}}exportValidRowsOnly(){this.exportFromButton(!0)}openDrawer(t){this.drawerRec.set(t),this.drawerOpen.set(!0)}closeDrawer(){this.drawerOpen.set(!1)}patchRule(t){this.rule.update(e=>P(I(I({},e),t),{updatedAt:G()}))}patchBidStrategy(t){this.rule.update(e=>P(I({},e),{bidStrategy:I(I({},e.bidStrategy),t),updatedAt:G()}))}formatMix(t){return t?this.linking.targetMixLabel(t.targetingMix):"-"}formatMixForCampaignId(t){return this.formatMix(this.campaigns().find(e=>e.campaignId===t))}linkedFromCount(t){return this.campaignLinks().filter(e=>e.destinationCampaignId===t).length}selectedFromCampaignName(){let t=this.selectedFromCampaignIds(),e=this.campaigns().filter(i=>t.has(i.campaignId)).map(i=>i.campaignName);return e.length?e.join(", "):"-"}selectedToCampaignName(){return this.campaigns().find(t=>t.campaignId===this.selectedToCampaignId())?.campaignName||"-"}isFromSelected(t){return this.selectedFromCampaignIds().has(t)}toggleFromCampaign(t){this.selectedFromCampaignIds.update(e=>{let i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i})}isToSelected(t){return this.selectedToCampaignId()===t}toggleToCampaign(t){this.selectedToCampaignId.set(this.selectedToCampaignId()===t?"":t)}matchingTitleLabel(t){return this.toTitleCase(t||"Missing key")}uniqueDiscoveryLinks(t){let e=new Set,i=[];for(let n of t.discoveryLinks){let r=n.sourceCampaignId||n.sourceCampaignName;e.has(r)||(e.add(r),i.push(n))}return i}advertisedProductLabel(t){let e=t.advertisedProducts||[];return e.length?e.map(i=>[i.asin,i.sku].filter(Boolean).join(" / ")).filter(Boolean).slice(0,4).join(", "):"-"}activeConnectionLabel(){return this.syncedProfiles().find(e=>e.connectionId===this.selectedConnectionId()&&e.profileId===this.selectedProfileId())?.connectionLabel||this.vm?.selectedAccountMeta?.()?.connectionLabel||"No synced account selected"}activeAmazonEmail(){return this.syncedProfiles().find(e=>e.connectionId===this.selectedConnectionId()&&e.profileId===this.selectedProfileId())?.amazonEmail||this.vm?.selectedAccountMeta?.()?.amazonEmail||""}updateIncludePhrases(t){this.patchRule({includePhrases:this.list(t)})}updateExcludePhrases(t){this.patchRule({excludePhrases:this.list(t)})}confidenceLabel(t){return t>=90?"High Confidence":t>=75?"Strong":t>=50?"Needs Review":"Do Not Recommend"}badgeClass(t){return["approved","linked","exported","High Confidence","low"].includes(t)?"ii-badge--green":["manual_override","Manual Override","Keyword Isolation","Product Target Isolation"].includes(t)?"ii-badge--blue":["pending","missing_destination","ambiguous_match","medium"].includes(t)?"ii-badge--amber":["rejected","protected","high"].includes(t)?"ii-badge--red":"ii-badge--muted"}formatMonitorDate(t){if(!t||t==="-")return"-";let e=new Date(t);if(Number.isNaN(e.getTime()))return String(t);let i=Date.now()-e.getTime(),n=Math.abs(i),r=i>=0?"ago":"from now",m=Math.round(n/6e4),u=Math.round(n/36e5),p=Math.round(n/864e5),g=m<60?`${Math.max(1,m)}m ${r}`:u<48?`${Math.max(1,u)}h ${r}`:`${Math.max(1,p)}d ${r}`,y=e.toLocaleString("en-US",{timeZone:"America/Los_Angeles",month:"short",day:"numeric",hour:"numeric",minute:"2-digit"});return`${g} (${y} PT)`}selectWorkspaceProfile(t,e=!0,i=!0){let n=this.workspaceAccountKey(this.selectedConnectionId(),this.selectedProfileId()),r=this.workspaceAccountKey(t.connectionId,t.profileId),m=n!==r;this.selectedConnectionId.set(t.connectionId),this.selectedProfileId.set(t.profileId),this.selectedAccountName.set(t.accountName||"selected-account"),m&&(this.invalidateAccountScopedRequests(),this.isLoadingApi.set(!1),this.isLoadingCampaignLinks.set(!1),this.isScanning.set(!1),this.lastWorksp
8aceHydrationKey="",this.lastLoadedProfile="",this.lastLoadedRange="",this.campaigns.set([]),this.campaignLinks.set([]),this.uploadedRows.set([]),this.rawUploadName.set(""),this.selectedRecommendationIds.set(new Set)),i&&m&&(this.loadPortableWorkspaceState(),this.lastDownloadedDate.set(localStorage.getItem(`ii_last_downloaded_${t.profileId}`)||""),this.rulesTabEditingId.set(null),this.loadRecommendationCache());let u=this.profiles().filter(p=>this.syncedProfiles().some(g=>g.connectionId===t.connectionId&&String(g.profileId)===String(p.profileId)));return u.length&&this.profiles.set(u),e&&this.persistActiveAccountSelection(t),m}getActiveAccountStorageKey(){return`amz_monitor_active_account_${this.currentOrgId()||"default"}`}readActiveAccountSelection(){try{let t=localStorage.getItem(this.getActiveAccountStorageKey());if(!t)return null;let e=JSON.parse(t),i=String(e?.connectionId||""),n=String(e?.profileId||"");return i&&n?{connectionId:i,profileId:n}:null}catch{return null}}persistActiveAccountSelection(t){try{localStorage.setItem(this.getActiveAccountStorageKey(),JSON.stringify({connectionId:t.connectionId,profileId:t.profileId,accountName:t.accountName,countryCode:t.countryCode,timezone:t.timezone,connectionLabel:t.connectionLabel,amazonEmail:t.amazonEmail,region:t.region,accessMode:t.accessMode||"read_only",savedAt:G()}))}catch{}}syncWorkspaceActiveAccount(t=!0){let e=this.workspaceSyncRows();this.syncedProfiles.set(e);let i=this.workspaceAccountKey(this.selectedConnectionId(),this.selectedProfileId()),n=String(this.vm?.activeProfileId?.()||""),r=this.workspaceActiveConnectionId();if(!n)return this.selectedConnectionId.set(""),this.selectedProfileId.set(""),this.selectedAccountName.set("selected-account"),i&&(this.invalidateAccountScopedRequests(),this.isLoadingApi.set(!1),this.isLoadingCampaignLinks.set(!1),this.isScanning.set(!1)),"";let m=e.find(p=>p.profileId===n&&(!r||p.connectionId===r))||e.find(p=>p.profileId===n);if(m)return this.selectWorkspaceProfile(m,!1,t),this.workspaceAccountKey(m.connectionId,m.profileId);this.selectedConnectionId.set(r||this.selectedConnectionId()),this.selectedProfileId.set(n),this.selectedAccountName.set(this.vm?.selectedAccountMeta?.()?.accountName||`Profile ${n}`);let u=this.workspaceAccountKey(this.selectedConnectionId(),this.selectedProfileId());return i!==u&&(this.invalidateAccountScopedRequests(),this.isLoadingApi.set(!1),this.isLoadingCampaignLinks.set(!1),this.isScanning.set(!1)),t&&i!==u&&(this.lastWorkspaceHydrationKey="",this.lastLoadedProfile="",this.lastLoadedRange="",this.campaigns.set([]),this.campaignLinks.set([]),this.uploadedRows.set([]),this.rawUploadName.set(""),this.selectedRecommendationIds.set(new Set),this.lastDownloadedDate.set(localStorage.getItem(`ii_last_downloaded_${n}`)||""),this.loadPortableWorkspaceState(),this.loadRecommendationCache()),u}currentAccountContextKey(){let t=this.getActiveAccountContext();return[t?.orgId||this.currentOrgId(),t?.connectionId||this.selectedConnectionId()||this.workspaceActiveConnectionId(),t?.profileId||this.currentAccountId()].join("::")}currentSearchTermContextKey(t=this.selectedDateRange()){return`${this.currentAccountContextKey()}::${t.startDate}::${t.endDate}`}invalidateAccountScopedRequests(){this.setupRequests.invalidate(),this.campaignRequests.invalidate(),this.searchTermRequests.invalidate(),this.recommendationReadyRequests.invalidate(),this.savedRuleRequests.invalidate(),this.recommendationCacheRequests.invalidate(),this.portableStateRequests.invalidate()}workspaceActiveConnectionId(){return String(this.vm?.getActiveConnection?.()?.connectionId||this.vm?.selectedConnection?.()?.connectionId||this.vm?.syncSelectionConnectionId?.()||this.vm?.selectedAccountMeta?.()?.connectionId||"")}workspaceAccountKey(t,e){let i=String(t||""),n=String(e||"");return n?`${i}::${n}`:""}workspaceHydrationKey(t,e,i){let n=e||i||{},r=Array.isArray(n?.campaignManager)?n.campaignManager:Array.isArray(n?.campaignManagerCampaignRows)?n.campaignManagerCampaignRows:Array.isArray(n?.campaigns)?n.campaigns:[],m=Array.isArray(n?.adGroups)?n.adGroups:[],u=Array.isArray(n?.keywords)?n.keywords:[],p=Array.isArray(n?.targets)?n.targets:[];return[t,n?.fetchedAt||n?.updatedAt||n?.lastSyncAt||n?.dataDate||"",n?.startDate||"",n?.endDate||"",r.length,m.length,u.length,p.length].join("|")}workspaceSyncRows(){return(Array.isArray(this.vm?.syncQueueRows?.())?this.vm.syncQueueRows():[]).map(e=>({connectionId:String(e.connectionId||""),connectionLabel:String(e.connectionLabel||""),amazonEmail:String(e.amazonEmail||""),region:String(e.region||""),profileId:String(e.profileId||""),accountName:String(e.accountName||`Profile ${e.profileId||""}`),countryCode:String(e.countryCode||""),timezone:String(e.timezone||""),accessMode:String(e.accessMode||"read_only")})).filter(e=>e.connectionId&&e.profileId)}workspaceMonitorCache(){let t=String(this.selectedProfileId()||this.vm?.activeProfileId?.()||""),e=String(this.selectedConnectionId()||this.workspaceActiveConnectionId()||"");if(!t||!e)return null;let i=this.vm?.monitorCache?.()||null;if(i&&String(i.profileId||"")===t&&String(i.connectionId||"")===e)return i;let r=this.workspaceSyncRows().find(m=>m.profileId===t&&m.connectionId===e)?this.vm?.syncQueueRows?.()?.find?.(m=>String(m.profileId||"")===t&&String(m.connectionId||"")===e)?.cache:null;return r&&String(r.profileId||"")===t&&String(r.connectionId||"")===e?r:null}workspaceCampaignSnapshot(){let t=this.vm?.campaignManagerTree?.();if(Array.isArray(t)&&t.length)return{campaignManager:t};let e=this.vm?.campaignManagerSource?.();if(Array.isArray(e?.campaignManager)&&e.campaignManager.length)return e;let i=this.workspaceMonitorCache();return Array.isArray(i?.campaigns)&&i.campaigns.length&&Array.isArray(i?.adGroups)&&i.adGroups.length?i:Array.isArray(i?.campaignManagerCampaignRows)&&i.campaignManagerCampaignRows.length?P(I({},i),{campaignManager:i.campaignManagerCampaignRows}):Array.isArray(i?.campaigns)&&i.campaigns.length?i:null}
8async ensureWorkspaceAdGroupDetails(t){if(!t.some(n=>n.adProduct!=="SD"&&n.state!=="archived"&&(!Array.isArray(n.adGroups)||n.adGroups.length===0)))return t;let i=this.activeAmazonContext();if(!i)return t;try{let n=await this.linking.loadCampaignsFromApi(this.currentAccountId(),i);return n.length?n:t}catch(n){return console.warn("[IsolationIntelligence] Could not load export-safe ad group details",n),t}}activeAmazonContext(){let t=this.currentOrgId(),e=this.selectedConnectionId()||this.workspaceActiveConnectionId(),i=this.selectedProfileId()||String(this.vm?.activeProfileId?.()||"");return!t||!e||!i?null:{orgId:t,connectionId:e,profileId:i}}snapshotHasTargetingDetails(t){return t?Array.isArray(t.keywords)&&t.keywords.length||Array.isArray(t.targets)&&t.targets.length?!0:(Array.isArray(t.campaignManager)?t.campaignManager:Array.isArray(t.campaignManagerCampaignRows)?t.campaignManagerCampaignRows:[]).some(i=>(i?.adGroups||[]).some(n=>Array.isArray(n?.keywords)&&n.keywords.length||Array.isArray(n?.targets)&&n.targets.length)):!1}ruleRows(t){return[{label:"Orders requirement",value:t.metrics.orders>=this.rule().minOrders?"Passed":"Failed"},{label:"ACoS requirement",value:this.rule().requireAcosMax?t.metrics.acos!=null&&t.metrics.acos<=Number(this.rule().maxAcos)?"Passed":"Failed":"Not Applicable"},{label:"Clicks requirement",value:this.rule().requireClicksMin?t.metrics.clicks>Number(this.rule().minClicks||0)?"Passed":"Failed":"Not Applicable"},{label:"Phrase include rule",value:this.rule().includePhrases.length?"Passed":"Not Applicable"},{label:"Phrase exclude rule",value:this.rule().excludePhrases.length?"Passed":"Not Applicable"},{label:"Campaign/ad type rule",value:"Passed"},{label:"Destination campaign link",value:t.destinationCampaignName?"Passed":"Failed"},{label:"Already isolated check",value:t.status==="already_isolated"?"Failed":"Passed"},{label:"Protection check",value:t.status==="protected"?"Failed":"Passed"}]}statRows(t){return[{label:"Lookback window",value:this.rule().lookbackType==="last_x_days"?`${this.rule().lookbackDays||30} days`:`${this.rule().startDate} to ${this.rule().endDate}`},{label:"Impressions",value:t.metrics.impressions.toLocaleString()},{label:"Clicks",value:t.metrics.clicks.toLocaleString()},{label:"CTR",value:this.percent(t.metrics.ctr)},{label:"Spend",value:this.money(t.metrics.spend)},{label:"Avg CPC",value:t.bid.avgCpc==null?"-":this.money(t.bid.avgCpc)},{label:"Orders",value:t.metrics.orders.toLocaleString()},{label:"Sales",value:this.money(t.metrics.sales)},{label:"CVR",value:this.percent(t.metrics.cvr)},{label:"ACoS",value:t.metrics.acos==null?"-":this.percent(t.metrics.acos)},{label:"ROAS",value:t.metrics.roas==null?"-":t.metrics.roas.toFixed(2)},{label:"Suggested bid",value:this.money(t.bid.suggestedBid)},{label:"Bid formula used",value:t.bid.formula},{label:"Source campaign",value:t.sourceCampaignName||"-"},{label:"Source ad group",value:t.sourceAdGroupName||"-"},{label:"Source target",value:t.sourceTargetText||"-"},{label:"Destination campaign",value:t.destinationCampaignName||"-"},{label:"Destination ad group",value:t.destinationAdGroupName||"-"},{label:"Negative source campaign",value:t.sourceNegativeEnabled?"Yes":"No"}]}applySearchTermCounts(t){let e=this.uploadedRows();if(!e.length)return t.map(u=>P(I({},u),{searchTermsFound:0,ordersFromSearchTerms:0,salesFromSearchTerms:0}));let i=()=>({count:0,orders:0,sales:0}),n=new Map,r=new Map,m=(u,p,g)=>{if(!p)return;let y=u.get(p)||i();y.count+=1,y.orders+=Number(g.orders)||0,y.sales+=Number(g.sales)||0,u.set(p,y)};for(let u of e)m(n,String(u.campaignId||""),u),m(r,this.norm(u.campaignName),u);return t.map(u=>{let p=n.get(String(u.campaignId||""))||r.get(this.norm(u.campaignName))||i();return P(I({},u),{searchTermsFound:p.count,ordersFromSearchTerms:p.orders,salesFromSearchTerms:p.sales})})}mergeCampaignsFromRows(t,e){let i=new Map(t.map(r=>[r.campaignId||this.norm(r.campaignName),r])),n=new Map;for(let r of e){let m=r.campaignId||this.norm(r.campaignName);n.has(m)||n.set(m,[]),n.get(m).push(r)}for(let[r,m]of n){if(i.has(r))continue;
8let u=m[0],p=this.linking.detectCampaignRoleFromName(u.campaignName),g={autoTargetCount:p==="auto_discovery"?4:0,broadKeywordCount:p==="broad_discovery"?1:0,phraseKeywordCount:p==="phrase_discovery"?1:0,exactKeywordCount:p==="exact_staging"?1:0,productTargetCount:p==="pt_exact"||p==="pt_exact_staging"?1:0,negativeKeywordCount:0,negativeProductTargetCount:0,unknownTargetCount:p==="unknown"?1:0};i.set(r,{campaignId:u.campaignId||r,campaignName:u.campaignName,adProduct:u.adProduct,state:"unknown",nameDetectedRole:p,targetingDetectedRoles:this.linking.detectCampaignRoleFromTargetCounts(g),targetingMix:g,isEligibleFromCampaign:u.adProduct!=="SD",isEligibleToCampaign:u.adProduct!=="SD",linkedStatus:"unlinked",adGroups:[...new Map(m.map(y=>[y.adGroupId||y.adGroupName||"default",{adGroupId:y.adGroupId||"",adGroupName:y.adGroupName||"Default"}])).values()],matchingTitle:this.linking.extractMatchingTitle(u.campaignName),createdAt:G(),updatedAt:G()})}return this.applySearchTermCounts([...i.values()].sort((r,m)=>r.campaignName.localeCompare(m.campaignName)))}buildProtections(){let t=G(),e=(i,n)=>n.map(r=>({id:`${i}-${r.toLowerCase()}`,orgId:this.currentOrgId(),accountId:this.currentAccountId(),type:i,value:r,enabled:!0,createdAt:t,updatedAt:t}));return[...e("protected_word",this.list(this.protectedWords())),...e("protected_phrase",this.list(this.protectedPhrases())),...e("protected_asin",this.list(this.protectedAsins())),...e("protected_campaign",this.list(this.protectedCampaigns())),...e("protected_ad_group",this.list(this.protectedAdGroups()))]}selectedDateRange(){let t=this.rule();if(t.lookbackType==="custom_date_range"&&t.startDate&&t.endDate)return{startDate:t.startDate,endDate:t.endD
8ate};let e=new Date;e.setDate(e.getDate()-2);let i=new Date(e);return i.setDate(i.getDate()-Math.max(1,Number(t.lookbackDays||30))+1),{startDate:i.toISOString().slice(0,10),endDate:e.toISOString().slice(0,10)}}getActiveAccountContext(){let t=this.currentOrgId(),e=String(this.selectedProfileId()||this.activeProfile()?.profileId||this.vm?.activeProfileId?.()||""),i=String(this.selectedConnectionId()||this.activeProfile()?.connectionId||this.workspaceActiveConnectionId()||this.vm?.selectedAccountMeta?.()?.connectionId||"");return!t||!e?null:{orgId:t,profileId:e,connectionId:i}}selectedIsolationQueueRows(){let t=this.selectedRecommendationIds();return this.recommendations().filter(e=>t.has(e.id)&&["keyword_exact_create","product_target_create"].includes(e.recommendationType)&&["pending","approved"].includes(e.status))}rowsForExportMode(){let t=this.exportMode();return t==="selected"?this.recommendations().filter(e=>this.selectedRecommendationIds().has(e.id)&&e.status!=="exported"):t==="keyword"?this.recommendations().filter(e=>e.status==="approved"&&e.recommendationType==="keyword_exact_create"):t==="product"?this.recommendations().filter(e=>e.status==="approved"&&e.recommendationType==="product_target_create"):t==="negatives"?this.recommendations().filter(e=>e.status==="approved"&&e.sourceNegativeEnabled):t==="audit"?this.recommendations():this.recommendations().filter(e=>e.status==="approved")}generateAndStoreRecommendations(t){this.campaignLinks().length||this.refreshLinks();let e=this.isolation.generateRecommendations(t,this.rule(),this.campaignLinks(),this.campaigns(),this.buildProtections(),this.activeRules());return this.selectedRecommendationIds.set(new Set),this.lastScanDate.set(new Date().toLocaleString()),this.setRecommendations(e),e}setRecommendations(t){this.recommendations.set(t),this.persistRecommendationCache()}async loadRecommendationCache(){let t=this.currentOrgId(),e=this.currentAccountId(),i=this.recommendationsStorageKey(),n=this.currentAccountContextKey(),r=this.recommendationCacheRequests.begin(n),m=await this.isolation.loadRecommendationCache(t,e,i);if(!this.recommendationCacheRequests.isCurrent(r,this.currentAccountContextKey()))return!1;if(!m)return this.recommendations.set([]),this.selectedRecommendationIds.set(new Set),this.lastScanDate.set(null),!1;let u=Array.isArray(m.recommendations)?m.recommendations:[];return this.recommendations.set(u),this.selectedRecommendationIds.set(new Set),this.lastScanDate.set(m.lastScanDate||null),this.rawUploadName.set(m.rawUploadName||this.rawUploadName()),!0}
8persistRecommendationCache(){let t={recommendations:this.recommendations(),lastScanDate:this.lastScanDate(),rawUploadName:this.rawUploadName(),savedAt:G()};this.isolation.saveRecommendationCache(this.currentOrgId(),this.currentAccountId(),t,this.recommendationsStorageKey())}async loadPortableWorkspaceState(){let t=this.currentOrgId(),e=this.currentAccountId(),i=this.currentAccountContextKey(),n=this.portableStateRequests.begin(i),[r,m,u]=await Promise.all([this.isolation.loadManualLinks(t,e),this.isolation.loadActiveRules(t,e),this.isolation.loadExportHistory(t,e)]);this.portableStateRequests.isCurrent(n,this.currentAccountContextKey())&&(this.manualLinks.set(r),this.activeRules.set(m),this.exportHistory.set(u),await this.loadSavedRules())}saveManualLinks(){this.isolation.saveManualLinks(this.currentOrgId(),this.currentAccountId(),this.manualLinks())}saveActiveRules(){this.isolation.saveActiveRules(this.currentOrgId(),this.currentAccountId(),this.activeRules())}async saveExportHistory(){await this.isolation.saveExportHistory(this.currentOrgId(),this.currentAccountId(),this.exportHistory())}async waitForPaint(){await new Promise(t=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>t()):setTimeout(t,0)})}recommendationsStorageKey(){return`ii_recommendations_${this.currentOrgId()||"no-org"}_${this.currentAccountId()}`}createLocalId(t){let e=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2,11)}`;return`${t}-${e}`}cleanRuleList(t){return[...new Set((t||[]).map(e=>String(e||"").trim()).filter(Boolean))]}appendListValue(t,e){let i=this.list(t);return i.map(n=>n.toLowerCase()).includes(e.toLowerCase())?t:[...i,e].join(`
9`)}list(t){return String(t||"").split(/[\n,]+/).map(e=>e.trim()).filter(Boolean)}norm(t){return String(t||"").toLowerCase().trim().replace(/\s+/g," ")}filterCampaigns(t,e){let i=this.norm(e);return i?t.filter(n=>[n.campaignName,n.matchingTitle,n.adProduct,n.nameDetectedRole,n.targetingDetectedRoles.join(" "),this.advertisedProductLabel(n)].some(r=>this.norm(String(r||"")).includes(i))):t}toTitleCase(t){return String(t||"").split(" ").filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}money(t){return`$${(Number(t)||0).toFixed(2)}`}percent(t){return t==null?"-":`${(Number(t)*100).toFixed(1)}%`}getLinkActiveRule(t){return this.activeRules().find(e=>e.campaignLinkId===t&&e.enabled)}getRuleSummary(t){let e=t.lookbackType==="last_x_days"?`${t.lookbackDays}-day window`:"custom date range",i=t.requireAcosMax?`max ${Math.round((t.maxAcos||0)*100)}% ACoS`:"ACoS reviewed",n=t.addNegativeToSource?"adds source negatives":"keeps discovery traffic open",r=t.bidStrategy.type==="avg_cpc"?"uses average CPC bid":t.bidStrategy.type==="fixed"?`uses ${this.money(t.bidStrategy.fixedBid||0)} fixed bid`:"uses average CPC multiplier";return[t.requireAcosMax?"Profit control rule":"Growth control rule",e,`${t.minOrders}+ orders`,i,r,n].join(" - ")}static \u0275fac=function(e){return new(e||l)};static \u0275cmp=Le({type:l,selectors:[["app-isolation-intelligence"]],inputs:{vm:"vm"},decls:69,vars:36,consts:[["recommendationTable",""],[1,"ii-page"],[1,"ii-header"],["role","tablist",1,"ii-tabs"],["type","button","role","tab",3,"click"],[1,"ii-alert","ii-alert--info","ii-alert--dismissible"],[1,"ii-alert","ii-alert--danger"],[1,"ii-card","ii-soft","ii-account-panel"],[1,"ii-card-body","ii-account-row"],[1,"ii-account-context"],[1,"ii-account-facts"],[1,"ii-actions","ii-account-actions"],["type","button",1,"ii-btn","ii-btn--primary",3,"click","disabled"],[1,"ii-btn","ii-btn--outline","ii-upload-btn"],["type","file","accept",".xlsx,.xls,.csv",3,"change"],[1,"ii-actions-menu"],[1,"ii-btn","ii-btn--ghost"],[1,"ii-actions-menu__panel"],["type","button","title","Load saved historical database search terms for scanning",1,"ii-btn","ii-btn--ghost",3,"click","disabled"],["type","button",1,"ii-btn","ii-btn--ghost",3,"disabled"],[1,"ii-card","ii-links-card"],[1,"ii-card"],[1,"ii-drawer-backdrop"],[1,"ii-modal-backdrop"],["type","button",3,"click"],["type","button",1,"ii-btn","ii-btn--ghost",3,"click","disabled"],[1,"ii-card-header","ii-links-card__header"],[1,"ii-eyebrow"],["type","button",1,"ii-btn","ii-btn--outline",3,"click"],["role","status","aria-live","polite",1,"ii-links-state"],[1,"ii-links-state","ii-links-state--empty"],["aria-hidden","true",1,"ii-links-state__spinner"],[1,"ii-card-body","ii-auto-toolbar"],[1,"ii-hint"],[1,"ii-auto-toolbar__actions"],["type","button",1,"ii-btn","ii-btn--xs","ii-btn--outline",3,"click"],["type","button",1,"ii-btn","ii-btn--xs","ii-btn--outline",3,"click","disabled"],[1,"ii-master-detail"],[1,"ii-group-header","ii-group-header--campaigns"],[1,"ii-select-all"],["type","checkbox",3,"change","checked"],[1,"ii-iso-row",3,"ii-iso-row--expanded","ii-iso-row--selected"],[1,"ii-iso-row"],[1,"ii-iso-card"],["type","checkbox",1,"ii-iso-card__check",3,"change","checked"],["type","button",1,"ii-iso-card__exp
9and",3,"click"],["aria-hidden","true",1,"ii-iso-card__chevron"],[1,"ii-iso-card__info"],[1,"ii-rule-status"],[1,"ii-iso-card__badges"],[1,"ii-badge","ii-badge--success"],[1,"ii-badge"],[1,"ii-badge","ii-badge--muted"],["role","region",1,"ii-discovery-panel",3,"id"],[1,"ii-discovery-panel__label"],[1,"ii-discovery-feeder"],[1,"ii-discovery-feeder","ii-discovery-feeder--empty"],[1,"ii-discovery-feeder__info"],[1,"ii-discovery-feeder__badges"],["aria-hidden","true",1,"ii-links-state__icon"],["type","button",1,"ii-btn","ii-btn--primary",3,"click"],[1,"ii-card","ii-setup-hero"],[1,"ii-card-header"],["type","button",1,"ii-back-link",3,"click"],[1,"ii-setup-summary"],[1,"ii-card","ii-detected-setup"],[1,"ii-card","ii-missing-section"],[1,"ii-card","ii-manual-setup"],[1,"ii-count-pill"],[1,"ii-manual-links-list"],[1,"ii-manual-grid"],[1,"ii-field","ii-filter-field"],["type","search","placeholder","Search discovery campaigns",3,"ngModelChange","ngModel"],[1,"ii-table-wrap","ii-table-wrap--short"],[1,"ii-table"],["scope","col"],[1,"ii-sr-only"],[3,"selected"],["type","search","placeholder","Search isolation campaigns",3,"ngModelChange","ngModel"],[1,"ii-action-bar","ii-action-bar--setup"],[1,"ii-card","ii-unlinked-setup"],[1,"ii-table-wrap"],[1,"ii-detected-links-list"],[1,"ii-detected-link-row",3,"ii-detected-link-row--removed"],[1,"ii-detected-link-row"],[1,"ii-detected-link-row__campaign"],["aria-hidden","true",1,"ii-detected-link-row__arrow"],["type","button",1,"ii-btn","ii-btn--xs","ii-btn--ghost",3,"click"],[1,"ii-missing-section__header"],[1,"ii-missing-row"],[1,"ii-manual-links-list__header"],[1,"ii-manual-link-row"],[1,"ii-manual-link-row__from"],["aria-hidden","true",1,"ii-manual-link-row__arrow"],[1,"ii-manual-link-row__to"],[1,"ii-badge","ii-badge--manual"],["colspan","5",1,"ii-empty-cell"],["type","radio","name","isolation-destination",3,"change","checked"],[3,"ngModelChange","ngModel"],["value","keyword_isolation"],["value","product_target_isolation"],["value","both"],["value","custom"],[1,"ii-row-actions"],["colspan","7",1,"ii-empty-cell"],[1,"ii-actions"],[1,"ii-rules-workspace"],[1,"ii-rule-library"],[1,"ii-rule-library__header"],[1,"ii-rule-library-card",3,"active"],[1,"ii-empty-cell"],[1,"ii-rule-builder"],[1,"ii-rule-builder__bar"],[1,"ii-rule-section"],[1,"ii-rule-section__title"],[1,"ii-rule-section__body"],[1,"ii-field","ii-wide"],["type","text","placeholder","e.g. Conservative 30-Day Isolation",3,"ngModelChange","ngModel"],[1,"ii-field"],["value","last_x_days"],["value","custom_date_range"],["type","number","min","1",3,"ngModelChange","ngModel"],[1,"ii-rule-toggle"],["type","checkbox",3,"ngModelChange","ngModel"],[1,"ii-rule-toggle__label"],[1,"ii-rule-toggle__input"],["rows","3","placeholder","One word or phrase per line",3,"ngModelChange","ngModel"],["value","avg_cpc"],["value","avg_cpc_multiplier"],["value","fixed"],["type","number","min","0.01","step","0.01",3,"ngModelChange","ngModel"],["type","number","min","0","step","0.01",3,"ngModelChange","ngModel"],[1,"ii-switch-row","ii-wide"],[1,"ii-rule-library-card"],["type","button",1,"ii-rule-library-card__main",3,"click"],[1,"ii-rule-library-card__actions"],["type","date",3,"ngModelChange","ngModel"],["type","number","min","0","step","1",3,"ngModelChange","ngModel"],["type","number","min","0",3,"ngModelChange","ngModel"],["type","number","min","0","step","0.1",3,"ngModelChange","ngModel"],["type","number","min","0.1","step","0.1",3,"ngModelChange","ngModel"],[1,"ii-alert","ii-alert--info","ii-alert--dismissible","ii-handoff-alert"],[1,"ii-kpis"],[1,"ii-kpi-summary"],[1,"ii-card","ii-soft"],[1,"ii-card-body","ii-recommendation-status"],["type","button",1,"ii-btn","ii-btn--outline",3,"click","disabled"],[1,"ii-card-body","ii-recommendation-filter"],["type","search","placeholder","Search term, campaign, ad group, target, or rule",3,"ngModelChange","ngModel"],["type","button",1,"ii-btn","ii-btn--ghost"],[1,"ii-card-body","ii-export-row"],["value","approved"],["value","selected"],["value","keyword"],["value","product"],["value","negatives"],["value","audit"],[1,"ii-export-action-group"],[1,"ii-download-timestamp"],["type","button","disabled","","title","Automatic API writes are disabled. Use bulk export for now.",1,"ii-btn","ii-btn--disabled"],["role","status","aria-live","polite",1,"ii-export-progress"],[1,"ii-bulk-bar"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],["type","button",1,"ii-btn","ii-btn--ghost",3,"click"],[1,"ii-grid-filter-summary"],["ariaLabel","Active Isolation filters",3,"removeFilter","chips"],[1,"ii-icon-clock"],[1,"ii-progress-track"],[1,"ii-btn","ii-btn--xs","ii-btn--primary",3,"click"],[1,"ii-btn","ii-btn--xs","ii-btn--ghost",3,"click"],[1,"ii-btn","ii-btn--xs","ii-btn--outline",3,"click","disabled"],[1,"ii-preview-note"],[2,"min-width","300px"],[1,"ii-card","ii-soft",2,"margin-top","24px","border","1p
9x dashed var(--ii-border)","background","var(--ii-card-bg)","border-radius","8px"],[2,"padding","16px","cursor","pointer","font-weight","600","font-size","0.95rem","color","var(--ii-text)","display","flex","align-items","center","justify-content","space-between","user-select","none"],[2,"display","flex","align-items","center","gap","8px"],[2,"font-weight","normal","color","var(--ii-muted)","margin-right","20px"],[2,"padding","16px","border-top","1px solid var(--ii-border)","background","var(--ii-bg)"],[1,"ii-two-column"],[1,"ii-card",2,"border","none","background","transparent","box-shadow","none","margin","0","padding","0"],[1,"ii-card-header",2,"padding","0 0 12px 0"],[1,"ii-card-body",2,"padding","0"],[1,"ii-form-grid"],[1,"ii-check"],["type","number","step","0.01","min","0",3,"ngModelChange","ngModel"],["type","number","step","0.01","min","0.01",3,"ngModelChange","ngModel"],[1,"ii-two-column",2,"margin-top","20px"],[1,"ii-switch-row"],[1,"ii-form-grid",2,"padding","0"],["rows","2",3,"ngModelChange","ngModel"],[2,"display","flex","justify-content","flex-end","margin-top","20px","gap","12px"],["type","button",1,"ii-btn","ii-btn--secondary",3,"click"],[1,"ii-badge","ii-badge--blue",2,"margin-bottom","4px"],[1,"ii-rule-summary"],[2,"font-size","0.76rem","color","var(--ii-muted)","line-height","1.4"],["type","text","placeholder","Enter descriptive notes...",2,"width","100%","border","1px solid var(--ii-border)","border-radius","4px","padding","4px 8px","font-size","0.8rem","min-height","28px","background","transparent",3,"blur","ngModel"],[2,"vertical-align","middle"],[1,"ii-switch-toggle"],[1,"ii-switch-toggle__slider"],[2,"font-size","0.78rem","font-weight","600"],["type","button",1,"ii-btn","ii-btn--xs","ii-btn--danger",3,"click"],[2,"color","var(--ii-muted)","font-size","0.74rem"],["colspan","5",1,"ii-empty-cell",2,"padding","40px","text-align","center","color","var(--ii-muted)"],[2,"font-size","1.5rem","margin-bottom","8px"],[2,"margin","4px 0 0 0","font-size","0.8rem"],[1,"ii-tabs","ii-tabs--small"],["ariaLabel","Active export file filters",3,"removeFilter","chips"],[3,"label","columnKey","grid","resizable"],["colspan","8",1,"ii-empty-cell"],["ariaLabel","Active exported line filters",3,"removeFilter","chips"],[1,"ii-badge",3,"ngClass"],[3,"ii-handoff-row"],["type","checkbox","aria-label","Select all recommendations in this table"],["type","checkbox","aria-label","Select all recommendations in this table",3,"change"],["type","button",1,"ii-pill-btn",3,"click"],[1,"ii-confidence"],[1,"ii-btn","ii-btn--xs","ii-btn--primary",3,"click","disabled"],[1,"ii-btn","ii-btn--xs","ii-btn--ghost",3,"click","disabled"],["colspan","22",1,"ii-empty-cell"],[1,"ii-drawer-backdrop",3,"click"],[1,"ii-drawer",3,"click"],[1,"ii-btn","ii-btn--ghost",3,"click"],[1,"ii-drawer-body"],[1,"ii-explanation"],[1,"ii-detail-grid"],[1,"ii-check-list"],[3,"passed","failed"],[1,"ii-btn","ii-btn--primary",3,"click"],[1,"ii-modal-backdrop",3,"click"],[1,"ii-modal",3,"click"],[3,"value"],[1,"ii-modal","ii-modal--wide",3,"click"],[1,"ii-issue-list"],[1,"ii-rule-presets"],[1,"ii-rule-editor"],["type","button",1,"ii-btn","ii-btn--outline"],[1,"ii-rule-preset-card",3,"click"],[1,"ii-badge","ii-badge--blue"],[1,"ii-rule-preset-card"],[1,"ii-hint",2,"padding","12px 16px"],[1,"ii-rule-preset-card__actions"],[1,"ii-field",2,"grid-column","span 2"],["type","text","placeholder","e.g. 30-Day Aggressive Isolation",3,"ngModelChange","ngModel"],[1,"ii-rule-section",2,"border-top","1px solid var(--ii-border)","padding-top","15px","margin-top","15px"],[1,"ii-rule-section__body",2,"grid-template-columns","1fr 1fr"],[1,"ii-field","ii-wide",2,"grid-column","span 2"],["rows","2","placeholder",`e.g. cheap
10free
11discount`,2,"width","100%","border","1px solid var(--ii-border)","border-radius","6px","padding","8px","font-family","inherit","font-size","0.82rem","min-height","50px","background","transparent",3,"ngModelChange","ngModel"],["rows","2","placeholder",`e.g. paddle
12ball
13carbon`,2,"width","100%","border","1px solid var(--ii-border)","border-radius","6px","padding","8px","font-family","inherit","font-size","0.82rem","min-height","50px","background","transparent",3,"ngModelChange","ngModel"],[1,"ii-input-prefix"],[1,"ii-field","ii-field--with-tip"],["title","Used when no Avg CPC data is available for a search term (e.g. zero clicks). This ensures a bid is always set even for brand-new keyword targets.",1,"ii-tip"],[1,"ii-rule-section",2,"margin-top","15px","border-top","1px solid var(--ii-border)","padding-top","15px"],["type","text","placeholder","e.g. Exact targeting test or Summer Season Pickleball",2,"width","100%","min-height","38px","padding","0 12px","border","1p
13x solid var(--ii-border)","border-radius","6px","font-size","0.85rem",3,"ngModelChange","ngModel"],[1,"ii-input-pct"],["type","number","min","0","max","999","step","1","placeholder","30",3,"ngModelChange","ngModel"],["type","number","min","0","max","100","step","0.1",3,"ngModelChange","ngModel"],[1,"ii-input-suffix"],["type","number","min","0.1","max","10","step","0.1",3,"ngModelChange","ngModel"]],template:function(e,i){if(e&1){let n=w();o(0,"div",1)(1,"header",2)(2,"div")(3,"h1"),s(4,"Isolation Intelligence"),a(),o(5,"p"),s(6,"Move proven search terms into exact control, protect discovery campaigns, and export isolation actions."),a()(),o(7,"div",3)(8,"button",4),C("click",function(){return _(n),h(i.setTab("links"))}),s(9,"Campaign Links"),a(),o(10,"button",4),C("click",function(){return _(n),h(i.setTab("rules"))}),s(11,"Rules"),a(),o(12,"button",4),C("click",function(){return _(n),h(i.setTab("active-rules"))}),s(13,"Active Rules"),a(),o(14,"button",4),C("click",function(){return _(n),h(i.setTab("recommendations"))}),s(15,"Recommendations"),a(),o(16,"button",4),C("click",function(){return _(n),h(i.setTab("exports"))}),s(17,"Export History"),a()()(),k(18,Vt,5,1,"div",5),k(19,Ft,2,1,"div",6),o(20,"section",7)(21,"div",8)(22,"div",9)(23,"span"),s(24,"Monitor Account"),a(),o(25,"strong"),s(26),a(),k(27,Gt,2,3,"em"),a(),o(28,"div",10)(29,"div")(30,"span"),s(31,"Marketplace"),a(),o(32,"strong"),s(33),a()(),o(34,"div")(35,"span"),s(36,"Data Through"),a(),o(37,"strong"),s(38),a()(),o(39,"div")(40,"span"),s(41,"Snapshot"),a(),o(42,"strong"),s(43),a()()(),o(44,"div",11)(45,"button",12),C("click",function(){return _(n),h(i.runScan())}),s(46),a(),o(47,"label",13),s(48," Upload Report "),o(49,"input",14),C("change",function(m){return _(n),h(i.onFileSelected(m))}),a()(),o(50,"details",15)(51,"summary",16),s(52,"More"),a(),o(53,"div",17)(54,"button",18),C("click",function(){return _(n),h(i.loadHistoricalSearchTerms())}),s(55," Load Saved Search Terms "),a(),k(56,zt,2,2,"button",19),a()()()()(),k(57,Xt,14,1,"section",20),k(58,pi,129,16),k(59,Si,144,39,"section",21),k(60,Gi,65,23),k(61,Ui,143,17),k(62,rn,14,5,"section",21),ue(63,pn,10,1,"ng-template",null,0,Ve),k(65,hn,45,9,"div",22),k(66,fn,16,1,"div",23),k(67,vn,15,0,"div",23),k(68,On,21,8,"div",23),a()}if(e&2){let n;d(8),A("active",i.activeTab()==="links"||i.activeTab()==="setup"),H("aria-selected",i.activeTab()==="links"||i.activeTab()==="setup"),d(2),A("active",i.activeTab()==="rules"),H("aria-selected",i.activeTab()==="rules"),d(2),A("active",i.activeTab()==="active-rules"),H("aria-selected",i.activeTab()==="active-rules"),d(2),A("active",i.activeTab()==="recommendations"),H("aria-selected",i.activeTab()==="recommendations"),d(2),A("active",i.activeTab()==="exports"),H("aria-selected",i.activeTab()==="exports"),d(2),M(i.message()?18:-1),d(),M(i.error()?19:-1),d(7),b(i.monitorAccountMeta().accountName),d(),M(i.debugMode.enabled()?27:-1),d(6),b(i.monitorAccountMeta().marketplace||"-"),d(5),b(i.monitorAccountMeta().dataThrough||"-"),d(5),b(i.formatMonitorDate(i.monitorAccountMeta().lastSync)),d(2),v("disabled",i.isScanning()||!i.uploadedRows().length||!i.hasMonitorAccount()),d(),F(" ",i.isScanning()?"Scanning...":"Run Scan"," "),d(8),v("disabled",i.isLoadingApi()||!i.hasMonitorAccount()),d(2),M(i.debugMode.enabled()?56:-1),d(),M(i.activeTab()==="links"?57:-1),d(),M(i.activeTab()==="setup"?58:-1),d(),M(i.activeTab()==="rules"?59:-1),d(),M(i.activeTab()==="recommendations"?60:-1),d(),M(i.activeTab()==="active-rules"?61:-1),d(),M(i.activeTab()==="exports"?62:-1),d(3),M((n=i.drawerOpen()&&i.drawerRec())?65:-1,n),d(),M(i.rejectDialogOpen()?66:-1),d(),M(i.exportIssueModalOpen()?67:-1),d(),M(i.ruleModalOpen()?68:-1)}},dependencies:[je,Fe,Ge,rt,it,nt,Je,et,Qe,tt,Ze,ot,at,Ye,mt,pt,ze,Be,Ke,qe,$e],styles:['[_nghost-%COMP%]{display:block;--ii-bg: #f8fafc;--ii-card: #ffffff;--ii-border: #e2e8f0;--ii-text: #0f172a;--ii-muted: #64748b;--ii-blue: #2563eb;--ii-green: #15803d;--ii-teal: #0f766e;--ii-amber: #b45309;--ii-red: #b91c1c}.ii-page[_ngcontent-%COMP%]{display:grid;gap:18px;color:var(--ii-text)}.ii-header[_ngcontent-%COMP%]{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap}.ii-header[_ngcontent-%COMP%]   h1[_ngcontent-%COMP%]{margin:0;font-size:1.8rem;font-weight:850;letter-spacing:0}.ii-header[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:6px 0 0;color:var(--ii-muted);font-size:.94rem}.ii-tabs[_ngcontent-%COMP%]{display:inline-flex;gap:4px;padding:4px;border:1px solid var(--ii-border);border-radius:8px;background:var(--ii-bg)}.ii-tabs[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{min-height:34px;padding:0 12px;border:0;border-radius:6px;background:transparent;color:#475569;cursor:pointer;font:inherit;font-size:.82rem;font-weight:800}.ii-tabs[_ngcontent-%COMP%]   button.active[_ngcontent-%COMP%]{background:#fff;color:var(--ii-blue);box-shadow:0 1px 2px #0f172a14}.ii-tabs--small[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{min-height:30px;font-size:.76rem}.ii-card[_ngcontent-%COMP%]{overflow:hidden;border:1px solid var(--ii-border);border-radius:8px;background:var(--ii-card);box-shadow:0 4px 10px #0f172a0f}.ii-soft[_ngcontent-%COMP%]{background:var(--ii-bg);box-shadow:none}.ii-card-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:18px 20px;border-bottom:1px solid var(--ii-border);background:linear-gradient(to right,#fff,#f8fafc)}.ii-card-header[_ngcontent-%COMP%]   h2[_ngcontent-%COMP%]{margin:0;font-size:1.04rem;font-weight:850}.ii-card-header[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:4px 0 0;color:var(--ii-muted);font-size:.82rem;line-height:1.45}.ii-card-body[_ngcontent-%COMP%]{padding:18px 20px}.ii-actions[_ngcontent-%COMP%], .ii-row-actions[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.ii-btn[_ngcontent-%COMP%], .ii-file-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;min-height:36px;padding:0 13px;border:0;border-radius:8px;font:inherit;font-size:.8rem;font-weight:850;cursor:pointer}.ii-btn[_ngcontent-%COMP%]:disabled, .ii-file-btn[_ngcontent-%COMP%]:disabled{cursor:not-allowed;opacity:.55}.ii-file-btn[_ngcontent-%COMP%]{position:relative;border:1px solid var(--ii-border);background:#fff;color:#334155}.ii-file-btn[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{position:absolute;inset:0;opacity:0;cursor:pointer}.ii-btn--primary[_ngcontent-%COMP%]{background:var(--ii-blue);color:#fff}.ii-btn--secondary[_ngcontent-%COMP%]{background:#0f766e;color:#fff}.ii-btn--outline[_ngcontent-%COMP%], .ii-btn--ghost[_ngcontent-%COMP%]{border:1px solid var(--ii-border);background:#fff;color:#334155}.ii-btn--ghost[_ngcontent-%COMP%]{background:var(--ii-bg)}.ii-btn--disabled[_ngcontent-%COMP%]{border:1px solid var(--ii-border);background:#f1f5f9;color:#94a3b8}.ii-btn--xs[_ngcontent-%COMP%]{min-height:28px;padding:0 9px;border-radius:6px;font-size:.72rem}.ii-alert[_ngcontent-%COMP%]{padding:12px 14px;border-radius:8px;font-size:.86rem;font-weight:700}.ii-alert--dismissible[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:12px}.ii-alert--dismissible[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{border:1px solid currentColor;border-radius:6px;background:transparent;color:inherit;cursor:pointer;font:inherit;font-size:.72rem;font-weight:850;padding:4px 8px}.ii-alert--info[_ngcontent-%COMP%]{border:1px solid #bfdbfe;background:#eff6ff;color:#1e3a8a}.ii-alert--danger[_ngcontent-%COMP%]{border:1px solid #fecaca;background:#fef2f2;color:#991b1b}.ii-handoff-alert[_ngcontent-%COMP%]{margin-bottom:12px}.ii-recommendation-filter[_ngcontent-%COMP%]{display:flex;align-items:flex-end;
13gap:10px}.ii-recommendation-filter[_ngcontent-%COMP%]   .ii-field[_ngcontent-%COMP%]{flex:1 1 320px}.ii-grid-filter-summary[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 14px;background:#f8fbfd}.ii-grid-filter-summary[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{flex:0 0 auto;color:var(--ii-muted);font-size:.76rem;font-weight:800}.ii-grid-filter-summary[_ngcontent-%COMP%]   app-ads-manager-grid-filter-chips[_ngcontent-%COMP%]{flex:1 1 320px;min-width:0}.ii-table[_ngcontent-%COMP%]   tr.ii-handoff-row[_ngcontent-%COMP%] > td[_ngcontent-%COMP%]{background:#eff6ff;box-shadow:inset 0 1px #93c5fd,inset 0 -1px #93c5fd}.ii-status-grid[_ngcontent-%COMP%], .ii-kpis[_ngcontent-%COMP%], .ii-detail-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}.ii-status-grid[_ngcontent-%COMP%] > div[_ngcontent-%COMP%], .ii-kpis[_ngcontent-%COMP%] > div[_ngcontent-%COMP%], .ii-detail-grid[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{min-width:0;padding:11px 12px;border:1px solid var(--ii-border);border-radius:8px;background:#fff}.ii-status-grid[_ngcontent-%COMP%]   span[_ngcontent-%COMP%], .ii-kpis[_ngcontent-%COMP%]   span[_ngcontent-%COMP%], .ii-detail-grid[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{display:block;color:var(--ii-muted);font-size:.68rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}.ii-status-grid[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%], .ii-kpis[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%], .ii-detail-grid[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{display:block;margin-top:5px;overflow-wrap:anywhere;color:var(--ii-text);font-size:.9rem}.ii-kpi-summary[_ngcontent-%COMP%]{grid-column:1/-1}.ii-kpis[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{background:#fff}.ii-kpis[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{font-size:1.45rem;line-height:1}.ii-two-column[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:18px}.ii-account-row[_ngcontent-%COMP%], .ii-export-row[_ngcontent-%COMP%]{display:flex;align-items:end;gap:12px;flex-wrap:wrap}.ii-account-meta[_ngcontent-%COMP%]{display:grid;gap:3px;min-width:220px;padding:8px 10px;border:1px solid var(--ii-border);border-radius:8px;background:#fff}.ii-account-meta[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.66rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}.ii-account-meta[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ii-text);font-size:.84rem}.ii-account-meta[_ngcontent-%COMP%]   em[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.75rem;font-style:normal}.ii-account-panel[_ngcontent-%COMP%]{margin-bottom:20px;overflow:visible}.ii-account-panel[_ngcontent-%COMP%]   .ii-account-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(220px,1.2fr) minmax(260px,.9fr) auto;align-items:center;gap:14px;padding:16px}.ii-account-context[_ngcontent-%COMP%]{display:grid;gap:4px;min-width:0}.ii-account-context[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.68rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}.ii-account-context[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{overflow-wrap:anywhere;color:var(--ii-text);font-size:1rem;font-weight:850}.ii-account-context[_ngcontent-%COMP%]   em[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.76rem;font-style:normal}.ii-account-facts[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.ii-account-facts[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{min-width:0;padding:8px 10px;border:1px solid var(--ii-border);border-radius:8px;background:#fff}.ii-account-facts[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{display:block;color:var(--ii-muted);font-size:.64rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}.ii-account-facts[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{display:block;margin-top:4px;overflow:hidden;color:var(--ii-text);font-size:.78rem;font-weight:850;text-overflow:ellipsis;white-space:nowrap}.ii-account-actions[_ngcontent-%COMP%]{justify-content:flex-end}.ii-actions-menu[_ngcontent-%COMP%]{position:relative}.ii-actions-menu[_ngcontent-%COMP%]   summary[_ngcontent-%COMP%]{list-style:none}.ii-actions-menu[_ngcontent-%COMP%]   summary[_ngcontent-%COMP%]::-webkit-details-marker{display:none}.ii-actions-menu__panel[_ngcontent-%COMP%]{position:absolute;z-index:20;top:calc(100% + 8px);right:0;display:grid;min-width:220px;
13gap:6px;padding:8px;border:1px solid var(--ii-border);border-radius:8px;background:#fff;box-shadow:0 18px 40px #0f172a29}.ii-actions-menu__panel[_ngcontent-%COMP%]   .ii-btn[_ngcontent-%COMP%]{justify-content:flex-start;width:100%}.ii-upload-btn[_ngcontent-%COMP%]{position:relative;margin:0;font-weight:850}.ii-upload-btn[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{position:absolute;inset:0;opacity:0;cursor:pointer}.ii-rule-summary[_ngcontent-%COMP%]{margin-top:4px;color:var(--ii-muted);font-size:.76rem;font-weight:650;line-height:1.4}.ii-rule-summary[_ngcontent-%COMP%] + div[_ngcontent-%COMP%]{display:none}.ii-export-row[_ngcontent-%COMP%]{justify-content:space-between}.ii-export-row[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.82rem;font-weight:700}.ii-export-progress[_ngcontent-%COMP%]{display:grid;gap:8px;padding:0 20px 16px}.ii-export-progress[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]:first-child{display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--ii-muted);font-size:.78rem;font-weight:800}.ii-export-progress[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]:first-child   strong[_ngcontent-%COMP%]{color:var(--ii-text)}.ii-progress-track[_ngcontent-%COMP%]{overflow:hidden;height:8px;border-radius:999px;background:#e2e8f0}.ii-progress-track[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{display:block;height:100%;border-radius:inherit;background:var(--ii-blue);transition:width .18s ease}.ii-recommendation-status[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:12px}.ii-recommendation-status[_ngcontent-%COMP%]   div[_ngcontent-%COMP%]{display:grid;gap:4px;min-width:0}.ii-recommendation-status[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ii-text);font-size:.9rem}.ii-recommendation-status[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.8rem;line-height:1.4}.ii-form-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px}.ii-wide[_ngcontent-%COMP%]{grid-column:span 2}.ii-field[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:6px}.ii-field[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.68rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}.ii-field[_ngcontent-%COMP%]   input[_ngcontent-%COMP%], .ii-field[_ngcontent-%COMP%]   select[_ngcontent-%COMP%], .ii-field[_ngcontent-%COMP%]   textarea[_ngcontent-%COMP%]{width:100%;min-height:38px;box-sizing:border-box;padding:8px 10px;border:1px solid var(--ii-border);border-radius:8px;background:#fff;color:var(--ii-text);font:inherit;font-size:.84rem}.ii-field[_ngcontent-%COMP%]   textarea[_ngcontent-%COMP%]{resize:vertical}.ii-check[_ngcontent-%COMP%], .ii-switch-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;min-height:38px;color:#334155;font-size:.83rem;font-weight:800}.ii-muted[_ngcontent-%COMP%]{color:var(--ii-muted)}.ii-option-list[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.ii-option-list[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{padding:7px 9px;border-radius:999px;background:#eff6ff;color:#1d4ed8;font-size:.74rem;font-weight:850}.ii-preview[_ngcontent-%COMP%], .ii-code[_ngcontent-%COMP%], .ii-explanation[_ngcontent-%COMP%]{margin-top:14px;padding:12px 14px;border:1px solid var(--ii-border);border-radius:8px;background:var(--ii-bg);color:#334155;font-size:.84rem;line-height:1.5}.ii-preview[_ngcontent-%COMP%]{display:grid;gap:4px}.ii-preview[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.78rem;font-weight:800}.ii-preview[_ngcontent-%COMP%]   em[_ngcontent-%COMP%]{color:var(--ii-muted);font-style:normal}.ii-code[_ngcontent-%COMP%]{overflow:auto;font-family:Consolas,JetBrains Mono,monospace;white-space:pre-wrap}.ii-table-wrap[_ngcontent-%COMP%]{overflow:auto;border-top:1px solid var(--ii-border)}.ii-table-wrap--short[_ngcontent-%COMP%]{max-height:420px;border:1px solid var(--ii-border);border-radius:8px}.ii-table[_ngcontent-%COMP%]{width:max-content;min-width:100%;border-collapse:collapse}.ii-table[_ngcontent-%COMP%]   th[_ngcontent-%COMP%], .ii-table[_ngcontent-%COMP%]   td[_ngcontent-%COMP%]{padding:10px 11px;border-bottom:1px solid #f1f5f9;text-align:left;vertical-align:top;white-space:nowrap}.ii-table[_ngcontent-%COMP%]   th[_ngcontent-%COMP%]{position:sticky;top:0;z-index:1;background:var(--ii-bg);color:var(--ii-muted);font-size:.68rem;font-weight:850;letter-spacing:.05em;text-transform:uppercase}.ii-table[_ngcontent-%COMP%]   td[_ngcontent-%COMP%]{color:#334155;font-size:.8rem}.ii-table[_ngcontent-%COMP%]   tbody[_ngcontent-%COMP%]   tr[_ngcontent-%COMP%]:hover, .ii-table[_ngcontent-%COMP%]   tr.selected[_ngcontent-%COMP%]{background:#fbfdff}.ii-table[_ngcontent-%COMP%]   th[_ngcontent-%COMP%]{overflow:visible}.ii-table[_ngcontent-%COMP%]   th[_ngcontent-%COMP%]   app-ads-manager-grid-header-cell[_ngcontent-%COMP%]{display:block;min-width:86px}.ii-link-board[_ngcontent-%COMP%]{display:grid;border-top:1px solid var(--ii-border)}.ii-link-board-head[_ngcontent-%COMP%], .ii-link-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(180px,.65fr) minmax(280px,1fr) minmax(280px,1fr);gap:12px;align-items:stretch}.ii-link-board-head[_ngcontent-%COMP%]{position:sticky;top:0;z-index:1;padding:10px 14px;background:var(--ii-bg);color:var(--ii-muted);font-size:.68rem;font-weight:850;letter-spacing:.05em;text-transform:uppercase}.ii-link-row[_ngcontent-%COMP%]{padding:14px;border-top:1px solid #f1f5f9}.ii-link-key[_ngcontent-%COMP%], .ii-route-card[_ngcontent-%COMP%]{min-width:0;padding:10px 12px;border:1px solid var(--ii-border);border-radius:8px;background:#fff}.ii-link-key[_ngcontent-%COMP%]{background:#f8fafc}.ii-link-key[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{display:block;overflow-wrap:anywhere;font-size:.92rem}.ii-link-key[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{display:block;margin-top:4px;color:var(--ii-muted);font-size:.74rem;font-weight:800}.ii-link-stack[_ngcontent-%COMP%]{display:grid;align-content:start;gap:8px}.ii-route-card[_ngcontent-%COMP%]{display:grid;gap:4px}.ii-route-card[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{overflow-wrap:anywhere;color:var(--ii-text);font-size:.82rem}.ii-route-card[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.72rem;line-height:1.35}.ii-route-card[_ngcontent-%COMP%]   em[_ngcontent-%COMP%]{font-style:normal}.ii-route-card--dest[_ngcontent-%COMP%]{border-color:#bfdbfe;background:#eff6ff}.ii-route-card--missing[_ngcontent-%COMP%]{border-color:#fde68a;background:#fffbeb}.ii-empty-cell[_ngcontent-%COMP%]{padding:28px 16px!important;color:var(--ii-muted)!important;text-align:center!important}.ii-manual-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;padding:18px 20px}.ii-manual-grid[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{margin:0 0 10px;font-size:.95rem}.ii-filter-field[_ngcontent-%COMP%]{margin-bottom:10px}
13.ii-action-bar[_ngcontent-%COMP%], .ii-bulk-bar[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:end;gap:10px;margin:0 20px 18px;padding:12px;border:1px solid #bfdbfe;border-radius:8px;background:#eff6ff}.ii-action-bar[_ngcontent-%COMP%] > span[_ngcontent-%COMP%], .ii-action-bar[_ngcontent-%COMP%] > strong[_ngcontent-%COMP%], .ii-bulk-bar[_ngcontent-%COMP%] > span[_ngcontent-%COMP%], .ii-bulk-bar[_ngcontent-%COMP%] > strong[_ngcontent-%COMP%]{color:#0f172a;font-size:.84rem}.ii-action-bar[_ngcontent-%COMP%]   label[_ngcontent-%COMP%], .ii-bulk-bar[_ngcontent-%COMP%]   label[_ngcontent-%COMP%]{display:grid;gap:4px}.ii-action-bar[_ngcontent-%COMP%]   label[_ngcontent-%COMP%]   span[_ngcontent-%COMP%], .ii-bulk-bar[_ngcontent-%COMP%]   label[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.66rem;font-weight:850;text-transform:uppercase}.ii-action-bar[_ngcontent-%COMP%]   label[_ngcontent-%COMP%]   select[_ngcontent-%COMP%], .ii-bulk-bar[_ngcontent-%COMP%]   label[_ngcontent-%COMP%]   select[_ngcontent-%COMP%]{min-height:34px;border:1px solid var(--ii-border);border-radius:8px;background:#fff}.ii-preview-note[_ngcontent-%COMP%]{color:var(--ii-muted)!important;font-size:.74rem!important;font-weight:700}.ii-badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;width:fit-content;padding:3px 8px;border-radius:999px;font-size:.66rem;font-weight:850;letter-spacing:.03em;line-height:1.2;text-transform:uppercase;white-space:nowrap}.ii-badge--green[_ngcontent-%COMP%]{background:#dcfce7;color:#15803d}.ii-badge--blue[_ngcontent-%COMP%]{background:#dbeafe;color:#1d4ed8}.ii-badge--amber[_ngcontent-%COMP%]{background:#fef3c7;color:#b45309}.ii-badge--red[_ngcontent-%COMP%]{background:#fee2e2;color:#b91c1c}.ii-badge--muted[_ngcontent-%COMP%]{background:#f1f5f9;color:#64748b}.ii-confidence[_ngcontent-%COMP%]{display:block;color:var(--ii-teal);font-weight:900}.ii-table[_ngcontent-%COMP%]   em[_ngcontent-%COMP%]{display:block;color:var(--ii-muted);font-size:.68rem;font-style:normal}.ii-pill-btn[_ngcontent-%COMP%]{min-width:52px;min-height:26px;border:1px solid var(--ii-border);border-radius:999px;background:#f1f5f9;color:#64748b;font-size:.72rem;font-weight:850;cursor:pointer}.ii-pill-btn.on[_ngcontent-%COMP%]{border-color:#99f6e4;background:#ccfbf1;color:var(--ii-teal)}.ii-drawer-backdrop[_ngcontent-%COMP%], .ii-modal-backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;z-index:1000;background:#0f172a70}.ii-drawer-backdrop[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.ii-drawer[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:min(820px,100%);height:100vh;background:#fff;box-shadow:-24px 0 70px #0f172a3d}.ii-drawer[_ngcontent-%COMP%]   header[_ngcontent-%COMP%], .ii-drawer[_ngcontent-%COMP%]   footer[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:12px;padding:18px 20px;border-bottom:1px solid var(--ii-border)}.ii-drawer[_ngcontent-%COMP%]   header[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.68rem;font-weight:850;text-transform:uppercase}.ii-drawer[_ngcontent-%COMP%]   h2[_ngcontent-%COMP%]{margin:3px 0 0;font-size:1.2rem}.ii-drawer[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:4px 0 0;color:var(--ii-muted);font-size:.82rem}.ii-drawer[_ngcontent-%COMP%]   footer[_ngcontent-%COMP%]{margin-top:auto;flex-wrap:wrap;justify-content:flex-end;border-top:1px solid var(--ii-border);border-bottom:0}.ii-drawer-body[_ngcontent-%COMP%]{display:grid;gap:18px;overflow:auto;padding:18px 20px}.ii-drawer-body[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{margin:0 0 10px;font-size:.95rem}.ii-check-list[_ngcontent-%COMP%]{display:grid;gap:8px}.ii-check-list[_ngcontent-%COMP%]   div[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:12px;padding:10px 12px;border:1px solid var(--ii-border);border-radius:8px;background:var(--ii-bg)}.ii-check-list[_ngcontent-%COMP%]   .passed[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ii-green)}.ii-check-list[_ngcontent-%COMP%]   .failed[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ii-red)}.ii-modal-backdrop[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:center;overflow:auto;padding:8vh 24px 24px}.ii-modal[_ngcontent-%COMP%]{width:min(520px,100%);border:1px solid var(--ii-border);border-radius:8px;background:#fff;box-shadow:0 24px 70px #0f172a47}.ii-modal--wide[_ngcontent-%COMP%]{width:min(860px,100%)}.ii-modal[_ngcontent-%COMP%]   header[_ngcontent-%COMP%], .ii-modal[_ngcontent-%COMP%]   footer[_ngcontent-%COMP%]{padding:18px 20px}.ii-modal[_ngcontent-%COMP%]   header[_ngcontent-%COMP%]{border-bottom:1px solid var(--ii-border)}.ii-modal[_ngcontent-%COMP%]   .ii-field[_ngcontent-%COMP%]{padding:18px 20px 0}.ii-modal[_ngcontent-%COMP%]   footer[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;
13gap:8px}.ii-issue-list[_ngcontent-%COMP%]{display:grid;gap:8px;max-height:420px;overflow:auto;padding:18px 20px 0}.ii-issue-list[_ngcontent-%COMP%]   div[_ngcontent-%COMP%]{display:grid;grid-template-columns:auto minmax(160px,1fr);gap:5px 10px;padding:10px 12px;border:1px solid var(--ii-border);border-radius:8px;background:var(--ii-bg)}.ii-issue-list[_ngcontent-%COMP%]   em[_ngcontent-%COMP%], .ii-issue-list[_ngcontent-%COMP%]   code[_ngcontent-%COMP%]{grid-column:2;color:var(--ii-muted);font-size:.75rem;font-style:normal}.ii-hint[_ngcontent-%COMP%]{margin:0;color:var(--ii-muted);font-size:.82rem;line-height:1.5}.ii-master-detail[_ngcontent-%COMP%]{display:grid;gap:0;border-top:1px solid var(--ii-border)}.ii-iso-row[_ngcontent-%COMP%]{border-bottom:1px solid #f1f5f9;transition:background .15s ease}.ii-iso-row--expanded[_ngcontent-%COMP%]{background:#f8fafc}.ii-iso-card[_ngcontent-%COMP%]{display:flex;align-items:center;gap:14px;padding:14px 20px;cursor:pointer;transition:background .12s ease}.ii-iso-card[_ngcontent-%COMP%]:hover{background:#f1f5f9}.ii-iso-card__chevron[_ngcontent-%COMP%]{flex-shrink:0;width:18px;color:var(--ii-muted);font-size:.72rem;text-align:center}.ii-iso-card__info[_ngcontent-%COMP%]{flex:1;min-width:0}.ii-iso-card__info[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{display:block;overflow-wrap:anywhere;font-size:.88rem}.ii-iso-card__info[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{display:block;margin-top:3px;color:var(--ii-muted);font-size:.74rem;font-weight:800}.ii-iso-card__badges[_ngcontent-%COMP%]{display:flex;flex-shrink:0;flex-wrap:wrap;gap:6px;align-items:center}.ii-discovery-panel[_ngcontent-%COMP%]{padding:0 20px 16px 52px;animation:_ngcontent-%COMP%_iiSlideDown .18s ease}.ii-discovery-panel__label[_ngcontent-%COMP%]{padding:8px 0}.ii-discovery-panel__label[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.68rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}@keyframes _ngcontent-%COMP%_iiSlideDown{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}.ii-discovery-feeder[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;border:1px solid var(--ii-border);border-radius:8px;background:#fff}.ii-discovery-feeder[_ngcontent-%COMP%] + .ii-discovery-feeder[_ngcontent-%COMP%]{margin-top:6px}.ii-discovery-feeder__info[_ngcontent-%COMP%]{flex:1;min-width:0}.ii-discovery-feeder__info[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{display:block;overflow-wrap:anywhere;font-size:.84rem}.ii-discovery-feeder__info[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{display:block;margin-top:2px;color:var(--ii-muted);font-size:.72rem;line-height:1.35}.ii-discovery-feeder--empty[_ngcontent-%COMP%]{border-style:dashed;background:#fffbeb}.ii-discovery-feeder--empty[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-amber);font-size:.8rem;font-weight:700}.ii-missing-section[_ngcontent-%COMP%]{padding:16px 20px;border-top:1px solid #fde68a;background:#fffbeb}.ii-missing-section__header[_ngcontent-%COMP%]{display:grid;gap:4px;margin-bottom:10px}.ii-missing-section__header[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{font-size:.88rem}.ii-missing-section__header[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.78rem}.ii-missing-row[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:8px 12px;border:1px solid #fde68a;border-radius:8px;background:#fff}.ii-missing-row[_ngcontent-%COMP%] + .ii-missing-row[_ngcontent-%COMP%]{margin-top:6px}.ii-missing-row[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{font-size:.84rem}.ii-missing-row[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{flex:1;color:var(--ii-muted);font-size:.74rem}.ii-manual-links-list[_ngcontent-%COMP%]{border-top:1px solid var(--ii-border);padding:16px 20px}.ii-manual-links-list__header[_ngcontent-%COMP%]{margin-bottom:10px}.ii-manual-links-list__header[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.72rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}.ii-manual-link-row[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:10px 14px;border:1px solid var(--ii-border);border-radius:8px;background:#fff}.ii-manual-link-row[_ngcontent-%COMP%] + .ii-manual-link-row[_ngcontent-%COMP%]{margin-top:6px}.ii-manual-link-row__from[_ngcontent-%COMP%], .ii-manual-link-row__to[_ngcontent-%COMP%]{min-width:0;flex:1}.ii-manual-link-row__from[_ngcontent-%COMP%]   span[_ngcontent-%COMP%], .ii-manual-link-row__to[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{display:block;color:var(--ii-muted);font-size:.62rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}.ii-manual-link-row__from[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%], .ii-manual-link-row__to[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{display:block;overflow-wrap:anywhere;font-size:.82rem}.ii-manual-link-row__arrow[_ngcontent-%COMP%]{flex-shrink:0;color:var(--ii-muted);font-size:1.1rem;font-weight:700}.ii-auto-toolbar[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px}.ii-auto-toolbar__actions[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.ii-iso-card__check[_ngcontent-%COMP%]{flex-shrink:0;cursor:pointer;accent-color:var(--ii-blue)}.ii-iso-row--selected[_ngcontent-%COMP%], .ii-iso-row--selected[_ngcontent-%COMP%]   .ii-iso-card[_ngcontent-%COMP%]{background:#eff6ff}.ii-rule-presets[_ngcontent-%COMP%]{display:grid;gap:8px;padding:16px 20px}.ii-rule-preset-card[_ngcontent-%COMP%]{display:grid;gap:4px;padding:12px 14px;border:1px solid var(--ii-border);border-radius:8px;background:#fff;cursor:pointer;transition:border-color .12s ease,background .12s ease}.ii-rule-preset-card[_ngcontent-%COMP%]:hover{border-color:var(--ii-blue);background:#f8fafc}.ii-rule-preset-card[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{font-size:.88rem}.ii-rule-preset-card[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.76rem;line-height:1.4}.ii-rule-preset-card__actions[_ngcontent-%COMP%]{display:flex;gap:6px;align-items:center}.ii-rules-workspace[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(260px,.42fr) minmax(0,1fr);min-height:620px}.ii-rule-library[_ngcontent-%COMP%]{min-width:0;border-right:1px solid var(--ii-border);background:#f8fafc}.ii-rule-library__header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:14px 16px;border-bottom:1px solid var(--ii-border)}.ii-rule-library__header[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{font-size:.82rem}.ii-rule-library__header[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.72rem;font-weight:800}.ii-rule-library-card[_ngcontent-%COMP%]{display:grid;gap:8px;padding:12px 14px;border-bottom:1px solid var(--ii-border);background:#fff}.ii-rule-library-card.active[_ngcontent-%COMP%]{background:#eff6ff;box-shadow:inset 3px 0 0 var(--ii-blue)}.ii-rule-library-card__main[_ngcontent-%COMP%]{display:grid;gap:4px;min-width:0;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;font:inherit;text-align:left}.ii-rule-library-card__main[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%], .ii-rule-library-card__main[_ngcontent-%COMP%]   span[_ngcontent-%COMP%], .ii-rule-library-card__main[_ngcontent-%COMP%]   em[_ngcontent-%COMP%]{overflow-wrap:anywhere}.ii-rule-library-card__main[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ii-text);font-size:.86rem;font-weight:850}.ii-rule-library-card__main[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:#334155;font-size:.74rem;line-height:1.4}.ii-rule-library-card__main[_ngcontent-%COMP%]   em[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.7rem;font-style:normal;font-weight:750}.ii-rule-library-card__actions[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:6px}.ii-rule-builder[_ngcontent-%COMP%]{min-width:0;background:#fff}.ii-rule-builder__bar[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 20px;border-bottom:1px solid var(--ii-border);background:#fff}.ii-rule-builder__bar[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{display:block;color:var(--ii-muted);font-size:.68rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}.ii-rule-builder__bar[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{display:block;margin-top:3px;overflow-wrap:anywhere;font-size:.96rem}
13.ii-rule-editor[_ngcontent-%COMP%]{padding:0;max-height:60vh;overflow:auto}.ii-rule-section[_ngcontent-%COMP%]{border-bottom:1px solid var(--ii-border)}.ii-rule-section[_ngcontent-%COMP%]:last-child{border-bottom:0}.ii-rule-section__title[_ngcontent-%COMP%]{padding:10px 20px;background:var(--ii-bg);color:var(--ii-muted);font-size:.68rem;font-weight:850;letter-spacing:.05em;text-transform:uppercase}.ii-rule-section__body[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px;padding:14px 20px}.ii-rule-toggle[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:1px solid var(--ii-border);border-radius:8px;background:#fff;grid-column:1/-1;cursor:pointer;transition:border-color .12s}.ii-rule-toggle--on[_ngcontent-%COMP%]{border-color:#bfdbfe;background:#f0f7ff}.ii-rule-toggle[_ngcontent-%COMP%]   input[type=checkbox][_ngcontent-%COMP%]{flex-shrink:0;margin-top:2px;accent-color:var(--ii-blue)}.ii-rule-toggle__label[_ngcontent-%COMP%]{flex:1}.ii-rule-toggle__label[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{display:block;font-size:.84rem}.ii-rule-toggle__label[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{display:block;margin-top:2px;color:var(--ii-muted);font-size:.74rem;line-height:1.4}.ii-rule-toggle__input[_ngcontent-%COMP%]{flex-shrink:0;display:grid;gap:4px;min-width:110px}.ii-rule-toggle__input[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.66rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}.ii-rule-toggle__input[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{min-height:32px;padding:4px 8px;border:1px solid var(--ii-border);border-radius:6px;font:inherit;font-size:.84rem}.ii-input-prefix[_ngcontent-%COMP%], .ii-input-suffix[_ngcontent-%COMP%]{display:flex;align-items:stretch;border:1px solid var(--ii-border);border-radius:8px;overflow:hidden;background:#fff}.ii-input-prefix[_ngcontent-%COMP%]   em[_ngcontent-%COMP%], .ii-input-suffix[_ngcontent-%COMP%]   em[_ngcontent-%COMP%]{display:flex;align-items:center;padding:0 8px;background:var(--ii-bg);color:var(--ii-muted);font-size:.8rem;font-style:normal;font-weight:850;border-right:1px solid var(--ii-border);flex-shrink:0}.ii-input-prefix[_ngcontent-%COMP%]   input[_ngcontent-%COMP%], .ii-input-suffix[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{flex:1;min-width:0;min-height:36px;padding:0 10px;border:0;background:transparent;font:inherit;font-size:.84rem}.ii-input-suffix[_ngcontent-%COMP%]   em[_ngcontent-%COMP%]{border-right:0;border-left:1px solid var(--ii-border)}.ii-input-pct[_ngcontent-%COMP%]{display:flex;align-items:stretch;border:1px solid var(--ii-border);border-radius:6px;overflow:hidden}.ii-input-pct[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{flex:1;min-width:0;min-height:32px;padding:0 8px;border:0;font:inherit;font-size:.84rem}.ii-input-pct[_ngcontent-%COMP%]   em[_ngcontent-%COMP%]{display:flex;align-items:center;padding:0 8px;background:var(--ii-bg);color:var(--ii-muted);font-style:normal;font-weight:850;font-size:.8rem;border-left:1px solid var(--ii-border)}.ii-field--with-tip[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{display:flex;align-items:center;gap:5px}.ii-tip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:999px;background:#e2e8f0;color:#475569;font-size:.6rem;font-style:normal;font-weight:850;cursor:help;text-decoration:none}.ii-field[_ngcontent-%COMP%]   small[_ngcontent-%COMP%]{display:block;margin-top:3px;color:var(--ii-muted);font-size:.72rem}.ii-group-header[_ngcontent-%COMP%]{padding:10px 14px;font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--ii-muted);background:var(--ii-bg);border-bottom:1px solid var(--ii-border);display:flex;align-items:center;justify-content:space-between}.ii-group-header--manual[_ngcontent-%COMP%]{margin-top:24px;border-top:1px solid var(--ii-border)}.ii-export-action-group[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px}.ii-download-timestamp[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px;font-size:.76rem;color:#0d9488;background:#f0fdfa;border:1px solid #ccfbf1;padding:4px 10px;border-radius:999px;font-weight:500}.ii-download-timestamp[_ngcontent-%COMP%]   i[_ngcontent-%COMP%]{font-style:normal}.ii-download-timestamp[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:#0f766e;font-weight:600}@media(max-width:1100px){.ii-account-panel[_ngcontent-%COMP%]   .ii-account-row[_ngcontent-%COMP%]{grid-template-columns:1fr;align-items:stretch}.ii-account-actions[_ngcontent-%COMP%]{justify-content:flex-start}.ii-two-column[_ngcontent-%COMP%], .ii-manual-grid[_ngcontent-%COMP%], .ii-rules-workspace[_ngcontent-%COMP%], .ii-link-board-head[_ngcontent-%COMP%], .ii-link-row[_ngcontent-%COMP%]{grid-template-columns:1fr}.ii-rule-library[_ngcontent-%COMP%]{border-right:0;border-bottom:1px solid var(--ii-border)}.ii-card-header[_ngcontent-%COMP%], .ii-recommendation-status[_ngcontent-%COMP%], .ii-rule-builder__bar[_ngcontent-%COMP%], .ii-export-row[_ngcontent-%COMP%], .ii-drawer[_ngcontent-%COMP%]   header[_ngcontent-%COMP%]{align-items:stretch;flex-direction:column}.ii-wide[_ngcontent-%COMP%]{grid-column:span 1}}@media(max-width:640px){.ii-account-facts[_ngcontent-%COMP%]{grid-template-columns:1fr}}.ii-switch-toggle[_ngcontent-%COMP%]{position:relative;display:inline-block;width:44px;height:24px;
13cursor:pointer;vertical-align:middle}.ii-switch-toggle[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{opacity:0;width:0;height:0}.ii-switch-toggle[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]:checked + .ii-switch-toggle__slider[_ngcontent-%COMP%]{background-color:var(--ii-blue, #2563eb)}.ii-switch-toggle[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]:checked + .ii-switch-toggle__slider[_ngcontent-%COMP%]:before{transform:translate(20px)}.ii-switch-toggle[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]:focus + .ii-switch-toggle__slider[_ngcontent-%COMP%]{box-shadow:0 0 2px var(--ii-blue, #2563eb)}.ii-switch-toggle__slider[_ngcontent-%COMP%]{position:absolute;inset:0;background-color:#cbd5e1;transition:.3s;border-radius:24px}.ii-switch-toggle__slider[_ngcontent-%COMP%]:before{position:absolute;content:"";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;transition:.3s;border-radius:50%;box-shadow:0 1px 3px #00000026}.ii-eyebrow[_ngcontent-%COMP%]{display:block;margin-bottom:6px;color:var(--ii-blue);font-size:.66rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase}.ii-links-card__header[_ngcontent-%COMP%]{align-items:center}.ii-links-state[_ngcontent-%COMP%]{display:grid;justify-items:center;gap:8px;padding:56px 24px;text-align:center}.ii-links-state[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{font-size:1rem}.ii-links-state[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:not(.ii-links-state__spinner,.ii-links-state__icon){max-width:560px;color:var(--ii-muted);font-size:.82rem;line-height:1.5}.ii-links-state--empty[_ngcontent-%COMP%]{min-height:250px;background:radial-gradient(circle at 50% 0,rgba(37,99,235,.08),transparent 48%),#fff}.ii-links-state__icon[_ngcontent-%COMP%]{display:grid;width:44px;height:44px;place-items:center;border-radius:14px;background:#dbeafe;color:var(--ii-blue);font-size:1.35rem;font-weight:900}.ii-links-state__spinner[_ngcontent-%COMP%]{width:28px;height:28px;border:3px solid #dbeafe;border-top-color:var(--ii-blue);border-radius:50%;animation:_ngcontent-%COMP%_iiSpin .8s linear infinite}@keyframes _ngcontent-%COMP%_iiSpin{to{transform:rotate(360deg)}}.ii-group-header--campaigns[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:12px}.ii-group-header--campaigns[_ngcontent-%COMP%]   small[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.7rem;font-weight:700;letter-spacing:0;text-transform:none}.ii-select-all[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:9px;cursor:pointer}.ii-select-all[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{width:16px;height:16px;margin:0;accent-color:var(--ii-blue)}.ii-iso-card[_ngcontent-%COMP%]{cursor:default}.ii-iso-card__expand[_ngcontent-%COMP%]{display:flex;flex:1;align-items:center;gap:14px;min-width:0;padding:4px;border:0;border-radius:7px;background:transparent;color:inherit;text-align:left;cursor:pointer;font:inherit}.ii-iso-card__expand[_ngcontent-%COMP%]:focus-visible{outline:3px solid rgba(37,99,235,.24);outline-offset:2px}.ii-iso-card__chevron[_ngcontent-%COMP%]{display:grid;width:22px;height:22px;place-items:center;border-radius:7px;background:#f1f5f9;color:#475569;font-size:1rem;font-weight:800}.ii-rule-status[_ngcontent-%COMP%]{display:block;margin-top:5px;color:var(--ii-green);font-size:.72rem;font-style:normal;font-weight:650;line-height:1.35}.ii-rule-status--default[_ngcontent-%COMP%]{color:var(--ii-muted)}.ii-badge--success[_ngcontent-%COMP%]{background:#dcfce7;color:#15803d}.ii-badge--manual[_ngcontent-%COMP%]{background:#f3e8ff;color:#7e22ce}.ii-badge--mixed[_ngcontent-%COMP%]{background:#e0e7ff;color:#4338ca}.ii-back-link[_ngcontent-%COMP%]{display:inline-flex;margin:0 0 12px;padding:0;border:0;background:transparent;color:var(--ii-blue);cursor:pointer;font:inherit;font-size:.76rem;font-weight:800}.ii-back-link[_ngcontent-%COMP%]:focus-visible{outline:3px solid rgba(37,99,235,.24);outline-offset:3px}.ii-setup-hero[_ngcontent-%COMP%]{border-color:#bfdbfe}.ii-setup-hero[_ngcontent-%COMP%]   .ii-card-header[_ngcontent-%COMP%]{padding:24px;background:linear-gradient(120deg,#eff6ff,#fff 58%,#f0fdfa)}.ii-setup-summary[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border-top:1px solid #dbeafe}.ii-setup-summary[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{display:grid;gap:4px;padding:16px 24px;background:#fff}.ii-setup-summary[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] + div[_ngcontent-%COMP%]{border-left:1px solid var(--ii-border)}.ii-setup-summary[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:.68rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}.ii-setup-summary[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{font-size:1.28rem;font-weight:900}.ii-count-pill[_ngcontent-%COMP%]{display:inline-flex;min-width:30px;min-height:28px;align-items:center;justify-content:center;padding:0 10px;border-radius:999px;background:#e0e7ff;color:#4338ca;font-size:.72rem;font-weight:900}.ii-discovery-feeder__badges[_ngcontent-%COMP%]{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;
13gap:6px}.ii-detected-setup[_ngcontent-%COMP%]   .ii-card-header[_ngcontent-%COMP%]{align-items:center}.ii-detected-links-list[_ngcontent-%COMP%]{display:grid;gap:8px;padding:0 20px 20px}.ii-detected-link-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(170px,1fr) auto minmax(170px,1fr) auto auto auto;align-items:center;gap:10px;padding:12px 14px;border:1px solid var(--ii-border);border-radius:10px;background:#fff}.ii-detected-link-row--removed[_ngcontent-%COMP%]{border-style:dashed;background:#f8fafc}.ii-detected-link-row--removed[_ngcontent-%COMP%]   .ii-detected-link-row__campaign[_ngcontent-%COMP%]{opacity:.72}.ii-detected-link-row__campaign[_ngcontent-%COMP%]{min-width:0}.ii-detected-link-row__campaign[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{display:block;color:var(--ii-muted);font-size:.62rem;font-weight:850;letter-spacing:.04em;text-transform:uppercase}.ii-detected-link-row__campaign[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{display:block;overflow-wrap:anywhere;font-size:.82rem}.ii-detected-link-row__arrow[_ngcontent-%COMP%]{color:var(--ii-muted);font-size:1.05rem;font-weight:800}.ii-card.ii-missing-section[_ngcontent-%COMP%]{border-color:#fde68a;border-top:1px solid #fde68a}.ii-card.ii-missing-section[_ngcontent-%COMP%]   .ii-missing-section__header[_ngcontent-%COMP%]{display:flex;align-items:flex-end;justify-content:space-between;gap:12px}.ii-card.ii-missing-section[_ngcontent-%COMP%]   .ii-missing-section__header[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{display:grid;gap:2px}.ii-card.ii-missing-section[_ngcontent-%COMP%]   .ii-missing-section__header[_ngcontent-%COMP%]   .ii-eyebrow[_ngcontent-%COMP%]{color:var(--ii-amber)}.ii-missing-row[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{display:grid;flex:1;gap:3px;min-width:220px}.ii-missing-row[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{line-height:1.4}.ii-manual-setup[_ngcontent-%COMP%]   .ii-card-header[_ngcontent-%COMP%], .ii-unlinked-setup[_ngcontent-%COMP%]   .ii-card-header[_ngcontent-%COMP%]{align-items:center}.ii-action-bar--setup[_ngcontent-%COMP%]{position:sticky;bottom:12px;z-index:5;box-shadow:0 10px 28px #0f172a1f}.ii-sr-only[_ngcontent-%COMP%]{position:absolute;width:1px;height:1px;overflow:hidden;padding:0;margin:-1px;border:0;clip:rect(0,0,0,0);white-space:nowrap}@media(max-width:760px){.ii-group-header--campaigns[_ngcontent-%COMP%]{align-items:flex-start;flex-direction:column}.ii-iso-card[_ngcontent-%COMP%]{flex-wrap:wrap;gap:10px;padding:14px}.ii-iso-card__expand[_ngcontent-%COMP%]{order:1;width:calc(100% - 30px)}.ii-iso-card__check[_ngcontent-%COMP%]{order:0}.ii-iso-card__badges[_ngcontent-%COMP%]{order:2;width:100%;padding-left:30px}.ii-discovery-panel[_ngcontent-%COMP%]{padding:0 14px 14px}.ii-setup-summary[_ngcontent-%COMP%]{grid-template-columns:1fr}.ii-setup-summary[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] + div[_ngcontent-%COMP%]{border-top:1px solid var(--ii-border);border-left:0}.ii-card.ii-missing-section[_ngcontent-%COMP%]   .ii-missing-section__header[_ngcontent-%COMP%], .ii-missing-row[_ngcontent-%COMP%]{align-items:stretch;flex-direction:column}.ii-discovery-feeder[_ngcontent-%COMP%]{align-items:flex-start;flex-direction:column}.ii-discovery-feeder__badges[_ngcontent-%COMP%]{justify-content:flex-start}.ii-detected-link-row[_ngcontent-%COMP%]{grid-template-columns:1fr;align-items:stretch}.ii-detected-link-row__arrow[_ngcontent-%COMP%]{transform:rotate(90deg);transform-origin:left center}.ii-detected-link-row[_ngcontent-%COMP%]   .ii-btn[_ngcontent-%COMP%]{justify-self:start}.ii-manual-link-row__arrow[_ngcontent-%COMP%]{transform:rotate(90deg)}}']})};export{bt as IsolationIntelligenceComponent};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.