← back to Commercialrealestate
CRCP email-alerts: snapshot-diff engine + George send wiring (DTD verdict A), dry-run proven, launchd+send gated
91621f0faab60b3c44521778faed2147bb0df181 · 2026-07-12 10:58:04 -0700 · Steve
Files touched
M .gitignoreA data/alerts-config.jsonA data/alerts-state.jsonA scripts/com.steve.crcp-email-alerts.plistA scripts/email-alerts.jsA scripts/run-email-alerts.sh
Diff
commit 91621f0faab60b3c44521778faed2147bb0df181
Author: Steve <steve@designerwallcoverings.com>
Date: Sun Jul 12 10:58:04 2026 -0700
CRCP email-alerts: snapshot-diff engine + George send wiring (DTD verdict A), dry-run proven, launchd+send gated
---
.gitignore | 2 +
data/alerts-config.json | 18 +
data/alerts-state.json | 4160 +++++++++++++++++++++++++++++
scripts/com.steve.crcp-email-alerts.plist | 20 +
scripts/email-alerts.js | 225 ++
scripts/run-email-alerts.sh | 9 +
6 files changed, 4434 insertions(+)
diff --git a/.gitignore b/.gitignore
index 9925182..6261140 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,5 @@ data/assessor.sqlite
data/assessor.sqlite-shm
data/assessor.sqlite-wal
data/dre-cache.json
+
+data/alerts-out/
diff --git a/data/alerts-config.json b/data/alerts-config.json
new file mode 100644
index 0000000..8d9daae
--- /dev/null
+++ b/data/alerts-config.json
@@ -0,0 +1,18 @@
+{
+ "from": "steve@designerwallcoverings.com",
+ "subscribers": [
+ {
+ "email": "steve@designerwallcoverings.com",
+ "name": "Steve",
+ "metros": [
+ "*"
+ ],
+ "segments": [
+ "listings",
+ "brokers"
+ ],
+ "cadence": "daily"
+ }
+ ],
+ "note": "cadence is adjustable per-subscriber (daily|weekly|instant); the launchd plist sets how often this script runs."
+}
\ No newline at end of file
diff --git a/data/alerts-state.json b/data/alerts-state.json
new file mode 100644
index 0000000..8543ab7
--- /dev/null
+++ b/data/alerts-state.json
@@ -0,0 +1,4160 @@
+{
+ "last_run": "2026-07-12T17:56:55.301Z",
+ "seen": {
+ "listings": [
+ "victory13350",
+ "sepulveda8144",
+ "canby7260",
+ "canby7304",
+ "schoenborn17920",
+ "amigo8357",
+ "wilbur9014",
+ "tilden8843",
+ "tilden8837",
+ "sanfernando10004",
+ "vannuys12872",
+ "sherman21627",
+ "owensmouth7129",
+ "hillhaven10139",
+ "wilkinson5214",
+ "vannuys6329",
+ "sepulveda10011",
+ "foothill6851",
+ "comercio5301",
+ "vanowen15840",
+ "canby7454",
+ "correnti12600",
+ "burbank10701",
+ "canoga6020",
+ "crx2560155",
+ "crx2448930",
+ "crx2455873",
+ "crx2592616",
+ "crx2453716",
+ "crx2442308",
+ "crx2412907",
+ "crx2414372",
+ "crx2352672",
+ "crx2413973",
+ "crx2413999",
+ "crx2414120",
+ "crx2412240",
+ "crx2413606",
+ "crx2489729",
+ "crx2455604",
+ "crx2586908",
+ "crx2417808",
+ "crx2569960",
+ "crx2516882",
+ "crx2516587",
+ "crx2563662",
+ "crx2413947",
+ "crx2404653",
+ "crx2558648",
+ "crx2566665",
+ "crx2473428",
+ "crx2488780",
+ "crx2407231",
+ "crx2516979",
+ "crx2141640",
+ "crx2413442",
+ "crx2414348",
+ "crx2413131",
+ "crx2568125",
+ "crx2147226",
+ "crx2159323",
+ "crx1715584",
+ "crx2516747",
+ "crx2589903",
+ "crx1080991",
+ "crx2412770",
+ "crx2413872",
+ "crx2412328",
+ "crx2412878",
+ "crx2584910",
+ "crx2516918",
+ "crx2412641",
+ "crx2569982",
+ "crx2429890",
+ "crx2450078",
+ "crx2595754",
+ "crx2411991",
+ "crx2461695",
+ "crx2559966",
+ "crx2521992",
+ "crx2485727",
+ "crx2429895",
+ "crx2553265",
+ "crx2593834",
+ "crx2492613",
+ "crx1834484",
+ "crx2598330",
+ "crx2599659",
+ "crx2411079",
+ "crx2593838",
+ "crx1940493",
+ "crx2408963",
+ "crx2555977",
+ "crx2459525",
+ "crx2528936",
+ "crx2454897",
+ "crx2448190",
+ "crx2412676",
+ "crx2406533",
+ "crx2488797",
+ "crx2599666",
+ "crx2406488",
+ "crx2516555",
+ "crx2597846",
+ "crx2367932",
+ "crx2359682",
+ "crx2432329",
+ "crx2351569",
+ "crx2501337",
+ "crx2248520",
+ "crx2367942",
+ "crx2444425",
+ "crx2432283",
+ "crx2191344",
+ "crx2563552",
+ "crx2487713",
+ "crx1955522",
+ "crx1938661",
+ "crx2413928",
+ "crx2474522",
+ "crx2444891",
+ "crx2434649",
+ "crx2434648",
+ "crx2597775",
+ "crx2474524",
+ "crx2434647",
+ "crx2487860",
+ "crx2598368",
+ "crx2555996",
+ "crx2420892",
+ "crx2592654",
+ "crx909311",
+ "crx2248442",
+ "crx2243292",
+ "crx2404672",
+ "crx2410775",
+ "crx2411617",
+ "crx2411195",
+ "crx2407966",
+ "crx2457987",
+ "crx2412034",
+ "crx2420813",
+ "crx2438538",
+ "crx2557270",
+ "crx2485705",
+ "crx2516983",
+ "crx2456747",
+ "crx2417819",
+ "crx2521967",
+ "crx2453703",
+ "crx2599675",
+ "crx2598326",
+ "crx2467993",
+ "crx2516738",
+ "crx2557242",
+ "crx2455566",
+ "crx2591312",
+ "crx2601111",
+ "crx2497287",
+ "crx2350112",
+ "crx2596790",
+ "crx2475208",
+ "crx2478438",
+ "crx2468713",
+ "crx2332656",
+ "crx987125",
+ "crx2417508",
+ "crx1471023",
+ "crx2335028",
+ "crx2450916",
+ "crx2431853",
+ "crx1090005",
+ "crx2590728",
+ "crx2571031",
+ "crx2373046",
+ "crx2172554",
+ "crx2178383",
+ "crx2158111",
+ "crx2202052",
+ "crx2361653",
+ "crx2367983",
+ "crx2450894",
+ "crx2296609",
+ "crx2515455",
+ "crx2325704",
+ "crx2596717",
+ "crx2463547",
+ "crx2527434",
+ "crx2405519",
+ "crx2373010",
+ "crx2412036",
+ "crx2558601",
+ "crx2553076",
+ "crx2602754",
+ "crx2595729",
+ "crx2411843",
+ "crx2366367",
+ "crx2489860",
+ "crx2416449",
+ "crx2314970",
+ "crx2586488",
+ "crx1757335",
+ "crx2377976",
+ "crx2451327",
+ "crx2559962",
+ "crx2569955",
+ "crx2516709",
+ "crx2550520",
+ "crx2420124",
+ "crx242195",
+ "crx2530138",
+ "crx2372954",
+ "crx2557260",
+ "crx2464843",
+ "crx1792654",
+ "crx1879977",
+ "crx2521600",
+ "crx2521503",
+ "crx2463693",
+ "crx2403809",
+ "crx2431006",
+ "crx2601161",
+ "crx2412874",
+ "crx2597045",
+ "crx2405897",
+ "crx2551341",
+ "crx2071907",
+ "crx2372980",
+ "crx1164872",
+ "crx2372984",
+ "crx2559970",
+ "crx2407449",
+ "crx2356205",
+ "crx2435605",
+ "crx2568321",
+ "crx2602744",
+ "crx2336124",
+ "crx2322500",
+ "crx2429304",
+ "crx2559892",
+ "crx2428645",
+ "crx2428637",
+ "crx2431106",
+ "crx2439799",
+ "crx2440604",
+ "crx2357325",
+ "crx2468993",
+ "crx2516953",
+ "crx2411859",
+ "crx2601113",
+ "crx2598366",
+ "crx2602750",
+ "crx2413688",
+ "crx2413910",
+ "crx2429891",
+ "crx2600597",
+ "crx2593819",
+ "crx2372968",
+ "crx2438562",
+ "crx2420865",
+ "crx2558725",
+ "crx2529015",
+ "crx2412882",
+ "crx2033266",
+ "crx2520507",
+ "crx2429631",
+ "crx2527427",
+ "crx2520514",
+ "crx2408673",
+ "crx2139753",
+ "crx2250546",
+ "crx2502361",
+ "crx2516814",
+ "crx2356108",
+ "crx1794920",
+ "crx1402455",
+ "crx2453727",
+ "crx2453721",
+ "crx2433226",
+ "crx2376584",
+ "crx1843715",
+ "crx2411002",
+ "crx1751796",
+ "crx2433142",
+ "crx2552525",
+ "crx1875307",
+ "crx2433198",
+ "crx2489432",
+ "crx2417556",
+ "crx2517792",
+ "crx2512893",
+ "crx2491283",
+ "crx2466498",
+ "crx2452428",
+ "crx2368430",
+ "crx2326846",
+ "crx1768605",
+ "crx1728012",
+ "crx2598386",
+ "crx2598352",
+ "crx2584899",
+ "crx2557254",
+ "crx2517002",
+ "crx2451311",
+ "crx2446031",
+ "crx2438711",
+ "crx2420893",
+ "crx2417805",
+ "crx2414163",
+ "crx2413922",
+ "crx2413615",
+ "crx2411174",
+ "crx2393134",
+ "crx2560401",
+ "crx2412972",
+ "crx2411503",
+ "crx2406479",
+ "crx2589933",
+ "crx2458214",
+ "crx2528947",
+ "crx2373274",
+ "crx2435776",
+ "crx2373271",
+ "crx2412897",
+ "crx2381019",
+ "crx2602698",
+ "crx2380711",
+ "crx2517773",
+ "crx2305863",
+ "crx2513076",
+ "crx2487868",
+ "crx2602719",
+ "crx2411602",
+ "crx2412730",
+ "crx2321865",
+ "crx2568139",
+ "crx2568140",
+ "crx1685493",
+ "crx1641989",
+ "crx1450218",
+ "crx1329231",
+ "crx2602473",
+ "crx2555624",
+ "crx2516542",
+ "crx2236344",
+ "crx2166990",
+ "crx2161076",
+ "crx1832570",
+ "crx1747076",
+ "crx2349383",
+ "crx2601077",
+ "crx2598374",
+ "crx2592618",
+ "crx2591306",
+ "crx2557274",
+ "crx2492620",
+ "crx2488951",
+ "crx2488644",
+ "crx2475194",
+ "crx2464659",
+ "crx2454357",
+ "crx2453748",
+ "crx2446015",
+ "crx2414312",
+ "crx2414220",
+ "crx2413390",
+ "crx2412218",
+ "crx2412078",
+ "crx2412019",
+ "crx2411332",
+ "crx2408316",
+ "crx2406735",
+ "crx2099316",
+ "crx1703868",
+ "crx2569966",
+ "crx1823578",
+ "crx2430555",
+ "crx2551324",
+ "crx2451317",
+ "crx2491303",
+ "crx1940288",
+ "crx1163005",
+ "crx2412499",
+ "crx2257159",
+ "crx2307929",
+ "crx2356554",
+ "crx2348985",
+ "crx2453787",
+ "crx2490971",
+ "crx2419928",
+ "crx2351568",
+ "crx2309751",
+ "crx2596350",
+ "crx2328008",
+ "crx1686510",
+ "crx2453759",
+ "crx2437980",
+ "crx2521842",
+ "crx2477882",
+ "crx2328995",
+ "crx1889257",
+ "crx2343456",
+ "crx2180883",
+ "crx1660795",
+ "crx2290389",
+ "crx2158807",
+ "crx2363749",
+ "crx2356596",
+ "crx2415070",
+ "crx2250613",
+ "crx2066415",
+ "crx1953508",
+ "crx2370987",
+ "crx906002",
+ "crx2009674",
+ "crx2226945",
+ "crx2182160",
+ "crx2312500",
+ "crx2185373",
+ "crx1924268",
+ "crx1994020",
+ "crx2432078",
+ "crx2458037",
+ "crx2517650",
+ "crx2357822",
+ "crx1713971",
+ "crx2563113",
+ "crx2365438",
+ "crx2344360",
+ "crx2515180",
+ "crx2516679",
+ "crx2466895",
+ "crx2413343",
+ "crx2404642",
+ "crx2486866",
+ "crx2477472",
+ "crx2558647",
+ "crx2516951",
+ "crx2563649",
+ "crx2373048",
+ "crx2369737",
+ "crx1921631",
+ "crx2170349",
+ "crx2557317",
+ "crx2448706",
+ "crx2416214",
+ "crx2358749",
+ "crx2372714",
+ "crx2466932",
+ "crx2413862",
+ "crx2406705",
+ "crx2592650",
+ "crx1902542",
+ "crx2318404",
+ "crx2487897",
+ "crx2486883",
+ "crx2344816",
+ "crx2598049",
+ "crx2344818",
+ "crx2143793",
+ "crx2325416",
+ "crx2328002",
+ "crx1714324",
+ "crx2358522",
+ "crx2145818",
+ "crx2449672",
+ "crx1987230",
+ "crx2456676",
+ "crx2435647",
+ "crx2316970",
+ "crx2093313",
+ "crx2194175",
+ "crx2370821",
+ "crx2365401",
+ "crx2292940",
+ "crx2375072",
+ "crx2256393",
+ "crx2429601",
+ "crx2517864",
+ "crx2330224",
+ "crx2333064",
+ "crx2368080",
+ "crx2371582",
+ "crx2406293",
+ "crx2372996",
+ "crx2519115",
+ "crx2344488",
+ "crx2449600",
+ "crx2499412",
+ "crx2368662",
+ "crx2589460",
+ "crx1757597",
+ "crx2417836",
+ "crx2340424",
+ "crx2333061",
+ "crx2376288",
+ "crx2477695",
+ "crx2477527",
+ "crx2420067",
+ "crx2466442",
+ "crx2590202",
+ "crx2475831",
+ "crx2412965",
+ "crx2520513",
+ "crx2333062",
+ "crx2516142",
+ "crx2500957",
+ "crx1818030",
+ "crx2596972",
+ "crx2561453",
+ "crx2466644",
+ "crx1452221",
+ "crx2558332",
+ "crx2489815",
+ "crx2416009",
+ "crx2416312",
+ "crx2444470",
+ "crx2325221",
+ "crx2438100",
+ "crx2554125",
+ "crx2429605",
+ "crx2429551",
+ "crx2328455",
+ "crx2416294",
+ "crx2416286",
+ "crx2416321",
+ "crx2416336",
+ "crx2487003",
+ "crx2561168",
+ "crx2585130",
+ "crx2521449",
+ "crx2516759",
+ "crx2300165",
+ "crx2486729",
+ "crx1954127",
+ "crx2368743",
+ "crx2450303",
+ "crx2416275",
+ "crx2439689",
+ "crx2566271",
+ "crx2412639",
+ "crx2558745",
+ "crx2416267",
+ "crx2566207",
+ "crx2593532",
+ "crx2555633",
+ "crx2430730",
+ "crx2351601",
+ "crx2601579",
+ "crx2601123",
+ "crx2589888",
+ "crx2569062",
+ "crx2569045",
+ "crx2514318",
+ "crx2459471",
+ "crx2429554",
+ "crx2413307",
+ "crx2413001",
+ "crx2406729",
+ "crx2159204",
+ "crx2143637",
+ "crx1452034",
+ "crx2553073",
+ "crx2463400",
+ "crx2416610",
+ "crx2403659",
+ "crx2233450",
+ "crx2435632",
+ "crx2259318",
+ "crx2419667",
+ "crx1418952",
+ "crx2407077",
+ "crx2411039",
+ "crx2454839",
+ "crx2290430",
+ "crx2475014",
+ "crx2158204",
+ "crx2599346",
+ "crx2601285",
+ "crx2589872",
+ "crx2454874",
+ "crx2411816",
+ "crx2250620",
+ "crx2199394",
+ "crx2157941",
+ "crx2209408",
+ "crx2325277",
+ "crx2320144",
+ "crx2148172",
+ "crx2299312",
+ "crx2351472",
+ "crx2321196",
+ "crx2157323",
+ "crx1933119",
+ "crx1573719",
+ "crx2148140",
+ "crx2213659",
+ "crx2378444",
+ "crx2451505",
+ "crx2327739",
+ "crx2526164",
+ "crx1705845",
+ "crx2451751",
+ "crx2518680",
+ "crx2215501",
+ "crx2416555",
+ "crx2478397",
+ "crx2448235",
+ "crx1933956",
+ "crx2535653",
+ "crx2535076",
+ "crx2414059",
+ "crx1964727",
+ "crx2589725",
+ "crx1123415",
+ "crx2535321",
+ "crx2336095",
+ "crx2559959",
+ "crx2526695",
+ "crx1715314",
+ "crx2601115",
+ "crx2586531",
+ "crx2566180",
+ "crx2566172",
+ "crx2561160",
+ "crx2560991",
+ "crx2558607",
+ "crx2519309",
+ "crx2476742",
+ "crx2464452",
+ "crx2461228",
+ "crx2454716",
+ "crx2435116",
+ "crx2366653",
+ "crx2196020",
+ "crx2180914",
+ "crx2180895",
+ "crx2180533",
+ "crx2180431",
+ "crx1959728",
+ "crx2522195",
+ "crx2462420",
+ "crx2454906",
+ "crx2412518",
+ "crx2412498",
+ "crx2371805",
+ "crx2157463",
+ "crx2157316",
+ "crx2413418",
+ "crx2252335",
+ "crx1576837",
+ "crx2555586",
+ "crx2444774",
+ "crx2463713",
+ "crx2420897",
+ "crx2158188",
+ "crx1186906",
+ "crx2335806",
+ "crx2456745",
+ "crx2373049",
+ "crx2373002",
+ "crx2563655",
+ "crx2516840",
+ "crx2598218",
+ "crx2468039",
+ "crx2489749",
+ "crx2411151",
+ "crx2413524",
+ "crx2429599",
+ "crx2256560",
+ "crx2240599",
+ "crx2596590",
+ "crx2411317",
+ "crx2457600",
+ "crx2596553",
+ "crx2460569",
+ "crx2589883",
+ "crx2366413",
+ "crx2597749",
+ "crx2596669",
+ "crx2596637",
+ "crx2557428",
+ "crx2526726",
+ "crx2474539",
+ "crx2455340",
+ "crx2450183",
+ "crx2440102",
+ "crx2419023",
+ "crx2373248",
+ "crx2373233",
+ "crx2365708",
+ "crx2362915",
+ "crx2320469",
+ "crx2320234",
+ "crx1856276",
+ "crx2458209",
+ "crx2599758",
+ "crx2598169",
+ "crx2598155",
+ "crx2593829",
+ "crx2591326",
+ "crx2584914",
+ "crx2555994",
+ "crx2528930",
+ "crx2516883",
+ "crx2516715",
+ "crx2501569",
+ "crx2477456",
+ "crx2476184",
+ "crx2456748",
+ "crx2432189",
+ "crx2417792",
+ "crx2413825",
+ "crx2413144",
+ "crx2411671",
+ "crx2410331",
+ "crx2409531",
+ "crx2404984",
+ "crx2374309",
+ "crx2321550",
+ "crx2319654",
+ "crx2557267",
+ "crx2553266",
+ "crx2491333",
+ "crx2412548",
+ "crx2412457",
+ "crx2412260",
+ "crx2327842",
+ "crx2156710",
+ "crx2356138",
+ "crx2558669",
+ "crx2458180",
+ "crx2412407",
+ "crx2437892",
+ "crx2561699",
+ "crx2499452",
+ "crx2443486",
+ "crx2512522",
+ "crx2410157",
+ "crx2416558",
+ "crx2413034",
+ "crx2378355",
+ "crx2502637",
+ "crx2446005",
+ "crx2586959",
+ "crx2451326",
+ "crx2485745",
+ "crx2586352",
+ "crx2516781",
+ "crx2516778",
+ "crx2407199",
+ "crx2453697",
+ "crx2527474",
+ "crx2516881",
+ "crx2414176",
+ "crx2460636",
+ "crx2551303",
+ "crx2559760",
+ "crx2438552",
+ "crx2516548",
+ "crx2586364",
+ "crx2551308",
+ "crx2527472",
+ "crx2408992",
+ "crx2516949",
+ "crx2592636",
+ "crx2591344",
+ "crx2528945",
+ "crx2599223",
+ "crx1687173",
+ "crx1950482",
+ "crx1681284",
+ "crx2600670",
+ "crx2599766",
+ "crx2599540",
+ "crx2599382",
+ "crx2592193",
+ "crx2586957",
+ "crx2585080",
+ "crx2566136",
+ "crx2563693",
+ "crx2561730",
+ "crx2561711",
+ "crx2520449",
+ "crx2516584",
+ "crx2513127",
+ "crx2512725",
+ "crx2502492",
+ "crx2502484",
+ "crx2501678",
+ "crx2501482",
+ "crx2501398",
+ "crx2501364",
+ "crx2501119",
+ "crx2501114",
+ "crx2493395",
+ "crx2492824",
+ "crx2492576",
+ "crx2489813",
+ "crx2486799",
+ "crx2478311",
+ "crx2476236",
+ "crx2475803",
+ "crx2474574",
+ "crx2465002",
+ "crx2464752",
+ "crx2461503",
+ "crx2458130",
+ "crx2455582",
+ "crx2452021",
+ "crx2451223",
+ "crx2451161",
+ "crx2445528",
+ "crx2443454",
+ "crx2443442",
+ "crx2443430",
+ "crx2436694",
+ "crx2435832",
+ "crx2428216",
+ "crx2412337",
+ "crx2374997",
+ "crx2361985",
+ "crx2316623",
+ "crx2190749",
+ "crx2036352",
+ "crx2348001",
+ "crx2557404",
+ "crx2598250",
+ "crx2563576",
+ "crx2468914",
+ "crx2445984",
+ "crx2438540",
+ "crx2345273",
+ "crx2340416",
+ "crx1933230",
+ "crx2602695",
+ "crx2598363",
+ "crx2566700",
+ "crx2551387",
+ "crx2540970",
+ "crx2491338",
+ "crx2488753",
+ "crx2464934",
+ "crx2460678",
+ "crx2458193",
+ "crx2456771",
+ "crx2453729",
+ "crx2453699",
+ "crx2448949",
+ "crx2448180",
+ "crx2431069",
+ "crx2427704",
+ "crx2414181",
+ "crx2414136",
+ "crx2413927",
+ "crx2413860",
+ "crx2413447",
+ "crx2412954",
+ "crx2408217",
+ "crx2405515",
+ "crx2404505",
+ "crx2381491",
+ "crx2377000",
+ "crx2592644",
+ "crx2584932",
+ "crx2563661",
+ "crx2555981",
+ "crx2528949",
+ "crx2527439",
+ "crx2521988",
+ "crx2521961",
+ "crx2516643",
+ "crx2474576",
+ "crx2447171",
+ "crx2413713",
+ "crx2412735",
+ "crx2227723",
+ "crx2519363",
+ "crx2558159",
+ "crx2553085",
+ "crx2527460",
+ "crx2462656",
+ "crx2411951",
+ "crx2411949",
+ "crx2408988",
+ "crx2406389",
+ "crx2601104",
+ "crx2455605",
+ "crx2455603",
+ "crx2439835",
+ "crx2413728",
+ "crx1629559",
+ "crx1629548",
+ "crx2497416",
+ "crx2407361",
+ "crx2418989",
+ "crx2413574",
+ "crx2517485",
+ "crx2376444",
+ "crx2431095",
+ "crx2455513",
+ "crx2404113",
+ "crx2570009",
+ "crx2412313",
+ "crx2406689",
+ "crx2414338",
+ "crx2516762",
+ "crx2552456",
+ "crx2402556",
+ "crx2413223",
+ "crx2591304",
+ "crx2516905",
+ "crx2440762",
+ "crx2491328",
+ "crx2560421",
+ "crx2599665",
+ "crx2404710",
+ "crx2517516",
+ "crx2316601",
+ "crx2451298",
+ "crx2517468",
+ "crx2411295",
+ "crx2416579",
+ "crx2404110",
+ "crx2553100",
+ "crx2599677",
+ "crx2462664",
+ "crx2434675",
+ "crx2560630",
+ "crx2477465",
+ "crx2473424",
+ "crx2447186",
+ "crx2434627",
+ "crx2433212",
+ "crx2413035",
+ "crx2406328",
+ "crx2403573",
+ "crx2376758",
+ "crx2333676",
+ "crx2296399",
+ "crx2598349",
+ "crx2551325",
+ "crx2488742",
+ "crx2439776",
+ "crx2414116",
+ "crx2413345",
+ "crx2413336",
+ "crx2599618",
+ "crx2417793",
+ "crx2568106",
+ "crx2540961",
+ "crx2454859",
+ "crx2591338",
+ "crx2528950",
+ "crx2365685",
+ "crx2434876",
+ "crx2520525",
+ "crx2413768",
+ "crx2488755",
+ "crx2433208",
+ "crx2439794",
+ "crx2434628",
+ "crx2486894",
+ "crx2593811",
+ "crx2178368",
+ "crx2404432",
+ "crx2602706",
+ "crx1448619",
+ "crx2586497",
+ "crx2586327",
+ "crx2568142",
+ "crx2308999",
+ "crx2287481",
+ "crx2226450",
+ "crx2602745",
+ "crx2560625",
+ "crx2558653",
+ "crx2553078",
+ "crx2552469",
+ "crx2527607",
+ "crx2519217",
+ "crx2519201",
+ "crx2516651",
+ "crx2477489",
+ "crx2453709",
+ "crx2448200",
+ "crx2413632",
+ "crx2411834",
+ "crx2411141",
+ "crx2408932",
+ "crx2377141",
+ "crx2377125",
+ "crx2553074",
+ "crx2492625",
+ "crx2460646",
+ "crx2543442",
+ "crx2349804",
+ "crx2566737",
+ "crx2434669",
+ "crx2599660",
+ "crx2408540",
+ "crx2516909",
+ "crx2413640",
+ "crx2459455",
+ "crx2412067",
+ "crx2408928",
+ "crx2488799",
+ "crx2287326",
+ "crx1702025",
+ "crx1952108",
+ "crx2526682",
+ "crx2442728",
+ "crx2513013",
+ "crx2412899",
+ "crx2408308",
+ "crx1685616",
+ "crx2478184",
+ "crx2179107",
+ "crx1458385",
+ "crx2561289",
+ "crx2334379",
+ "crx2073991",
+ "crx2438655",
+ "crx1703229",
+ "crx2453765",
+ "crx2556150",
+ "crx2487977",
+ "crx1510274",
+ "crx2602494",
+ "crx2305101",
+ "crx2586746",
+ "crx2366578",
+ "crx2599722",
+ "crx2589899",
+ "crx2366567",
+ "crx2555951",
+ "crx1557189",
+ "crx2417761",
+ "crx2602704",
+ "crx2453732",
+ "crx2377373",
+ "crx2412165",
+ "crx2158848",
+ "crx2592670",
+ "crx2466736",
+ "crx2559958",
+ "crx2559961",
+ "crx2410869",
+ "crx2489956",
+ "crx2593845",
+ "crx2561619",
+ "crx2599697",
+ "crx2596906",
+ "crx2489939",
+ "crx2527463",
+ "crx2541002",
+ "crx2558616",
+ "crx2434632",
+ "crx2406757",
+ "crx2595745",
+ "crx2412682",
+ "crx2420089",
+ "crx2141657",
+ "crx2591320",
+ "crx2516655",
+ "crx2455887",
+ "crx2440749",
+ "crx2413875",
+ "crx2327776",
+ "crx2330522",
+ "crx1743539",
+ "crx1728949",
+ "crx2414230",
+ "crx1756341",
+ "crx2336784",
+ "crx2412541",
+ "crx2414231",
+ "crx2431728",
+ "crx2456759",
+ "crx2413459",
+ "crx2529985",
+ "crx2541040",
+ "crx2589247",
+ "crx2561615",
+ "crx2553093",
+ "crx2466758",
+ "crx2527612",
+ "crx2599698",
+ "crx2569997",
+ "crx2254644",
+ "crx2411558",
+ "crx2599750",
+ "crx2527469",
+ "crx1936101",
+ "crx2413988",
+ "crx2376418",
+ "crx2449613",
+ "crx2442081",
+ "crx2453694",
+ "crx2464965",
+ "crx2561599",
+ "crx2519219",
+ "crx2561596",
+ "crx2592610",
+ "crx2448163",
+ "crx2598388",
+ "crx2306023",
+ "crx2598376",
+ "crx2314152",
+ "crx2566673",
+ "crx2447188",
+ "crx2555995",
+ "crx2598375",
+ "crx2413588",
+ "crx2593836",
+ "crx2474518",
+ "crx2519090",
+ "crx2414323",
+ "crx2464964",
+ "crx2491311",
+ "crx2590869",
+ "crx2516670",
+ "crx2552460",
+ "crx2345099",
+ "crx2412014",
+ "crx2447157",
+ "crx2435757",
+ "crx2461711",
+ "crx2431081",
+ "crx2599695",
+ "crx2593810",
+ "crx2586524",
+ "crx2442299",
+ "crx2434671",
+ "crx2413780",
+ "crx2452402",
+ "crx2371836",
+ "crx2595730",
+ "crx2516735",
+ "crx2492602",
+ "crx2413534",
+ "crx2410511",
+ "crx2440774",
+ "crx2568096",
+ "crx2412870",
+ "crx2566828",
+ "crx2593826",
+ "crx2411353",
+ "crx2558598",
+ "crx2449583",
+ "crx2516934",
+ "crx2560392",
+ "crx2516574",
+ "crx2558602",
+ "crx2403330",
+ "crx2458200",
+ "crx2413782",
+ "crx2551291",
+ "crx2527458",
+ "crx2405784",
+ "crx2411574",
+ "crx2492614",
+ "crx2454843",
+ "crx2413784",
+ "crx2516948",
+ "crx2601102",
+ "crx2468995",
+ "crx2487866",
+ "crx2516893",
+ "crx2455659",
+ "crx2410171",
+ "crx2407799",
+ "crx2405626",
+ "crx2516956",
+ "crx2381755",
+ "crx2516939",
+ "crx2602700",
+ "crx2598340",
+ "crx2418958",
+ "crx2407788",
+ "crx2413783",
+ "crx2555984",
+ "crx2412995",
+ "crx1918030",
+ "crx2568098",
+ "crx2454871",
+ "crx1934624",
+ "crx2595779",
+ "crx2420898",
+ "crx2414019",
+ "crx2592667",
+ "crx2413104",
+ "crx2413032",
+ "crx2516965",
+ "crx2408312",
+ "crx2433205",
+ "crx2433203",
+ "crx2437021",
+ "crx2598383",
+ "crx2179389",
+ "crx1932203",
+ "crx2412044",
+ "crx2187690",
+ "crx2406354",
+ "crx2368880",
+ "crx2143280",
+ "crx2410684",
+ "crx2403415",
+ "crx2411221",
+ "crx2560186",
+ "crx2584905",
+ "crx2527459",
+ "crx2474530",
+ "crx2448197",
+ "crx2602723",
+ "crx2319320",
+ "crx2412413",
+ "crx2517322",
+ "crx2596977",
+ "crx2455541",
+ "crx2349409",
+ "crx2517764",
+ "crx2410362",
+ "crx2410631",
+ "crx2563677",
+ "crx2359558",
+ "crx2446033",
+ "crx2560422",
+ "crx2541030",
+ "crx2413106",
+ "crx2378387",
+ "crx2527455",
+ "crx2541014",
+ "crx2563636",
+ "crx2599658",
+ "crx2566685",
+ "crx2491341",
+ "crx2527957",
+ "crx2558640",
+ "crx2416522",
+ "crx2458203",
+ "crx2464933",
+ "crx2601130",
+ "crx2516603",
+ "crx2464928",
+ "crx2451318",
+ "crx2521412",
+ "crx2599898",
+ "crx2516999",
+ "crx2410323",
+ "crx2159173",
+ "crx2431096",
+ "crx2602715",
+ "crx2516790",
+ "crx2477534",
+ "crx2563633",
+ "crx2561616",
+ "crx2434630",
+ "crx2563678",
+ "crx2520536",
+ "crx2030904",
+ "crx2460389",
+ "crx2593878",
+ "crx2433169",
+ "crx2569987",
+ "crx2485730",
+ "crx2242128",
+ "crx2477481",
+ "crx2412976",
+ "crx2558611",
+ "crx2412189",
+ "crx2488749",
+ "crx2406739",
+ "crx2413585",
+ "crx2520531",
+ "crx2404517",
+ "crx2474155",
+ "crx2489001",
+ "crx2489004",
+ "crx2559978",
+ "crx2401405",
+ "crx2452400",
+ "crx2408202",
+ "crx2475209",
+ "crx2442735",
+ "crx2502431",
+ "crx2516785",
+ "crx2348980",
+ "crx2455598",
+ "crx2414264",
+ "crx2377175",
+ "crx2519200",
+ "crx2520090",
+ "crx2446940",
+ "crx2598484",
+ "crx2411992",
+ "crx2488990",
+ "crx2516915",
+ "crx2592645",
+ "crx2591300",
+ "crx2602753",
+ "crx1995624",
+ "crx2431090",
+ "crx2559983",
+ "crx2412810",
+ "crx2387769",
+ "crx2561622",
+ "crx2458212",
+ "crx2516734",
+ "crx2561571",
+ "crx2377555",
+ "crx2406922",
+ "crx2413997",
+ "crx2540966",
+ "crx2469004",
+ "crx2440760",
+ "crx2570948",
+ "crx2551305",
+ "crx2527961",
+ "crx2413841",
+ "crx2554625",
+ "crx2413387",
+ "crx2413350",
+ "crx2592630",
+ "crx2592637",
+ "crx2445985",
+ "crx2556826",
+ "crx2461738",
+ "crx2602728",
+ "crx2413489",
+ "crx2528946",
+ "crx2463593",
+ "crx1843503",
+ "crx1778325",
+ "crx2167352",
+ "crx2036512",
+ "crx2291745",
+ "crx1691733",
+ "crx1778455",
+ "crx1447055",
+ "crx2340247",
+ "crx2073931",
+ "crx606157",
+ "crx1721775",
+ "crx2093256",
+ "crx2326709",
+ "crx2352655",
+ "crx2014256",
+ "crx2430836",
+ "crx2497304",
+ "crx2515144",
+ "crx2464726",
+ "crx2456672",
+ "crx2600019",
+ "crx2599714",
+ "crx1757609",
+ "crx1225945",
+ "crx2214428",
+ "crx2437496",
+ "crx1937381",
+ "crx2326314",
+ "crx677880",
+ "crx2501484",
+ "crx2476282",
+ "crx2355654",
+ "crx2197082",
+ "crx2349278",
+ "crx2187669",
+ "crx1650576",
+ "crx2429988",
+ "crx2366702",
+ "crx1713271",
+ "crx2446624",
+ "crx1980548",
+ "crx2320460",
+ "crx2551374",
+ "crx2433920",
+ "crx2031769",
+ "crx2453551",
+ "crx1660521",
+ "crx2237870",
+ "crx1073690",
+ "crx2014216",
+ "crx2450929",
+ "crx2260474",
+ "crx2348341",
+ "crx2460710",
+ "crx2188730",
+ "crx1698627",
+ "crx2332753",
+ "crx1671584",
+ "crx2327880",
+ "crx1980720",
+ "crx2343384",
+ "crx2238025",
+ "crx2467935",
+ "crx2214362",
+ "crx2193297",
+ "crx2259444",
+ "crx2566876",
+ "crx2349701",
+ "crx2554154",
+ "crx2255713",
+ "crx2212779",
+ "crx2529633",
+ "crx2566241",
+ "crx2358735",
+ "crx2609679",
+ "crx2606201",
+ "crx2603678",
+ "crx2604364",
+ "crx2604798",
+ "crx2604893",
+ "crx2489432",
+ "crx2609172",
+ "crx2416574",
+ "crx2589964",
+ "crx2604355",
+ "crx2604802",
+ "crx2614532",
+ "crx2561604",
+ "crx2603543",
+ "crx2606953",
+ "crx2442298",
+ "crx2609645",
+ "crx2412877",
+ "crx2606936",
+ "crx2604325",
+ "crx2609681",
+ "crx2608606",
+ "crx2603526",
+ "crx2226182",
+ "crx2093289",
+ "crx2093257",
+ "crx2566392",
+ "crx2461374",
+ "crx2447142",
+ "crx2557330",
+ "crx2477572",
+ "crx2411578",
+ "crx2477551",
+ "crx2609673",
+ "crx2409230",
+ "crx2414298",
+ "crx2350609",
+ "crx2589645",
+ "crx2439834",
+ "crx2513128",
+ "crx2410227",
+ "crx2429882",
+ "crx2595796",
+ "crx2568104",
+ "crx2488786",
+ "crx2408322",
+ "crx2520545",
+ "crx2412943",
+ "crx2516697",
+ "crx2414008",
+ "crx2596907",
+ "crx2554543",
+ "crx2434621",
+ "crx2456760",
+ "crx2414077",
+ "crx2409242",
+ "crx2603521",
+ "crx2516644",
+ "crx2594073",
+ "crx2614527",
+ "crx2381680",
+ "crx2516631",
+ "crx2606951",
+ "crx2306606",
+ "crx2516906",
+ "crx2413424",
+ "crx2516687",
+ "crx2408220",
+ "crx2351478",
+ "crx2413467",
+ "crx2411797",
+ "crx2454841",
+ "crx2344497",
+ "crx2333062",
+ "crx2344104",
+ "crx2163841",
+ "crx2377968",
+ "crx2413601",
+ "crx1818021",
+ "crx2414098",
+ "crx2378366",
+ "crx2413358",
+ "crx2412905",
+ "crx2410462",
+ "crx2410164",
+ "crx2407797",
+ "crx2412908",
+ "crx2412952",
+ "crx2412432",
+ "crx2609051",
+ "crx2606996",
+ "crx1926731",
+ "crx2374308",
+ "crx2596755",
+ "crx2487974",
+ "crx1915753",
+ "crx2596799",
+ "crx1920588",
+ "crx2416259",
+ "crx2596786",
+ "crx2312604",
+ "crx2487879",
+ "crx1940231",
+ "crx2412031",
+ "crx2553089",
+ "crx2566199",
+ "crx2414100",
+ "crx2412018",
+ "crx2410437",
+ "crx2615276",
+ "crx2557261",
+ "crx2609648",
+ "crx2408886",
+ "crx2381192",
+ "crx2468963",
+ "crx2592638",
+ "crx2602687",
+ "crx2341492",
+ "crx2434661",
+ "crx2464963",
+ "crx2434679",
+ "crx2598359",
+ "crx2462651",
+ "crx2485722",
+ "crx2411812",
+ "crx2491335",
+ "crx2413360",
+ "crx2592875",
+ "crx1897755",
+ "crx2416575",
+ "crx2439549",
+ "crx2615212",
+ "crx2403323",
+ "crx2229248",
+ "crx2554334",
+ "crx2475691",
+ "crx2604487",
+ "crx2609210",
+ "crx2615128",
+ "crx2412992",
+ "crx2448910",
+ "crx2561623",
+ "crx2609661",
+ "crx2614546",
+ "crx2606300",
+ "crx2615673",
+ "crx2428492",
+ "crx2603539",
+ "crx796132",
+ "crx2312257",
+ "crx2413526",
+ "crx2318899",
+ "crx1734854",
+ "crx2411749",
+ "crx2407801",
+ "crx388635",
+ "crx2413591",
+ "crx2377155",
+ "crx2438612",
+ "crx2552486",
+ "crx2516901",
+ "crx2561794",
+ "crx2431111",
+ "crx2560684",
+ "crx2516662",
+ "crx2568114",
+ "crx2527424",
+ "crx2606926",
+ "crx2596634",
+ "crx2592643",
+ "crx2593816",
+ "crx2430080",
+ "crx2609672",
+ "crx2606291",
+ "crx2457628",
+ "crx2615527",
+ "crx2615525",
+ "crx2609684",
+ "crx2615109",
+ "crx1749210",
+ "crx2554545",
+ "crx2560423",
+ "crx2609666",
+ "crx2554530",
+ "crx2435748",
+ "crx2596912",
+ "crx2450870",
+ "crx2374271",
+ "crx2492648",
+ "crx2443531",
+ "crx2603553",
+ "crx2433230",
+ "crx2466760",
+ "crx2414240",
+ "crx2446967",
+ "crx2475003",
+ "crx2615532",
+ "crx2008004",
+ "crx2526686",
+ "crx2492641",
+ "crx2419003",
+ "crx2609690",
+ "crx2606925",
+ "crx2442733",
+ "crx2606932",
+ "crx2620617"
+ ],
+ "brokers": [
+ "293",
+ "1015",
+ "205",
+ "1016",
+ "196",
+ "238",
+ "177",
+ "178",
+ "20",
+ "171",
+ "311",
+ "26",
+ "17",
+ "641",
+ "622",
+ "805",
+ "546",
+ "557",
+ "44",
+ "4302",
+ "281",
+ "1079",
+ "547",
+ "3942",
+ "396",
+ "265",
+ "1036",
+ "271",
+ "556",
+ "590",
+ "589",
+ "825",
+ "313",
+ "31",
+ "240",
+ "174",
+ "3948",
+ "645",
+ "432",
+ "4",
+ "61",
+ "237",
+ "153",
+ "1580",
+ "809",
+ "282",
+ "485",
+ "569",
+ "973",
+ "273",
+ "4287",
+ "3957",
+ "1272",
+ "253",
+ "1831",
+ "829",
+ "1829",
+ "4402",
+ "3936",
+ "261",
+ "207",
+ "1226",
+ "1225",
+ "435",
+ "881",
+ "4044",
+ "1832",
+ "880",
+ "811",
+ "565",
+ "4158",
+ "444",
+ "4020",
+ "961",
+ "1224",
+ "1166",
+ "517",
+ "445",
+ "1833",
+ "433",
+ "1830",
+ "566",
+ "1834",
+ "336",
+ "830",
+ "1099",
+ "919",
+ "1367",
+ "3885",
+ "18",
+ "1013",
+ "1122",
+ "194",
+ "1037",
+ "946",
+ "580",
+ "816",
+ "1261",
+ "1167",
+ "597",
+ "258",
+ "582",
+ "272",
+ "1384",
+ "859",
+ "269",
+ "991",
+ "257",
+ "3891",
+ "394",
+ "869",
+ "868",
+ "409",
+ "356",
+ "16",
+ "637",
+ "552",
+ "1253",
+ "1062",
+ "395",
+ "167",
+ "1171",
+ "1249",
+ "519",
+ "598",
+ "388",
+ "337",
+ "1080",
+ "579",
+ "1107",
+ "345",
+ "35",
+ "4170",
+ "611",
+ "659",
+ "1106",
+ "239",
+ "1691",
+ "457",
+ "699",
+ "1668",
+ "3933",
+ "3990",
+ "1227",
+ "1652",
+ "1465",
+ "1303",
+ "319",
+ "509",
+ "702",
+ "1459",
+ "1809",
+ "1402",
+ "482",
+ "3904",
+ "1856",
+ "997",
+ "1200",
+ "1403",
+ "1838",
+ "41",
+ "254",
+ "563",
+ "540",
+ "3899",
+ "1530",
+ "1463",
+ "1001",
+ "1685",
+ "1704",
+ "1125",
+ "1821",
+ "738",
+ "148",
+ "1126",
+ "535",
+ "1149",
+ "4300",
+ "4139",
+ "1355",
+ "682",
+ "837",
+ "1327",
+ "1601",
+ "1586",
+ "1356",
+ "707",
+ "674",
+ "154",
+ "1000",
+ "1823",
+ "1808",
+ "1851",
+ "5356",
+ "298",
+ "1498",
+ "526",
+ "998",
+ "285",
+ "1462",
+ "1134",
+ "1049",
+ "1600",
+ "1325",
+ "612",
+ "414",
+ "473",
+ "1011",
+ "1153",
+ "796",
+ "1304",
+ "1081",
+ "280",
+ "1755",
+ "524",
+ "55",
+ "262",
+ "1305",
+ "385",
+ "758",
+ "4088",
+ "976",
+ "4178",
+ "1274",
+ "4063",
+ "626",
+ "1100",
+ "1666",
+ "1174",
+ "1004",
+ "810",
+ "483",
+ "539",
+ "3896",
+ "1822",
+ "4098",
+ "625",
+ "408",
+ "218",
+ "513",
+ "413",
+ "3965",
+ "1044",
+ "1112",
+ "826",
+ "1852",
+ "1386",
+ "3929",
+ "1628",
+ "1597",
+ "832",
+ "4211",
+ "548",
+ "347",
+ "1043",
+ "631",
+ "72",
+ "4466",
+ "4154",
+ "4133",
+ "610",
+ "4304",
+ "1941",
+ "574",
+ "581",
+ "59",
+ "393",
+ "4355",
+ "318",
+ "717",
+ "614",
+ "660",
+ "188",
+ "744",
+ "1370",
+ "4119",
+ "1940",
+ "900",
+ "907",
+ "1035",
+ "1482",
+ "4208",
+ "424",
+ "423",
+ "3975",
+ "179",
+ "1549",
+ "1855",
+ "4024",
+ "4210",
+ "192",
+ "3973",
+ "223",
+ "1282",
+ "1354",
+ "1364",
+ "848",
+ "701",
+ "1495",
+ "1328",
+ "1128",
+ "190",
+ "4411",
+ "979",
+ "455",
+ "782",
+ "4255",
+ "1010",
+ "561",
+ "1338",
+ "1636",
+ "665",
+ "1596",
+ "4422",
+ "4107",
+ "1786",
+ "4417",
+ "1700",
+ "4495",
+ "260",
+ "1846",
+ "1643",
+ "823",
+ "3993",
+ "1664",
+ "4198",
+ "667",
+ "1709",
+ "4502",
+ "3956",
+ "1431",
+ "996",
+ "835",
+ "4431",
+ "467",
+ "1960",
+ "629",
+ "959",
+ "3951",
+ "331",
+ "4272",
+ "1420",
+ "1641",
+ "1791",
+ "226",
+ "1789",
+ "4175",
+ "1854",
+ "380",
+ "1842",
+ "1914",
+ "4191",
+ "4435",
+ "4371",
+ "229",
+ "773",
+ "7",
+ "3880",
+ "201",
+ "1172",
+ "1729",
+ "1252",
+ "1275",
+ "1623",
+ "4409",
+ "4234",
+ "69",
+ "4179",
+ "149",
+ "4444",
+ "4200",
+ "3980",
+ "474",
+ "922",
+ "1655",
+ "1919",
+ "1132",
+ "1179",
+ "4508",
+ "1718",
+ "486",
+ "3926",
+ "1553",
+ "37",
+ "1816",
+ "4114",
+ "3878",
+ "4009",
+ "1573",
+ "974",
+ "1524",
+ "1440",
+ "1271",
+ "804",
+ "1739",
+ "4511",
+ "1740",
+ "1665",
+ "4172",
+ "1196",
+ "156",
+ "4136",
+ "299",
+ "3953",
+ "33",
+ "511",
+ "4101",
+ "864",
+ "4342",
+ "1130",
+ "1277",
+ "3989",
+ "4268",
+ "29",
+ "4106",
+ "571",
+ "4028",
+ "1732",
+ "1221",
+ "4197",
+ "30",
+ "1910",
+ "34",
+ "62",
+ "301",
+ "4327",
+ "4095",
+ "772",
+ "3977",
+ "4148",
+ "1353",
+ "3995",
+ "426",
+ "3888",
+ "451",
+ "4352",
+ "191",
+ "339",
+ "346",
+ "1928",
+ "420",
+ "3997",
+ "24",
+ "3961",
+ "4189",
+ "1",
+ "365",
+ "1843",
+ "4506",
+ "4016",
+ "1806",
+ "889",
+ "1473",
+ "838",
+ "1546",
+ "225",
+ "1056",
+ "4293",
+ "4346",
+ "297",
+ "4086",
+ "4183",
+ "783",
+ "4476",
+ "215",
+ "199",
+ "901",
+ "4347",
+ "737",
+ "4112",
+ "4262",
+ "4188",
+ "4391",
+ "248",
+ "63",
+ "494",
+ "1645",
+ "733",
+ "4337",
+ "343",
+ "1935",
+ "1921",
+ "193",
+ "1213",
+ "572",
+ "1346",
+ "985",
+ "1746",
+ "1418",
+ "4129",
+ "278",
+ "628",
+ "762",
+ "4462",
+ "930",
+ "904",
+ "1406",
+ "575",
+ "1779",
+ "1613",
+ "1333",
+ "1889",
+ "464",
+ "594",
+ "4436",
+ "1083",
+ "68",
+ "4440",
+ "910",
+ "1511",
+ "4512",
+ "4264",
+ "4394",
+ "4452",
+ "1425",
+ "1947",
+ "4064",
+ "1212",
+ "249",
+ "627",
+ "4472",
+ "1912",
+ "4026",
+ "53",
+ "477",
+ "1288",
+ "1688",
+ "241",
+ "903",
+ "3908",
+ "3950",
+ "166",
+ "4147",
+ "1237",
+ "449",
+ "4276",
+ "4328",
+ "896",
+ "4256",
+ "1065",
+ "4017",
+ "176",
+ "1785",
+ "928",
+ "4115",
+ "3983",
+ "1090",
+ "1210",
+ "4053",
+ "788",
+ "3918",
+ "1340",
+ "1133",
+ "1674",
+ "1758",
+ "995",
+ "1276",
+ "1567",
+ "528",
+ "952",
+ "1197",
+ "1848",
+ "1399",
+ "1267",
+ "4236",
+ "1445",
+ "1883",
+ "1956",
+ "1414",
+ "898",
+ "602",
+ "636",
+ "1502",
+ "203",
+ "3987",
+ "1269",
+ "787",
+ "412",
+ "568",
+ "1892",
+ "4471",
+ "1476",
+ "4201",
+ "1518",
+ "1890",
+ "4396",
+ "1824",
+ "1760",
+ "4260",
+ "1548",
+ "1320",
+ "1535",
+ "1676",
+ "1299",
+ "309",
+ "4118",
+ "45",
+ "4463",
+ "4169",
+ "1590",
+ "1201",
+ "1905",
+ "931",
+ "4164",
+ "4451",
+ "4134",
+ "245",
+ "4212",
+ "220",
+ "1095",
+ "1754",
+ "32",
+ "3932",
+ "1361",
+ "1413",
+ "4245",
+ "765",
+ "1828",
+ "1651",
+ "1702",
+ "3916",
+ "1190",
+ "1342",
+ "789",
+ "4433",
+ "375",
+ "664",
+ "655",
+ "10",
+ "481",
+ "4318",
+ "4449",
+ "1058",
+ "3897",
+ "187",
+ "1551",
+ "300",
+ "4321",
+ "1926",
+ "593",
+ "567",
+ "644",
+ "855",
+ "933",
+ "1481",
+ "304",
+ "833",
+ "4251",
+ "4080",
+ "1390",
+ "4266",
+ "1541",
+ "1904",
+ "1396",
+ "1025",
+ "186",
+ "4157",
+ "927",
+ "27",
+ "4001",
+ "799",
+ "462",
+ "642",
+ "591",
+ "1394",
+ "843",
+ "510",
+ "3877",
+ "4324",
+ "1932",
+ "4102",
+ "212",
+ "4454",
+ "1902",
+ "1803",
+ "4484",
+ "4316",
+ "3914",
+ "1677",
+ "4507",
+ "197",
+ "1667",
+ "4144",
+ "1519",
+ "230",
+ "1457",
+ "899",
+ "999",
+ "1175",
+ "828",
+ "4173",
+ "4021",
+ "4078",
+ "1059",
+ "586",
+ "683",
+ "4481",
+ "417",
+ "587",
+ "4029",
+ "1658",
+ "875",
+ "1068",
+ "1769",
+ "669",
+ "858",
+ "1775",
+ "1781",
+ "3927",
+ "4473",
+ "1727",
+ "4074",
+ "4092",
+ "722",
+ "228",
+ "1395",
+ "3972",
+ "1792",
+ "882",
+ "1713",
+ "1409",
+ "324",
+ "322",
+ "4418",
+ "1442",
+ "376",
+ "708",
+ "236",
+ "1859",
+ "9",
+ "1369",
+ "4248",
+ "1579",
+ "4377",
+ "1009",
+ "1214",
+ "4012",
+ "1680",
+ "4225",
+ "1595",
+ "1316",
+ "972",
+ "920",
+ "1737",
+ "1946",
+ "1958",
+ "4492",
+ "1710",
+ "4117",
+ "584",
+ "596",
+ "3902",
+ "4083",
+ "73",
+ "461",
+ "4464",
+ "1258",
+ "4151",
+ "1701",
+ "1347",
+ "1966",
+ "234",
+ "4149",
+ "1381",
+ "246",
+ "1607",
+ "1129",
+ "3949",
+ "4325",
+ "1298",
+ "1812",
+ "1392",
+ "378",
+ "4439",
+ "1064",
+ "1696",
+ "4224",
+ "4257",
+ "361",
+ "512",
+ "4446",
+ "4515",
+ "1629",
+ "3930",
+ "4100",
+ "1202",
+ "4254",
+ "1057",
+ "3969",
+ "1874",
+ "1965",
+ "4079",
+ "623",
+ "1061",
+ "4297",
+ "4284",
+ "4301",
+ "384",
+ "1692",
+ "1209",
+ "4509",
+ "780",
+ "4416",
+ "1216",
+ "861",
+ "4461",
+ "373",
+ "951",
+ "4393",
+ "1847",
+ "372",
+ "1416",
+ "1611",
+ "47",
+ "607",
+ "525",
+ "2",
+ "402",
+ "52",
+ "1207",
+ "4054",
+ "1682",
+ "4491",
+ "1728",
+ "3922",
+ "1283",
+ "76",
+ "3",
+ "790",
+ "534",
+ "4226",
+ "1891",
+ "1464",
+ "1379",
+ "4382",
+ "4145",
+ "4227",
+ "1387",
+ "4250",
+ "14",
+ "4500",
+ "1427",
+ "1560",
+ "4419",
+ "1747",
+ "1127",
+ "4475",
+ "4002",
+ "4343",
+ "4359",
+ "231",
+ "4108",
+ "1818",
+ "1306",
+ "3886",
+ "4213",
+ "1627",
+ "4267",
+ "4072",
+ "158",
+ "1257",
+ "169",
+ "4345",
+ "1405",
+ "4366",
+ "757",
+ "1797",
+ "4392",
+ "1606",
+ "1649",
+ "210",
+ "1193",
+ "4447",
+ "4364",
+ "3955",
+ "259",
+ "1317",
+ "1215",
+ "222",
+ "1385",
+ "185",
+ "3905",
+ "1096",
+ "1751",
+ "1206",
+ "1542",
+ "4315",
+ "849",
+ "4367",
+ "204",
+ "4503",
+ "601",
+ "4032",
+ "4007",
+ "1383",
+ "1309",
+ "21",
+ "888",
+ "1006",
+ "4331",
+ "1793",
+ "3887",
+ "4152",
+ "1962",
+ "1610",
+ "4206",
+ "250",
+ "3952",
+ "1450",
+ "1587",
+ "1391",
+ "1302",
+ "466",
+ "1853",
+ "1731",
+ "1185",
+ "1422",
+ "1575",
+ "1389",
+ "729",
+ "4397",
+ "4513",
+ "4182",
+ "4049",
+ "4480",
+ "418",
+ "277",
+ "1939",
+ "60",
+ "4478",
+ "391",
+ "4193",
+ "1964",
+ "992",
+ "1266",
+ "1929",
+ "1490",
+ "1841",
+ "4122",
+ "4131",
+ "4116",
+ "1429",
+ "289",
+ "1055",
+ "902",
+ "4490",
+ "175",
+ "183",
+ "1726",
+ "1637",
+ "559",
+ "4041",
+ "1365",
+ "4038",
+ "406",
+ "1322",
+ "1005",
+ "4275",
+ "4104",
+ "1738",
+ "897",
+ "1927",
+ "1561",
+ "1507",
+ "4247",
+ "4387",
+ "4388",
+ "978",
+ "553",
+ "4271",
+ "1903",
+ "4295",
+ "1783",
+ "1017",
+ "1934",
+ "4350",
+ "759",
+ "163",
+ "576",
+ "247",
+ "603",
+ "36",
+ "1594",
+ "515",
+ "4018",
+ "4004",
+ "4130",
+ "558",
+ "4336",
+ "1750",
+ "544",
+ "1721",
+ "1183",
+ "4231",
+ "4216",
+ "4432",
+ "1211",
+ "1032",
+ "3901",
+ "577",
+ "1426",
+ "364",
+ "1324",
+ "1763",
+ "4445",
+ "1562",
+ "4370",
+ "1514",
+ "663",
+ "1815",
+ "64",
+ "1693",
+ "4239",
+ "1705",
+ "1131",
+ "1300",
+ "1290",
+ "1720",
+ "1470",
+ "1280",
+ "3917",
+ "4180",
+ "3982",
+ "1521",
+ "939",
+ "1474",
+ "3912",
+ "4319",
+ "983",
+ "1642",
+ "1023",
+ "1571",
+ "736",
+ "1102",
+ "530",
+ "1900",
+ "521",
+ "480",
+ "4192",
+ "1933",
+ "1407",
+ "1798",
+ "1315",
+ "4373",
+ "211",
+ "1877",
+ "721",
+ "1845",
+ "308",
+ "1454",
+ "1547",
+ "4474",
+ "560",
+ "1293",
+ "1734",
+ "1169",
+ "886",
+ "4383",
+ "1699",
+ "4217",
+ "381",
+ "690",
+ "4207",
+ "495",
+ "152",
+ "1375",
+ "1284",
+ "3928",
+ "1205",
+ "1512",
+ "4166",
+ "1268",
+ "916",
+ "1723",
+ "4317",
+ "989",
+ "180",
+ "1278",
+ "4167",
+ "1961",
+ "3986",
+ "330",
+ "1663",
+ "4062",
+ "65",
+ "490",
+ "4113",
+ "54",
+ "1647",
+ "1178",
+ "48",
+ "1817",
+ "352",
+ "856",
+ "425",
+ "4150",
+ "3920",
+ "4022",
+ "419",
+ "1602",
+ "1286",
+ "1319",
+ "3978",
+ "3907",
+ "4030",
+ "4185",
+ "1173",
+ "3988",
+ "492",
+ "3911",
+ "1568",
+ "1774",
+ "1624",
+ "4003",
+ "1844",
+ "640",
+ "3941",
+ "3915",
+ "781",
+ "4014",
+ "4090",
+ "1526",
+ "1540",
+ "4040",
+ "653",
+ "639",
+ "4047",
+ "1557",
+ "732",
+ "522",
+ "307",
+ "795",
+ "1311",
+ "4243",
+ "4127",
+ "1318",
+ "815",
+ "38",
+ "1453",
+ "4237",
+ "4458",
+ "1743",
+ "4132",
+ "4052",
+ "4453",
+ "4442",
+ "4400",
+ "1504",
+ "1398",
+ "1082",
+ "3939",
+ "4055",
+ "472",
+ "908",
+ "4313",
+ "312",
+ "355",
+ "387",
+ "4273",
+ "3895",
+ "1260",
+ "1609",
+ "1348",
+ "1619",
+ "1681",
+ "1259",
+ "523",
+ "1543",
+ "1930",
+ "1920",
+ "3890",
+ "1517",
+ "165",
+ "1204",
+ "11",
+ "1484",
+ "1220",
+ "3924",
+ "1194",
+ "988",
+ "4434",
+ "4235",
+ "19",
+ "1534",
+ "970",
+ "4058",
+ "844",
+ "4073",
+ "913",
+ "57",
+ "1640",
+ "4344",
+ "448",
+ "4171",
+ "975",
+ "1525",
+ "1441",
+ "3970",
+ "516",
+ "287",
+ "1382",
+ "4286",
+ "1279",
+ "4156",
+ "1487",
+ "4126",
+ "1716",
+ "1807",
+ "854",
+ "4075",
+ "4071",
+ "3964",
+ "1229",
+ "4109",
+ "1287",
+ "4390",
+ "1558",
+ "40",
+ "1687",
+ "4296",
+ "4485",
+ "1223",
+ "656",
+ "4196",
+ "1041",
+ "1208",
+ "4027",
+ "4282",
+ "4349",
+ "4269",
+ "3910",
+ "4252",
+ "4335",
+ "4510",
+ "3999",
+ "1256",
+ "806",
+ "279",
+ "4516",
+ "4443",
+ "3894",
+ "1888",
+ "4205",
+ "306",
+ "3985",
+ "1572",
+ "1536",
+ "4333",
+ "1959",
+ "4379",
+ "990",
+ "4039",
+ "4399",
+ "1633",
+ "3913",
+ "1689",
+ "1475",
+ "3963",
+ "1466",
+ "1574",
+ "1486",
+ "67",
+ "1050",
+ "1686",
+ "4372",
+ "4299",
+ "4140",
+ "1730",
+ "981",
+ "4065",
+ "1101",
+ "1434",
+ "3921",
+ "487",
+ "1430",
+ "1577",
+ "4374",
+ "1533",
+ "1529",
+ "70",
+ "1694",
+ "4120",
+ "613",
+ "1077",
+ "3919",
+ "1018",
+ "638",
+ "3996",
+ "1323",
+ "3968",
+ "1397",
+ "4111",
+ "1923",
+ "4019",
+ "1615",
+ "1421",
+ "290",
+ "4496",
+ "4249",
+ "1051",
+ "1245",
+ "427",
+ "489",
+ "1706",
+ "1184",
+ "1374",
+ "15",
+ "4214",
+ "4163",
+ "4365",
+ "4229",
+ "1707",
+ "184",
+ "756",
+ "4412",
+ "1449",
+ "333",
+ "458",
+ "4061",
+ "1515",
+ "4081",
+ "4334",
+ "4395",
+ "1552",
+ "4135",
+ "4274",
+ "1436",
+ "1589",
+ "1770",
+ "4429",
+ "4246",
+ "4386",
+ "595",
+ "1199",
+ "1787",
+ "836",
+ "4420",
+ "1192",
+ "4184",
+ "666",
+ "1581",
+ "1028",
+ "4025",
+ "28",
+ "353",
+ "4385",
+ "1742",
+ "4441",
+ "1945",
+ "573",
+ "3903",
+ "1091",
+ "4294",
+ "1217",
+ "1931",
+ "4351",
+ "4354",
+ "1614",
+ "4233",
+ "1461",
+ "1944",
+ "4043",
+ "1632",
+ "1472",
+ "533",
+ "252",
+ "4059",
+ "235",
+ "1084",
+ "1644",
+ "1181",
+ "1825",
+ "3979",
+ "4323",
+ "4427",
+ "4176",
+ "1087",
+ "1336",
+ "4042",
+ "3940",
+ "1867",
+ "4477",
+ "4360",
+ "700",
+ "1497",
+ "1195",
+ "219",
+ "3971",
+ "1794",
+ "1352",
+ "1455",
+ "4455",
+ "4057",
+ "302",
+ "450",
+ "3884",
+ "4123",
+ "4483",
+ "270",
+ "786",
+ "887",
+ "984",
+ "3906",
+ "4142",
+ "1761",
+ "4221",
+ "4220",
+ "4376",
+ "4357",
+ "4348",
+ "221",
+ "1938",
+ "723",
+ "964",
+ "392",
+ "727",
+ "1556",
+ "255",
+ "224",
+ "4230",
+ "982",
+ "1909",
+ "3923",
+ "4228",
+ "4187",
+ "208",
+ "227",
+ "3909",
+ "824",
+ "1901",
+ "1911",
+ "728",
+ "1363",
+ "1782",
+ "1067",
+ "4493",
+ "967",
+ "4270",
+ "1698",
+ "470",
+ "493",
+ "1907",
+ "1937",
+ "1417",
+ "731",
+ "1030",
+ "1349",
+ "4410",
+ "1337",
+ "776",
+ "1203",
+ "1198",
+ "1722",
+ "22",
+ "1922",
+ "3981",
+ "878",
+ "993",
+ "4407",
+ "1321",
+ "4398",
+ "4222",
+ "1345",
+ "1378",
+ "1296",
+ "4253",
+ "4414",
+ "1550",
+ "3931",
+ "1776",
+ "1576",
+ "4045",
+ "49",
+ "23",
+ "1860",
+ "471",
+ "4468",
+ "4060",
+ "256",
+ "453",
+ "1801",
+ "1460",
+ "4015",
+ "4067",
+ "4035",
+ "1605",
+ "4501",
+ "1344",
+ "1467",
+ "1963",
+ "4405",
+ "1862",
+ "1423",
+ "1393",
+ "1683",
+ "1592",
+ "694",
+ "980",
+ "592",
+ "1218",
+ "189",
+ "338",
+ "4159",
+ "4034",
+ "4031",
+ "1675",
+ "1678",
+ "1646",
+ "4263",
+ "651",
+ "1026",
+ "214",
+ "4505",
+ "1555",
+ "1371",
+ "405",
+ "1943",
+ "633",
+ "652",
+ "4215",
+ "4023",
+ "4091",
+ "1795",
+ "66",
+ "1485",
+ "160",
+ "585",
+ "1291",
+ "689",
+ "4498",
+ "865",
+ "4143",
+ "1400",
+ "3889",
+ "965",
+ "1281",
+ "4497",
+ "4413",
+ "4110",
+ "1622",
+ "162",
+ "232",
+ "468",
+ "4194",
+ "1024",
+ "1191",
+ "4056",
+ "1588",
+ "4168",
+ "554",
+ "944",
+ "719",
+ "545",
+ "876",
+ "1446",
+ "954",
+ "326",
+ "168",
+ "4285",
+ "4482",
+ "1314",
+ "1913",
+ "46",
+ "4504",
+ "608",
+ "3992",
+ "1578",
+ "4281",
+ "4008",
+ "3898",
+ "371",
+ "921",
+ "4153",
+ "4450",
+ "4329",
+ "1350",
+ "3984",
+ "1708",
+ "25",
+ "316",
+ "216",
+ "3976",
+ "555",
+ "4087",
+ "4424",
+ "520",
+ "4186",
+ "4459",
+ "86",
+ "13",
+ "706",
+ "1362",
+ "710",
+ "4244",
+ "4138",
+ "1631",
+ "1240",
+ "4406",
+ "295",
+ "58",
+ "4278",
+ "159",
+ "749",
+ "4076",
+ "4384",
+ "1148",
+ "4259",
+ "4005",
+ "50",
+ "447",
+ "4146",
+ "4048",
+ "1554",
+ "1377",
+ "4338",
+ "4068",
+ "12",
+ "3879",
+ "588",
+ "4326",
+ "3954",
+ "456",
+ "1778",
+ "1289",
+ "284",
+ "1219",
+ "155",
+ "1970",
+ "164",
+ "1827",
+ "4381",
+ "1273",
+ "994",
+ "1251",
+ "1372",
+ "4084",
+ "4438",
+ "1451",
+ "1143",
+ "1593",
+ "4258",
+ "112",
+ "39",
+ "1052",
+ "251",
+ "1014",
+ "4460",
+ "4046",
+ "1489",
+ "4423",
+ "4456",
+ "771",
+ "1669",
+ "4489",
+ "1008",
+ "1135",
+ "1563",
+ "538",
+ "1029",
+ "1621",
+ "370",
+ "233",
+ "1019",
+ "4340",
+ "4223",
+ "1513",
+ "1839",
+ "1780",
+ "4341",
+ "4137",
+ "894",
+ "454",
+ "147",
+ "4430",
+ "532",
+ "288",
+ "4353",
+ "1745",
+ "4240",
+ "847",
+ "4066",
+ "688",
+ "4339",
+ "1670",
+ "4448",
+ "4190",
+ "4209",
+ "202",
+ "4514",
+ "746",
+ "1054",
+ "4010",
+ "4050",
+ "1802",
+ "1752",
+ "1230",
+ "4077",
+ "630",
+ "1703",
+ "4470",
+ "4358",
+ "4242",
+ "1826",
+ "720",
+ "1093",
+ "4082",
+ "1503",
+ "1656",
+ "1360",
+ "915",
+ "1452",
+ "243",
+ "3974",
+ "1343",
+ "4279",
+ "1458",
+ "217",
+ "1772",
+ "3882",
+ "4312",
+ "632",
+ "4037",
+ "463",
+ "4479",
+ "3967",
+ "1861",
+ "407",
+ "411",
+ "1053",
+ "242",
+ "1673",
+ "1285",
+ "4280",
+ "3883",
+ "4177",
+ "4465",
+ "3900",
+ "1048",
+ "51",
+ "4322",
+ "1638",
+ "507",
+ "1875",
+ "4033",
+ "151",
+ "1777",
+ "1312",
+ "4401",
+ "709",
+ "681",
+ "431",
+ "1639",
+ "1626",
+ "1335",
+ "4051",
+ "1717",
+ "459",
+ "1715",
+ "4332",
+ "1308",
+ "3947",
+ "1419",
+ "1351",
+ "3881",
+ "1887",
+ "1238",
+ "4093",
+ "4218",
+ "634",
+ "1366",
+ "1757",
+ "209",
+ "310",
+ "1376",
+ "4181",
+ "1039",
+ "1591",
+ "863",
+ "3946",
+ "1003",
+ "1697",
+ "452",
+ "1483",
+ "895",
+ "1762",
+ "4000",
+ "1618",
+ "4238",
+ "1307",
+ "401",
+ "3991",
+ "1753",
+ "6",
+ "4415",
+ "4011",
+ "374",
+ "367",
+ "4096",
+ "1326",
+ "1332",
+ "724",
+ "8",
+ "4174",
+ "4936",
+ "4665",
+ "5325",
+ "3743",
+ "4981",
+ "5162",
+ "5099",
+ "4629",
+ "3561",
+ "4839",
+ "4779",
+ "2732",
+ "4893",
+ "4802",
+ "5342",
+ "4584",
+ "4765",
+ "2123",
+ "5144",
+ "4895",
+ "5327",
+ "5351",
+ "5056",
+ "4535",
+ "5253",
+ "5040",
+ "4924",
+ "3873",
+ "3868",
+ "4559",
+ "5042",
+ "5197",
+ "3615",
+ "4977",
+ "4582",
+ "4846",
+ "5189",
+ "5217",
+ "3337",
+ "2871",
+ "3421",
+ "4784",
+ "4744",
+ "4627",
+ "4572",
+ "4576",
+ "5315",
+ "5338",
+ "5280",
+ "5173",
+ "4806",
+ "5239",
+ "4883",
+ "4702",
+ "3740",
+ "4519",
+ "2786",
+ "2735",
+ "4902",
+ "2953",
+ "5017",
+ "5322",
+ "2798",
+ "4881",
+ "4974",
+ "4687",
+ "4667",
+ "4636",
+ "4787",
+ "4764",
+ "2175",
+ "5034",
+ "4611",
+ "4613",
+ "2525",
+ "4833",
+ "4967",
+ "4993",
+ "5101",
+ "3676",
+ "4547",
+ "4583",
+ "5169",
+ "4989",
+ "5106",
+ "4591",
+ "4614",
+ "4814",
+ "4607",
+ "3844",
+ "4581",
+ "5331",
+ "4823",
+ "5093",
+ "5319",
+ "5205",
+ "4681",
+ "4852",
+ "4891",
+ "4878",
+ "4652",
+ "4531",
+ "4739",
+ "5159",
+ "5219",
+ "4892",
+ "4952",
+ "5199",
+ "4563",
+ "5112",
+ "4648",
+ "2987",
+ "5283",
+ "4558",
+ "4940",
+ "4757",
+ "5058",
+ "4925",
+ "5117",
+ "5204",
+ "4537",
+ "4700",
+ "4750",
+ "4517",
+ "5191",
+ "4601",
+ "4742",
+ "4813",
+ "5304",
+ "5067",
+ "4605",
+ "5347",
+ "3573",
+ "4668",
+ "4536",
+ "5299",
+ "5134",
+ "4606",
+ "4928",
+ "5271",
+ "5312",
+ "5054",
+ "4905",
+ "4748",
+ "4532",
+ "4836",
+ "5066",
+ "4856",
+ "3258",
+ "4646",
+ "4674",
+ "4653",
+ "5215",
+ "4751",
+ "4690",
+ "2201",
+ "4960",
+ "4935",
+ "5224",
+ "3287",
+ "2083",
+ "4959",
+ "4534",
+ "5132",
+ "4548",
+ "2696",
+ "4966",
+ "4995",
+ "2407",
+ "4647",
+ "4643",
+ "4588",
+ "5150",
+ "4573",
+ "5244",
+ "3876",
+ "5151",
+ "4736",
+ "5160",
+ "4758",
+ "4659",
+ "4754",
+ "4747",
+ "2566",
+ "4640",
+ "5055",
+ "4766",
+ "5170",
+ "5254",
+ "5228",
+ "5242",
+ "5285",
+ "5187",
+ "4907",
+ "4669",
+ "5039",
+ "2219",
+ "2221",
+ "5317",
+ "4689",
+ "4769",
+ "4529",
+ "5179",
+ "3577",
+ "4912",
+ "5346",
+ "5232",
+ "5146",
+ "5049",
+ "4666",
+ "4671",
+ "4809",
+ "4704",
+ "5328",
+ "4828",
+ "4580",
+ "4998",
+ "4888",
+ "4845",
+ "4854",
+ "5089",
+ "4831",
+ "4819",
+ "5108",
+ "4631",
+ "4550",
+ "5141",
+ "4596",
+ "4710",
+ "5090",
+ "4721",
+ "2520",
+ "2958",
+ "4644",
+ "5081",
+ "5116",
+ "5028",
+ "5344",
+ "4619",
+ "3104",
+ "4708",
+ "2687",
+ "1973",
+ "4931",
+ "5252",
+ "5211",
+ "5257",
+ "4743",
+ "4609",
+ "4762",
+ "4763",
+ "5163",
+ "5236",
+ "4866",
+ "4904",
+ "5124",
+ "5109",
+ "5126",
+ "4773",
+ "5238",
+ "5140",
+ "4767",
+ "4844",
+ "4684",
+ "4807",
+ "5295",
+ "5214",
+ "4717",
+ "4528",
+ "4849",
+ "3439",
+ "5303",
+ "4707",
+ "5063",
+ "4851",
+ "4778",
+ "4724",
+ "2363",
+ "5104",
+ "4961",
+ "2626",
+ "4934",
+ "5182",
+ "5248",
+ "2174",
+ "4543",
+ "5084",
+ "4939",
+ "3163",
+ "3387",
+ "5245",
+ "4679",
+ "3326",
+ "4800",
+ "5045",
+ "4725",
+ "4526",
+ "4688",
+ "5287",
+ "4586",
+ "4697",
+ "4871",
+ "4853",
+ "5046",
+ "4695",
+ "4811",
+ "5355",
+ "4610",
+ "5234",
+ "4556",
+ "4686",
+ "4553",
+ "5258",
+ "4973",
+ "5200",
+ "4886",
+ "5202",
+ "4723",
+ "3080",
+ "5111",
+ "4805",
+ "4604",
+ "3221",
+ "4879",
+ "4720",
+ "5201",
+ "4867",
+ "4919",
+ "5212",
+ "5166",
+ "4944",
+ "3872",
+ "4630",
+ "4602",
+ "4999",
+ "5097",
+ "4860",
+ "4525",
+ "4716",
+ "4948",
+ "5337",
+ "4796",
+ "5033",
+ "3190",
+ "3631",
+ "3066",
+ "4955",
+ "3596",
+ "4972",
+ "4861",
+ "5115",
+ "4968",
+ "4954",
+ "4911",
+ "5053",
+ "5085",
+ "4837",
+ "4641",
+ "4920",
+ "5243",
+ "5139",
+ "4874",
+ "4838",
+ "4755",
+ "5226",
+ "5131",
+ "4761",
+ "4590",
+ "3869",
+ "4649",
+ "4949",
+ "5296",
+ "5130",
+ "5222",
+ "5155",
+ "5005",
+ "4869",
+ "5352",
+ "4662",
+ "4703",
+ "5068",
+ "5158",
+ "5147",
+ "4530",
+ "5013",
+ "5175",
+ "5161",
+ "2692",
+ "5274",
+ "5113",
+ "5269",
+ "4638",
+ "4862",
+ "5250",
+ "4745",
+ "4696",
+ "4545",
+ "5203",
+ "5148",
+ "4835",
+ "5142",
+ "3401",
+ "2979",
+ "4626",
+ "4976",
+ "5183",
+ "4900",
+ "4599",
+ "2284",
+ "2252",
+ "2209",
+ "5340",
+ "4593",
+ "5298",
+ "3578",
+ "3506",
+ "3157",
+ "3156",
+ "3245",
+ "3516",
+ "4909",
+ "4600",
+ "4788",
+ "5306",
+ "4894",
+ "5247",
+ "4524",
+ "5118",
+ "5184",
+ "4926",
+ "4552",
+ "4756",
+ "5221",
+ "5178",
+ "4661",
+ "4555",
+ "4903",
+ "4527",
+ "5123",
+ "3422",
+ "2872",
+ "3338",
+ "4749",
+ "4840",
+ "5167",
+ "4718",
+ "4987",
+ "4549",
+ "4741",
+ "5334",
+ "4566",
+ "3870",
+ "5281",
+ "4933",
+ "5149",
+ "4540",
+ "2938",
+ "4554",
+ "4579",
+ "4793",
+ "4709",
+ "4585",
+ "4785",
+ "5032",
+ "5276",
+ "4863",
+ "4546",
+ "5156",
+ "4890",
+ "5125",
+ "4988",
+ "5198",
+ "4701",
+ "4810",
+ "4899",
+ "2384",
+ "5192",
+ "4660",
+ "4803",
+ "5273",
+ "4621",
+ "5003",
+ "4901",
+ "5262",
+ "4990",
+ "4770",
+ "4827",
+ "4808",
+ "4675",
+ "5143",
+ "5186",
+ "4804",
+ "5082",
+ "4677",
+ "5209",
+ "4937",
+ "2081",
+ "4522",
+ "5026",
+ "2653",
+ "3871",
+ "4564",
+ "5074",
+ "5237",
+ "5350",
+ "4910",
+ "4857",
+ "5072",
+ "4538",
+ "5076",
+ "4658",
+ "4946",
+ "4676",
+ "5020",
+ "2250",
+ "3828",
+ "5235",
+ "5000",
+ "4672",
+ "4650",
+ "5255",
+ "5300",
+ "4798",
+ "5339",
+ "4632",
+ "4875",
+ "4774",
+ "5233",
+ "5057",
+ "5231",
+ "4963",
+ "5259",
+ "3691",
+ "5302",
+ "3352",
+ "5195",
+ "2683",
+ "2784",
+ "5297",
+ "4916",
+ "4812",
+ "5002",
+ "5164",
+ "4983",
+ "5288",
+ "4561",
+ "5153",
+ "5035",
+ "4577",
+ "4941",
+ "4595",
+ "4635",
+ "5264",
+ "4816",
+ "4882",
+ "4980",
+ "4994",
+ "5270",
+ "4897",
+ "4771",
+ "4791",
+ "4859",
+ "5107",
+ "5135",
+ "5152",
+ "4597",
+ "5278",
+ "3673",
+ "4645",
+ "4826",
+ "4818",
+ "4906",
+ "5023",
+ "5137",
+ "4691",
+ "4715",
+ "4575",
+ "4569",
+ "4914",
+ "4887",
+ "4898",
+ "2591",
+ "5014",
+ "5240",
+ "4651",
+ "3575",
+ "3572",
+ "4815",
+ "4735",
+ "5345",
+ "5301",
+ "4870",
+ "5086",
+ "4685",
+ "4663",
+ "4971",
+ "4829",
+ "5286",
+ "4932",
+ "5114",
+ "4930",
+ "4541",
+ "2862",
+ "4868",
+ "5185",
+ "4797",
+ "4885",
+ "4889",
+ "4956",
+ "5267",
+ "2451",
+ "4587",
+ "2442",
+ "5168",
+ "5291",
+ "4950",
+ "4850",
+ "4680",
+ "5336",
+ "4639",
+ "5174",
+ "5102",
+ "5177",
+ "4992",
+ "5022",
+ "1983",
+ "2603",
+ "4612",
+ "5188",
+ "2646",
+ "5122",
+ "5256",
+ "5110",
+ "4624",
+ "4799",
+ "3451",
+ "5206",
+ "5318",
+ "5129",
+ "4759",
+ "5213",
+ "4714",
+ "4984",
+ "5293",
+ "4848",
+ "5025",
+ "4705",
+ "4539",
+ "3490",
+ "2009",
+ "4518",
+ "5268",
+ "4603",
+ "4521",
+ "5092",
+ "5332",
+ "5047",
+ "5098",
+ "5007",
+ "5275",
+ "4772",
+ "4712",
+ "4656",
+ "5105",
+ "5138",
+ "4565",
+ "5083",
+ "4623",
+ "4592",
+ "4533",
+ "4523",
+ "5218",
+ "4673",
+ "5353",
+ "4945",
+ "5227",
+ "4608",
+ "4951",
+ "4683",
+ "2099",
+ "4801",
+ "4711",
+ "5193",
+ "4832",
+ "4942",
+ "4865",
+ "4896",
+ "5119",
+ "4637",
+ "5044",
+ "4719",
+ "5048",
+ "5308",
+ "4821",
+ "4654",
+ "2617",
+ "4975",
+ "4571",
+ "5225",
+ "4842",
+ "4915",
+ "4834",
+ "4589",
+ "5079",
+ "4922",
+ "4864",
+ "2139",
+ "4921",
+ "4958",
+ "2328",
+ "4927",
+ "4615",
+ "5145",
+ "4655",
+ "4858",
+ "4698",
+ "4642",
+ "4628",
+ "5263",
+ "5220",
+ "5261",
+ "4633",
+ "4726",
+ "4847",
+ "4820",
+ "5127",
+ "4789",
+ "4737",
+ "4884",
+ "4843",
+ "4730",
+ "4752",
+ "4855",
+ "5314"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/scripts/com.steve.crcp-email-alerts.plist b/scripts/com.steve.crcp-email-alerts.plist
new file mode 100644
index 0000000..01c0662
--- /dev/null
+++ b/scripts/com.steve.crcp-email-alerts.plist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>Label</key><string>com.steve.crcp-email-alerts</string>
+ <key>ProgramArguments</key>
+ <array>
+ <string>/bin/bash</string>
+ <string>/Users/macstudio3/Projects/commercialrealestate/scripts/run-email-alerts.sh</string>
+ </array>
+ <!-- Daily 7:00 AM. Cadence is adjustable: change Hour/Minute here, or add more
+ StartCalendarInterval dicts for multiple sends/day. Per-subscriber cadence
+ (daily|weekly|instant) is honored in data/alerts-config.json. -->
+ <key>StartCalendarInterval</key>
+ <dict><key>Hour</key><integer>7</integer><key>Minute</key><integer>0</integer></dict>
+ <key>StandardOutPath</key><string>/tmp/crcp-email-alerts.out</string>
+ <key>StandardErrorPath</key><string>/tmp/crcp-email-alerts.err</string>
+ <key>RunAtLoad</key><false/>
+</dict>
+</plist>
diff --git a/scripts/email-alerts.js b/scripts/email-alerts.js
new file mode 100644
index 0000000..9825fcb
--- /dev/null
+++ b/scripts/email-alerts.js
@@ -0,0 +1,225 @@
+#!/usr/bin/env node
+/*
+ * CRCP email-alerts — DTD verdict A (launchd snapshot-diff + George).
+ *
+ * Diffs the current snapshots (listings.json, brokers-snapshot.json) against the
+ * last-seen state, finds what's NEW per metro, and composes a per-subscriber HTML
+ * digest. DB-less by design — pure snapshot files, exactly like the rest of CRCP.
+ *
+ * Cadence is adjustable at the config level (data/alerts-config.json `cadence`) and
+ * at the schedule level (the launchd plist interval). Sends are GATED: dry-run by
+ * default (writes HTML to data/alerts-out/); --send routes through George and is the
+ * only path that advances the seen-state.
+ *
+ * Usage:
+ * node scripts/email-alerts.js # dry-run: build digests, DO NOT send, DO NOT advance state
+ * node scripts/email-alerts.js --send # GATED: send via George + advance state
+ * node scripts/email-alerts.js --commit-state # advance state without sending (baseline seed)
+ */
+const fs = require('fs');
+const path = require('path');
+const https = require('https');
+const http = require('http');
+
+const ROOT = path.join(__dirname, '..');
+const DATA = path.join(ROOT, 'data');
+const OUT = path.join(DATA, 'alerts-out');
+const CONFIG_PATH = path.join(DATA, 'alerts-config.json');
+const STATE_PATH = path.join(DATA, 'alerts-state.json');
+
+const SEND = process.argv.includes('--send');
+const COMMIT_STATE = process.argv.includes('--commit-state') || SEND;
+
+// ---- metro tagging -------------------------------------------------------
+// A listing/broker belongs to a metro if its city (slugified) matches the metro
+// slug or one of its alias cities. Subscribers with metros:["*"] get everything.
+const METRO_CITIES = {
+ 'los-angeles': ['los angeles', 'la', 'hollywood', 'west hollywood', 'downtown', 'dtla', 'silver lake', 'echo park', 'koreatown', 'mid-city', 'venice', 'santa monica', 'culver city', 'pasadena', 'long beach', 'burbank', 'glendale', 'sherman oaks', 'studio city', 'north hollywood', 'van nuys', 'encino', 'woodland hills', 'tarzana', 'inglewood', 'san pedro', 'torrance', 'gardena', 'huntington park', 'bellflower', 'lakewood', 'downey', 'norwalk', 'compton', 'carson', 'hawthorne', 'lynwood', 'south gate', 'whittier', 'montebello', 'alhambra', 'monterey park', 'el monte', 'pomona', 'lancaster', 'palmdale', 'santa clarita', 'redondo beach', 'manhattan beach', 'hermosa beach', 'westchester', 'reseda', 'canoga park', 'northridge', 'chatsworth', 'sun valley', 'panorama city', 'sylmar', 'wilmington', 'harbor city', 'san fernando', 'arcadia', 'temple city', 'rosemead', 'baldwin park', 'covina', 'west covina', 'la puente', 'hacienda heights', 'rowland heights', 'diamond bar', 'walnut', 'cerritos', 'artesia', 'paramount', 'bell', 'bell gardens', 'maywood', 'cudahy', 'commerce', 'vernon', 'san gabriel', 'altadena', 'sierra madre', 'la crescenta', 'tujunga', 'eagle rock', 'highland park', 'boyle heights', 'lincoln heights', 'south pasadena', 'glassell park'],
+ 'beverly-hills': ['beverly hills'],
+ 'malibu': ['malibu'],
+ 'newport-beach': ['newport beach', 'newport coast', 'corona del mar'],
+ 'montecito': ['montecito', 'santa barbara'],
+ 'san-francisco': ['san francisco', 'sf'],
+ 'silicon-valley': ['palo alto', 'menlo park', 'mountain view', 'los altos', 'los altos hills', 'sunnyvale', 'cupertino', 'san jose'],
+ 'atherton': ['atherton'],
+ 'hillsborough': ['hillsborough'],
+ 'woodside': ['woodside'],
+ 'miami': ['miami', 'coral gables', 'coconut grove', 'brickell'],
+ 'miami-beach': ['miami beach', 'south beach'],
+ 'palm-beach': ['palm beach', 'west palm beach'],
+ 'naples': ['naples'],
+ 'nyc': ['new york', 'nyc', 'manhattan', 'brooklyn'],
+ 'greenwich': ['greenwich'],
+ 'hamptons': ['east hampton', 'southampton', 'bridgehampton', 'sag harbor', 'montauk', 'water mill'],
+ 'las-vegas': ['las vegas', 'henderson', 'summerlin'],
+ 'texas': ['austin', 'dallas', 'houston', 'san antonio', 'fort worth'],
+ 'aspen': ['aspen', 'snowmass'],
+ 'vail': ['vail', 'beaver creek'],
+ 'telluride': ['telluride'],
+};
+const slug = s => (s || '').toString().toLowerCase().trim();
+function metroOf(city) {
+ const c = slug(city);
+ if (!c) return null;
+ for (const [metro, cities] of Object.entries(METRO_CITIES)) {
+ if (c === metro.replace(/-/g, ' ')) return metro;
+ if (cities.some(x => c === x || c.includes(x))) return metro;
+ }
+ return null;
+}
+
+// ---- data loads ----------------------------------------------------------
+function loadJSON(p, fallback) { try { return JSON.parse(fs.readFileSync(p, 'utf8')); } catch { return fallback; } }
+function listValues(d) { if (Array.isArray(d)) return d; if (d && typeof d === 'object') { return d.listings || d.data || d.brokers || Object.values(d); } return []; }
+
+function loadListings() {
+ const raw = loadJSON(path.join(DATA, 'listings.json'), {});
+ return listValues(raw).filter(x => x && (x.id != null)).map(x => ({
+ id: String(x.id), address: x.address, city: x.city, price: x.price, type: x.type,
+ cap_rate: x.cap_rate, units: x.units, status: x.status, upside_note: x.upside_note,
+ metro: metroOf(x.city),
+ }));
+}
+function loadBrokers() {
+ const raw = loadJSON(path.join(DATA, 'brokers-snapshot.json'), {});
+ const arr = raw.brokers || listValues(raw);
+ return arr.filter(x => x && x.id != null).map(x => ({
+ id: String(x.id), name: x.name, firm: x.firm, agent_type: x.agent_type,
+ city: x.office_addr, metro: metroOf(x.office_addr) || metroOf(x.firm) || null,
+ }));
+}
+
+// ---- config + state ------------------------------------------------------
+function loadConfig() {
+ if (fs.existsSync(CONFIG_PATH)) return loadJSON(CONFIG_PATH, null);
+ // seed a sensible default (Steve gets everything, daily)
+ const seed = {
+ from: 'steve@designerwallcoverings.com',
+ subscribers: [
+ { email: 'steve@designerwallcoverings.com', name: 'Steve', metros: ['*'], segments: ['listings', 'brokers'], cadence: 'daily' },
+ ],
+ note: 'cadence is adjustable per-subscriber (daily|weekly|instant); the launchd plist sets how often this script runs.',
+ };
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(seed, null, 2));
+ console.log(`seeded default config → ${CONFIG_PATH}`);
+ return seed;
+}
+function loadState() { return loadJSON(STATE_PATH, { last_run: null, seen: { listings: [], brokers: [] } }); }
+
+// ---- digest --------------------------------------------------------------
+function money(n) { const v = Number(n); return isFinite(v) && v > 0 ? '$' + v.toLocaleString() : '—'; }
+function metroLabel(m) { return (m || 'other').replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()); }
+
+function buildDigestHTML(sub, newListings, newBrokers) {
+ const wants = new Set(sub.metros);
+ const all = wants.has('*');
+ const fL = newListings.filter(l => all || wants.has(l.metro));
+ const fB = newBrokers.filter(b => all || wants.has(b.metro));
+ const showListings = sub.segments.includes('listings') ? fL : [];
+ const showBrokers = sub.segments.includes('brokers') ? fB : [];
+
+ const byMetro = arr => arr.reduce((m, x) => { (m[x.metro || 'other'] ||= []).push(x); return m; }, {});
+ const lMetros = byMetro(showListings);
+
+ let body = `<div style="font-family:-apple-system,Segoe UI,Arial,sans-serif;max-width:680px;margin:0 auto;color:#1a1f2b">
+ <div style="background:#0a0d13;padding:22px 26px;border-radius:12px 12px 0 0">
+ <div style="color:#C8A24B;font-weight:800;letter-spacing:3px;font-size:13px;text-transform:uppercase">CRCP · Commercial Real Estate Command Post</div>
+ <div style="color:#EAECEF;font-size:24px;font-weight:800;margin-top:6px">New activity in your markets</div>
+ <div style="color:#8A93A2;font-size:13px;margin-top:4px">${new Date().toLocaleDateString(undefined,{weekday:'long',month:'long',day:'numeric',year:'numeric'})}</div>
+ </div>
+ <div style="border:1px solid #e6e8ec;border-top:none;border-radius:0 0 12px 12px;padding:24px 26px">`;
+
+ if (!showListings.length && !showBrokers.length) {
+ body += `<p style="color:#6b7280">No new listings or brokers in your markets since the last update.</p>`;
+ }
+
+ if (showListings.length) {
+ body += `<h2 style="font-size:16px;margin:0 0 12px">🏢 ${showListings.length} new listing${showListings.length>1?'s':''}</h2>`;
+ for (const [metro, items] of Object.entries(lMetros)) {
+ body += `<div style="font-size:12px;font-weight:700;color:#C8A24B;text-transform:uppercase;letter-spacing:1px;margin:14px 0 6px">${metroLabel(metro)}</div>`;
+ for (const l of items.slice(0, 25)) {
+ body += `<div style="padding:10px 12px;border:1px solid #eef0f3;border-radius:8px;margin-bottom:8px">
+ <div style="font-weight:700">${l.address || 'Address on file'} <span style="color:#8A93A2;font-weight:400">· ${l.city || ''}</span></div>
+ <div style="font-size:13px;color:#4b5563;margin-top:3px">${money(l.price)}${l.type?` · ${l.type}`:''}${l.units?` · ${l.units} units`:''}${l.cap_rate?` · ${l.cap_rate}% cap`:''}</div>
+ ${l.upside_note?`<div style="font-size:12px;color:#6b7280;margin-top:3px">${l.upside_note}</div>`:''}
+ </div>`;
+ }
+ }
+ }
+
+ if (showBrokers.length) {
+ body += `<h2 style="font-size:16px;margin:20px 0 12px">👤 ${showBrokers.length} new broker${showBrokers.length>1?'s':''} indexed</h2>`;
+ for (const b of showBrokers.slice(0, 40)) {
+ body += `<div style="font-size:13px;padding:6px 0;border-bottom:1px solid #f2f4f6">
+ <b>${b.name || 'Unknown'}</b>${b.firm?` · ${b.firm}`:''}${b.agent_type?` <span style="color:#8A93A2">(${b.agent_type})</span>`:''}</div>`;
+ }
+ }
+
+ body += `<div style="margin-top:22px;padding-top:16px;border-top:1px solid #e6e8ec;font-size:12px;color:#8A93A2">
+ You're getting the <b>${sub.cadence}</b> digest for ${all?'all markets':sub.metros.map(metroLabel).join(', ')}.
+ Open <a href="https://crcp.agentabrams.com" style="color:#C8A24B">CRCP</a> to work these leads.
+ </div></div></div>`;
+ return { html: body, listingCount: showListings.length, brokerCount: showBrokers.length };
+}
+
+// ---- George send (GATED) -------------------------------------------------
+function georgeSend({ to, subject, html, from }) {
+ return new Promise((resolve, reject) => {
+ const base = process.env.GEORGE_URL || 'http://127.0.0.1:9850';
+ const token = process.env.GEORGE_EXTERNAL_SEND_TOKEN || '';
+ if (!token) return reject(new Error('GEORGE_EXTERNAL_SEND_TOKEN not set — external send blocked (fail-closed)'));
+ const payload = JSON.stringify({ to, subject, html, from, account: 'steve-office' });
+ const u = new URL(base + '/send');
+ const lib = u.protocol === 'https:' ? https : http;
+ const req = lib.request(u, { method: 'POST', headers: {
+ 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload),
+ 'X-Send-Approval': token,
+ } }, r => { let s = ''; r.on('data', d => s += d); r.on('end', () => (r.statusCode < 300 ? resolve(s) : reject(new Error(`George ${r.statusCode}: ${s.slice(0,200)}`)))); });
+ req.on('error', reject); req.write(payload); req.end();
+ });
+}
+
+// ---- main ----------------------------------------------------------------
+(async () => {
+ fs.mkdirSync(OUT, { recursive: true });
+ const cfg = loadConfig();
+ const state = loadState();
+ const seenL = new Set(state.seen.listings || []);
+ const seenB = new Set(state.seen.brokers || []);
+
+ const listings = loadListings();
+ const brokers = loadBrokers();
+ const newListings = listings.filter(l => !seenL.has(l.id));
+ const newBrokers = brokers.filter(b => !seenB.has(b.id));
+
+ console.log(`snapshot: ${listings.length} listings (${newListings.length} new), ${brokers.length} brokers (${newBrokers.length} new)`);
+ console.log(`mode: ${SEND ? 'SEND (gated)' : 'DRY-RUN (no send, state unchanged unless --commit-state)'}`);
+
+ const date = new Date().toISOString().slice(0, 10);
+ const results = [];
+ for (const sub of cfg.subscribers) {
+ const { html, listingCount, brokerCount } = buildDigestHTML(sub, newListings, newBrokers);
+ if (!listingCount && !brokerCount) { console.log(` ${sub.email}: nothing new — skip`); continue; }
+ const subject = `CRCP: ${listingCount} new listing${listingCount!==1?'s':''}${brokerCount?` · ${brokerCount} new broker${brokerCount!==1?'s':''}`:''}`;
+ const file = path.join(OUT, `${date}-${sub.email.replace(/[^a-z0-9]/gi,'_')}.html`);
+ fs.writeFileSync(file, html);
+ results.push({ email: sub.email, subject, listingCount, brokerCount, file });
+ console.log(` ${sub.email}: ${listingCount} listings + ${brokerCount} brokers → ${path.relative(ROOT, file)}`);
+
+ if (SEND) {
+ try { await georgeSend({ to: sub.email, subject, html, from: cfg.from }); console.log(` ✉ sent via George`); }
+ catch (e) { console.error(` ⚠ send failed: ${e.message}`); }
+ }
+ }
+
+ if (COMMIT_STATE) {
+ state.seen.listings = listings.map(l => l.id);
+ state.seen.brokers = brokers.map(b => b.id);
+ state.last_run = new Date().toISOString();
+ fs.writeFileSync(STATE_PATH, JSON.stringify(state, null, 2));
+ console.log(`state advanced → ${path.relative(ROOT, STATE_PATH)} (${SEND ? 'post-send' : 'baseline seed'})`);
+ } else {
+ console.log('state NOT advanced (dry-run). Re-run with --send to send + advance, or --commit-state to seed baseline.');
+ }
+ console.log(`\ndone: ${results.length} digest(s) built.`);
+})();
diff --git a/scripts/run-email-alerts.sh b/scripts/run-email-alerts.sh
new file mode 100644
index 0000000..a8ef8fd
--- /dev/null
+++ b/scripts/run-email-alerts.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+# CRCP email-alerts runner (invoked by launchd once approved).
+# Sources .env for GEORGE_URL + GEORGE_EXTERNAL_SEND_TOKEN, then runs the
+# snapshot-diff alert engine in SEND mode (which also advances seen-state).
+set -a
+[ -f "$HOME/Projects/commercialrealestate/.env" ] && . "$HOME/Projects/commercialrealestate/.env"
+set +a
+cd "$HOME/Projects/commercialrealestate" || exit 1
+/usr/bin/env node scripts/email-alerts.js --send
← 52b71e1 broker-email-finder: --browser tier (real system Chrome) rec
·
back to Commercialrealestate
·
CRCP multi-metro listings sweep: generalize SFV Crexi scrape 367513f →