six-degrees 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +3 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +41 -13
- package/.next/standalone/.next/routes-manifest.json +12 -0
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +19 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +19 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +15 -13
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/scraper/route.js +1 -1
- package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/social/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/social/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/social/route.js +8 -0
- package/.next/standalone/.next/server/app/api/social/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/social/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/import/page.js +1 -1
- package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/import.html +1 -1
- package/.next/standalone/.next/server/app/import.rsc +23 -21
- package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +23 -21
- package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +17 -15
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +21 -19
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +17 -15
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +21 -19
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/launch/page.js +1 -1
- package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/launch.html +2 -2
- package/.next/standalone/.next/server/app/launch.rsc +23 -21
- package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +23 -21
- package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +17 -15
- package/.next/standalone/.next/server/app/page.js +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/paths/page.js +1 -1
- package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/paths.html +1 -1
- package/.next/standalone/.next/server/app/paths.rsc +23 -21
- package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +23 -21
- package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +17 -15
- package/.next/standalone/.next/server/app/profile/page.js +1 -1
- package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/profile.html +1 -1
- package/.next/standalone/.next/server/app/profile.rsc +23 -21
- package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +23 -21
- package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +17 -15
- package/.next/standalone/.next/server/app/queue/page.js +1 -1
- package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/queue.html +1 -1
- package/.next/standalone/.next/server/app/queue.rsc +23 -21
- package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +23 -21
- package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +17 -15
- package/.next/standalone/.next/server/app/scores/page.js +1 -1
- package/.next/standalone/.next/server/app/scores/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/scores/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/scores.html +1 -1
- package/.next/standalone/.next/server/app/scores.rsc +23 -21
- package/.next/standalone/.next/server/app/scores.segments/_full.segment.rsc +23 -21
- package/.next/standalone/.next/server/app/scores.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/scores.segments/scores/__PAGE__.segment.rsc +17 -15
- package/.next/standalone/.next/server/app/settings/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +23 -21
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +23 -21
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +17 -15
- package/.next/standalone/.next/server/app/setup/page.js +1 -1
- package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/setup.html +1 -1
- package/.next/standalone/.next/server/app/setup.rsc +23 -21
- package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +23 -21
- package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +17 -15
- package/.next/standalone/.next/server/app/social/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/social/page/build-manifest.json +20 -0
- package/.next/standalone/.next/server/app/social/page/next-font-manifest.json +11 -0
- package/.next/standalone/.next/server/app/social/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/social/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/social/page.js +13 -0
- package/.next/standalone/.next/server/app/social/page.js.map +5 -0
- package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/social.html +1 -0
- package/.next/standalone/.next/server/app/social.meta +26 -0
- package/.next/standalone/.next/server/app/social.rsc +26 -0
- package/.next/standalone/.next/server/app/social.segments/_full.segment.rsc +26 -0
- package/.next/standalone/.next/server/app/social.segments/_tree.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/social.segments/social/__PAGE__.segment.rsc +30 -0
- package/.next/standalone/.next/server/app-paths-manifest.json +3 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljnyho._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17kn1mk._.js +8 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0uag-k5._.js → [root-of-the-server]__1dmc7-t._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_1_fynia._.js +5 -5
- package/.next/standalone/.next/server/chunks/_1itd1o_._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1xh07bp._.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_social_route_actions_1_3c6qn.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__16hs8kw._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1feicqq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1jeztd-._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_005q9n1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_08_03wh._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_08cfj2b._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0j4-lc3._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0hw_qnj._.js → _0wxbq78._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0xkur4p._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_15x6q32._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_1cyxocj._.js → _1ap1tu_._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1mj739k._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_social_page_actions_176i1kl.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +3 -3
- package/.next/standalone/.next/server/chunks/ssr/app_scores_page_09wepvv.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_setup_page_1-282zx.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_social_page_0h7zxda.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_0i8v-s3._.js +3 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +4 -0
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/prefetch-hints.json +14 -0
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/04a3zockahetx.js +1 -0
- package/.next/standalone/.next/static/chunks/0a5iadnmt9u9k.js +1 -0
- package/.next/standalone/.next/static/chunks/{2p6o90z0vgcwr.css → 0bo1dxn5gwzpk.css} +1 -1
- package/.next/standalone/.next/static/chunks/0g_p4p7oci18u.js +1 -0
- package/.next/standalone/.next/static/chunks/{0ax_9zzboyv6d.js → 17-rhp8sg4m1b.js} +2 -2
- package/.next/standalone/.next/static/chunks/1ra4cwcp75tfa.js +1 -0
- package/.next/standalone/.next/static/chunks/236f0jtp68j_h.js +1 -0
- package/.next/standalone/.next/static/chunks/24m745q_85u34.js +6 -0
- package/.next/standalone/.next/static/chunks/2_wcobfqry2uj.js +1 -0
- package/.next/standalone/.next/static/chunks/2dwtoszeq91us.js +1 -0
- package/.next/standalone/.next/static/chunks/2hvcevue9aro4.js +1 -0
- package/.next/standalone/.next/static/chunks/2uo9i03_05rqi.js +18 -0
- package/.next/standalone/.next/static/chunks/3p_pwu5gx2i9h.js +1 -0
- package/.next/standalone/.next/static/chunks/3yc3rzp4dxvyo.js +1 -0
- package/.next/standalone/.next/static/chunks/3zw8bv7-mc4n6.js +33 -0
- package/.next/standalone/CHANGELOG.md +63 -0
- package/.next/standalone/app/api/network/route.js +11 -0
- package/.next/standalone/app/api/scraper/route.js +19 -0
- package/.next/standalone/app/api/social/route.js +96 -0
- package/.next/standalone/app/components/AutoScanButton.js +41 -0
- package/.next/standalone/app/components/ChainView.js +7 -0
- package/.next/standalone/app/components/FilterPanel.js +37 -5
- package/.next/standalone/app/components/OrbitGraph.js +17 -4
- package/.next/standalone/app/components/ScanStatusBar.js +96 -0
- package/.next/standalone/app/components/SeparationView.js +9 -1
- package/.next/standalone/app/components/Sidebar.js +88 -26
- package/.next/standalone/app/components/SocialAutoSync.js +34 -0
- package/.next/standalone/app/components/settings/NetworkHealthSection.js +85 -0
- package/.next/standalone/app/globals.css +4 -0
- package/.next/standalone/app/layout.js +6 -0
- package/.next/standalone/app/page.js +37 -4
- package/.next/standalone/app/scores/page.js +3 -0
- package/.next/standalone/app/setup/page.js +13 -1
- package/.next/standalone/app/social/page.js +293 -0
- package/.next/standalone/lib/experimental-client.js +38 -0
- package/.next/standalone/lib/insights.js +54 -0
- package/.next/standalone/lib/linkedin-export.js +156 -0
- package/.next/standalone/lib/network-health.js +42 -0
- package/.next/standalone/lib/network.js +1 -0
- package/.next/standalone/lib/scraper-client.js +1 -0
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/scripts/scrape.py +335 -5
- package/.next/static/chunks/04a3zockahetx.js +1 -0
- package/.next/static/chunks/0a5iadnmt9u9k.js +1 -0
- package/.next/static/chunks/{2p6o90z0vgcwr.css → 0bo1dxn5gwzpk.css} +1 -1
- package/.next/static/chunks/0g_p4p7oci18u.js +1 -0
- package/.next/static/chunks/{0ax_9zzboyv6d.js → 17-rhp8sg4m1b.js} +2 -2
- package/.next/static/chunks/1ra4cwcp75tfa.js +1 -0
- package/.next/static/chunks/236f0jtp68j_h.js +1 -0
- package/.next/static/chunks/24m745q_85u34.js +6 -0
- package/.next/static/chunks/2_wcobfqry2uj.js +1 -0
- package/.next/static/chunks/2dwtoszeq91us.js +1 -0
- package/.next/static/chunks/2hvcevue9aro4.js +1 -0
- package/.next/static/chunks/2uo9i03_05rqi.js +18 -0
- package/.next/static/chunks/3p_pwu5gx2i9h.js +1 -0
- package/.next/static/chunks/3yc3rzp4dxvyo.js +1 -0
- package/.next/static/chunks/3zw8bv7-mc4n6.js +33 -0
- package/CHANGELOG.md +63 -0
- package/lib/experimental-client.js +38 -0
- package/lib/insights.js +54 -0
- package/lib/linkedin-export.js +156 -0
- package/lib/network-health.js +42 -0
- package/lib/network.js +1 -0
- package/lib/scraper-client.js +1 -0
- package/package.json +1 -1
- package/scripts/scrape.py +335 -5
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h1_f_2._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__19ip1qq._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_06w_gl4._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_13kzrwv._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_15xuwkv._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1hgd5dp._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1vpfyd-._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_20w06i-._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/lib_1bn38gs._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_1f8t_rp._.js +0 -23
- package/.next/standalone/.next/static/chunks/049vavjsmqgmn.js +0 -33
- package/.next/standalone/.next/static/chunks/0cuuo2jwc9h94.js +0 -1
- package/.next/standalone/.next/static/chunks/0ljxa-wk_iu__.js +0 -18
- package/.next/standalone/.next/static/chunks/0mp9b72fm-jp6.js +0 -6
- package/.next/standalone/.next/static/chunks/1pre1cotntk6-.js +0 -1
- package/.next/standalone/.next/static/chunks/22x2_r768-u5i.js +0 -1
- package/.next/standalone/.next/static/chunks/28bu26ausqzmn.js +0 -1
- package/.next/standalone/.next/static/chunks/2jz311xl1pp_8.js +0 -1
- package/.next/standalone/.next/static/chunks/2ot61qsv6_0eq.js +0 -1
- package/.next/standalone/.next/static/chunks/2xjho0lroiwlq.js +0 -1
- package/.next/standalone/.next/static/chunks/3zs_6-nn0dapb.js +0 -1
- package/.next/static/chunks/049vavjsmqgmn.js +0 -33
- package/.next/static/chunks/0cuuo2jwc9h94.js +0 -1
- package/.next/static/chunks/0ljxa-wk_iu__.js +0 -18
- package/.next/static/chunks/0mp9b72fm-jp6.js +0 -6
- package/.next/static/chunks/1pre1cotntk6-.js +0 -1
- package/.next/static/chunks/22x2_r768-u5i.js +0 -1
- package/.next/static/chunks/28bu26ausqzmn.js +0 -1
- package/.next/static/chunks/2jz311xl1pp_8.js +0 -1
- package/.next/static/chunks/2ot61qsv6_0eq.js +0 -1
- package/.next/static/chunks/2xjho0lroiwlq.js +0 -1
- package/.next/static/chunks/3zs_6-nn0dapb.js +0 -1
- /package/.next/standalone/.next/static/{wGVrXBkFLmEB4snfhtOcO → VE8LeJXfD2H0_OgJxuJcm}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{wGVrXBkFLmEB4snfhtOcO → VE8LeJXfD2H0_OgJxuJcm}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{wGVrXBkFLmEB4snfhtOcO → VE8LeJXfD2H0_OgJxuJcm}/_ssgManifest.js +0 -0
- /package/.next/static/{wGVrXBkFLmEB4snfhtOcO → VE8LeJXfD2H0_OgJxuJcm}/_buildManifest.js +0 -0
- /package/.next/static/{wGVrXBkFLmEB4snfhtOcO → VE8LeJXfD2H0_OgJxuJcm}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{wGVrXBkFLmEB4snfhtOcO → VE8LeJXfD2H0_OgJxuJcm}/_ssgManifest.js +0 -0
|
@@ -27,11 +27,12 @@ in one session — LinkedIn detects automation and flags your account.
|
|
|
27
27
|
import argparse
|
|
28
28
|
import json
|
|
29
29
|
import os
|
|
30
|
+
import re
|
|
30
31
|
import signal
|
|
31
32
|
import sys
|
|
32
33
|
import time
|
|
33
34
|
import requests
|
|
34
|
-
from datetime import datetime
|
|
35
|
+
from datetime import datetime, timedelta
|
|
35
36
|
from pathlib import Path
|
|
36
37
|
from urllib.parse import parse_qs, urlparse
|
|
37
38
|
|
|
@@ -57,6 +58,8 @@ _ENV_LOCAL = _load_env_local()
|
|
|
57
58
|
# default to somebody else's deployment — that would send a user's network to
|
|
58
59
|
# a server they don't control.
|
|
59
60
|
APP_URL = os.getenv("APP_URL", "http://localhost:3000")
|
|
61
|
+
MESSAGING_URL = "https://www.linkedin.com/messaging/"
|
|
62
|
+
MESSAGE_SCROLLS = 6 # scrolls down the conversation list, a few seconds apart
|
|
60
63
|
|
|
61
64
|
CONNECTIONS_URL = "https://www.linkedin.com/mynetwork/invite-connect/connections/"
|
|
62
65
|
|
|
@@ -1274,6 +1277,17 @@ PAGE_PAUSE = 20 # seconds before each next page of results
|
|
|
1274
1277
|
CHUNK_COOLDOWN = 60 # extra seconds after every SAVE_EVERY_PAGES pages
|
|
1275
1278
|
LEGACY_PAGES_READ = 10 # how far every read before 0.1.6 went, at most
|
|
1276
1279
|
|
|
1280
|
+
# Experimental all-day pacing for Auto-Bridge (--experimental; item 44, Graph
|
|
1281
|
+
# Study §8). Openly slow, never disguised: fixed waits, no random "human" timing.
|
|
1282
|
+
# A sitting of SESSION_PAGES searches, then a long rest; searches only in the
|
|
1283
|
+
# daytime on this computer's clock; and at the daily budget it waits for the
|
|
1284
|
+
# budget to free up instead of stopping. Pages are saved one at a time.
|
|
1285
|
+
EXPERIMENT = {"on": False, "pages": 0, "wire": 0}
|
|
1286
|
+
SESSION_PAGES = 10 # searches in one sitting
|
|
1287
|
+
SESSION_REST = 45 * 60 # the rest after each sitting
|
|
1288
|
+
DRIP_HOURS = (9, 19) # searches only from 09:00 to 19:00, local time
|
|
1289
|
+
WIRE_SAMPLES = 5 # raw LinkedIn responses kept per run, for research
|
|
1290
|
+
|
|
1277
1291
|
|
|
1278
1292
|
# Someone whose connections are hidden can never produce a 2nd-degree row. The
|
|
1279
1293
|
# "who still needs bridging" query is "everyone with no 2nd-degree rows", so
|
|
@@ -1787,6 +1801,303 @@ def stop_requested():
|
|
|
1787
1801
|
return _stop_requested
|
|
1788
1802
|
|
|
1789
1803
|
|
|
1804
|
+
# LinkedIn's own data (experimental, with --experimental). While a circle is
|
|
1805
|
+
# read, the responses the browser already gets from LinkedIn's own API are kept
|
|
1806
|
+
# and read for the same people the page shows: the same traffic, no extra
|
|
1807
|
+
# requests. The page text stays in charge. This fills blanks for people both
|
|
1808
|
+
# found and gives the list's real total; people only in LinkedIn's data are
|
|
1809
|
+
# logged, not added, since a results page can carry other boxes ("People you
|
|
1810
|
+
# may know"). Each page logs how the two compare, and a few raw responses are
|
|
1811
|
+
# kept in the data folder (wire-samples/) to tune it from real ones.
|
|
1812
|
+
_WIRE = {"page": None, "responses": []}
|
|
1813
|
+
|
|
1814
|
+
|
|
1815
|
+
def _wire_tap(page):
|
|
1816
|
+
if _WIRE["page"] is page:
|
|
1817
|
+
return
|
|
1818
|
+
_WIRE["page"], _WIRE["responses"] = page, []
|
|
1819
|
+
|
|
1820
|
+
def keep(response):
|
|
1821
|
+
url = response.url
|
|
1822
|
+
if "/voyager/api/" in url and ("search" in url.lower() or "graphql" in url):
|
|
1823
|
+
_WIRE["responses"].append(response)
|
|
1824
|
+
page.on("response", keep)
|
|
1825
|
+
|
|
1826
|
+
|
|
1827
|
+
def mutual_count_text(text):
|
|
1828
|
+
"""LinkedIn's mutual line as a number, as the page reader's mutualCount reads it; None otherwise."""
|
|
1829
|
+
line = re.sub(r"\s+", " ", str(text or "")).strip()
|
|
1830
|
+
if not re.search(r"\bmutual connections?$", line, re.I) or len(line) > 300:
|
|
1831
|
+
return None
|
|
1832
|
+
num = lambda v: int(str(v).replace(",", ""))
|
|
1833
|
+
names = lambda v: len([p for p in re.split(r"\s*,\s*|\s+and\s+", v) if p])
|
|
1834
|
+
m = re.match(r"^([\d,]+) mutual connections?$", line, re.I)
|
|
1835
|
+
if m:
|
|
1836
|
+
return num(m.group(1))
|
|
1837
|
+
m = re.match(r"^(.*?)\s*\band ([\d,]+) others? mutual connections?$", line, re.I)
|
|
1838
|
+
if m:
|
|
1839
|
+
return max(1, names(m.group(1))) + num(m.group(2))
|
|
1840
|
+
if re.search(r"\bis a mutual connection$", line, re.I):
|
|
1841
|
+
return 1
|
|
1842
|
+
m = re.match(r"^(.+?)\s+are mutual connections$", line, re.I)
|
|
1843
|
+
return names(m.group(1)) if m else None
|
|
1844
|
+
|
|
1845
|
+
|
|
1846
|
+
def voyager_people(payload):
|
|
1847
|
+
"""Everyone in a LinkedIn API response who looks like a search result: anything with a
|
|
1848
|
+
title and a link to a profile, wherever it sits in the response."""
|
|
1849
|
+
out, seen = [], set()
|
|
1850
|
+
text = lambda v: (v.get("text") if isinstance(v, dict) else v if isinstance(v, str) else "") or ""
|
|
1851
|
+
|
|
1852
|
+
def photo(x):
|
|
1853
|
+
try:
|
|
1854
|
+
for a in (x.get("image") or {}).get("attributes") or []:
|
|
1855
|
+
vi = ((a.get("detailData") or {}).get("nonEntityProfilePicture") or {}).get("vectorImage") or a.get("vectorImage")
|
|
1856
|
+
if vi and vi.get("rootUrl") and vi.get("artifacts"):
|
|
1857
|
+
best = max(vi["artifacts"], key=lambda f: f.get("width") or 0)
|
|
1858
|
+
return vi["rootUrl"] + (best.get("fileIdentifyingUrlPathSegment") or "")
|
|
1859
|
+
except Exception:
|
|
1860
|
+
pass
|
|
1861
|
+
return ""
|
|
1862
|
+
|
|
1863
|
+
def walk(x):
|
|
1864
|
+
if isinstance(x, dict):
|
|
1865
|
+
nav = x.get("navigationUrl")
|
|
1866
|
+
if isinstance(nav, str) and "/in/" in nav and isinstance(x.get("title"), dict):
|
|
1867
|
+
url = nav.split("?")[0].split("#")[0].rstrip("/") + "/"
|
|
1868
|
+
name = text(x.get("title")).strip()
|
|
1869
|
+
if name and name != "LinkedIn Member" and url not in seen:
|
|
1870
|
+
seen.add(url)
|
|
1871
|
+
mutual = None
|
|
1872
|
+
for ins in x.get("insightsResolutionResults") or []:
|
|
1873
|
+
mutual = mutual_count_text(text(((ins or {}).get("simpleInsight") or {}).get("title")))
|
|
1874
|
+
if mutual:
|
|
1875
|
+
break
|
|
1876
|
+
out.append({"name": name, "headline": text(x.get("primarySubtitle")).strip(),
|
|
1877
|
+
"profileUrl": url, "imageUrl": photo(x), "mutualCount": mutual})
|
|
1878
|
+
for v in x.values():
|
|
1879
|
+
walk(v)
|
|
1880
|
+
elif isinstance(x, list):
|
|
1881
|
+
for v in x:
|
|
1882
|
+
walk(v)
|
|
1883
|
+
walk(payload)
|
|
1884
|
+
return out
|
|
1885
|
+
|
|
1886
|
+
|
|
1887
|
+
def voyager_total(payload):
|
|
1888
|
+
"""The list's length, when a response says it (totalResultCount); None otherwise."""
|
|
1889
|
+
stack = [payload]
|
|
1890
|
+
while stack:
|
|
1891
|
+
x = stack.pop()
|
|
1892
|
+
if isinstance(x, dict):
|
|
1893
|
+
v = x.get("totalResultCount")
|
|
1894
|
+
if isinstance(v, int) and v > 0:
|
|
1895
|
+
return v
|
|
1896
|
+
stack.extend(x.values())
|
|
1897
|
+
elif isinstance(x, list):
|
|
1898
|
+
stack.extend(x)
|
|
1899
|
+
return None
|
|
1900
|
+
|
|
1901
|
+
|
|
1902
|
+
def _wire_sample(data, prefix="search"):
|
|
1903
|
+
if EXPERIMENT["wire"] >= WIRE_SAMPLES:
|
|
1904
|
+
return
|
|
1905
|
+
try:
|
|
1906
|
+
raw = json.dumps(data)
|
|
1907
|
+
if len(raw) > 500_000:
|
|
1908
|
+
return
|
|
1909
|
+
folder = _home() / "wire-samples"
|
|
1910
|
+
folder.mkdir(parents=True, exist_ok=True)
|
|
1911
|
+
(folder / f"{prefix}-{int(time.time() * 1000)}.json").write_text(raw)
|
|
1912
|
+
EXPERIMENT["wire"] += 1
|
|
1913
|
+
except Exception:
|
|
1914
|
+
pass
|
|
1915
|
+
|
|
1916
|
+
|
|
1917
|
+
def _wire_merge(page, profile_url, page_results):
|
|
1918
|
+
"""Fill blanks in this page's people from LinkedIn's own data, and log how the two compare."""
|
|
1919
|
+
got, _WIRE["responses"] = _WIRE["responses"], []
|
|
1920
|
+
people, total = [], None
|
|
1921
|
+
for response in got:
|
|
1922
|
+
try:
|
|
1923
|
+
data = response.json()
|
|
1924
|
+
except Exception:
|
|
1925
|
+
continue
|
|
1926
|
+
_wire_sample(data)
|
|
1927
|
+
people.extend(voyager_people(data))
|
|
1928
|
+
total = total or voyager_total(data)
|
|
1929
|
+
if total:
|
|
1930
|
+
_LIST_TOTALS[profile_url] = int(total)
|
|
1931
|
+
own = (profile_url or "").rstrip("/").split("/")[-1]
|
|
1932
|
+
by_url = {c.get("profileUrl"): c for c in page_results}
|
|
1933
|
+
only_wire = 0
|
|
1934
|
+
for w in people:
|
|
1935
|
+
if own and own in w["profileUrl"]:
|
|
1936
|
+
continue
|
|
1937
|
+
c = by_url.get(w["profileUrl"])
|
|
1938
|
+
if c is None:
|
|
1939
|
+
only_wire += 1
|
|
1940
|
+
continue
|
|
1941
|
+
for k in ("name", "headline", "imageUrl"):
|
|
1942
|
+
if not c.get(k) and w.get(k):
|
|
1943
|
+
c[k] = w[k]
|
|
1944
|
+
if c.get("mutualCount") is None and w.get("mutualCount") is not None:
|
|
1945
|
+
c["mutualCount"] = w["mutualCount"]
|
|
1946
|
+
print(f" LinkedIn's own data: {len(people)} people, {only_wire} not in the page text"
|
|
1947
|
+
+ (f", list of about {total:,}" if total else ""), flush=True)
|
|
1948
|
+
return page_results
|
|
1949
|
+
|
|
1950
|
+
|
|
1951
|
+
_PROFILE_LINK = re.compile(r"https://www\\.linkedin\\.com/in/[^/?#\\s\"']+")
|
|
1952
|
+
|
|
1953
|
+
|
|
1954
|
+
def voyager_conversations(payload):
|
|
1955
|
+
"""Conversations in a LinkedIn messaging response (experimental): per conversation,
|
|
1956
|
+
everyone in it (profile links), when it was last active, and unread messages.
|
|
1957
|
+
Anything with a lastActivityAt and participants, wherever it sits. Never the text."""
|
|
1958
|
+
out = []
|
|
1959
|
+
|
|
1960
|
+
def people(x):
|
|
1961
|
+
found = set()
|
|
1962
|
+
stack = [x]
|
|
1963
|
+
while stack:
|
|
1964
|
+
v = stack.pop()
|
|
1965
|
+
if isinstance(v, dict):
|
|
1966
|
+
pid = v.get("publicIdentifier")
|
|
1967
|
+
if isinstance(pid, str) and pid and pid != "UNKNOWN":
|
|
1968
|
+
found.add(f"https://www.linkedin.com/in/{pid}/")
|
|
1969
|
+
stack.extend(v.values())
|
|
1970
|
+
elif isinstance(v, list):
|
|
1971
|
+
stack.extend(v)
|
|
1972
|
+
elif isinstance(v, str):
|
|
1973
|
+
for m in _PROFILE_LINK.findall(v):
|
|
1974
|
+
found.add(m.rstrip("/") + "/")
|
|
1975
|
+
return found
|
|
1976
|
+
|
|
1977
|
+
def walk(x):
|
|
1978
|
+
if isinstance(x, dict):
|
|
1979
|
+
at = x.get("lastActivityAt")
|
|
1980
|
+
parts = [v for k, v in x.items() if "participant" in k.lower()]
|
|
1981
|
+
if isinstance(at, (int, float)) and at > 1e12 and parts:
|
|
1982
|
+
who = set()
|
|
1983
|
+
for v in parts:
|
|
1984
|
+
who |= people(v)
|
|
1985
|
+
if who:
|
|
1986
|
+
unread = x.get("unreadCount")
|
|
1987
|
+
out.append({"people": sorted(who), "at": int(at), "unread": int(unread) if isinstance(unread, (int, float)) else None})
|
|
1988
|
+
for v in x.values():
|
|
1989
|
+
walk(v)
|
|
1990
|
+
elif isinstance(x, list):
|
|
1991
|
+
for v in x:
|
|
1992
|
+
walk(v)
|
|
1993
|
+
walk(payload)
|
|
1994
|
+
return out
|
|
1995
|
+
|
|
1996
|
+
|
|
1997
|
+
def sync_messages(headless=False):
|
|
1998
|
+
"""Experimental: read your LinkedIn messages list once, for the Social tab. Opens
|
|
1999
|
+
Messaging in your own Chrome, scrolls the list a few times, and keeps from LinkedIn's
|
|
2000
|
+
own data only who each 1:1 conversation is with, when it was last active and whether
|
|
2001
|
+
it has unread messages. No search budget; no message text is read or kept."""
|
|
2002
|
+
from playwright.sync_api import sync_playwright
|
|
2003
|
+
kept = []
|
|
2004
|
+
with sync_playwright() as p:
|
|
2005
|
+
browser = p.chromium.launch_persistent_context(
|
|
2006
|
+
user_data_dir=get_scraper_profile_path(), headless=headless, channel="chrome",
|
|
2007
|
+
args=["--disable-blink-features=AutomationControlled"], timeout=120000)
|
|
2008
|
+
page = browser.pages[0] if browser.pages else browser.new_page()
|
|
2009
|
+
page.set_default_timeout(120000)
|
|
2010
|
+
if not ensure_logged_in(page):
|
|
2011
|
+
browser.close()
|
|
2012
|
+
return
|
|
2013
|
+
page.on("response", lambda r: kept.append(r) if "/voyager/api/" in r.url and "messag" in r.url.lower() else None)
|
|
2014
|
+
print("Opening your messages list...")
|
|
2015
|
+
try:
|
|
2016
|
+
page.goto(MESSAGING_URL, wait_until="domcontentloaded")
|
|
2017
|
+
except Exception:
|
|
2018
|
+
pass
|
|
2019
|
+
time.sleep(6)
|
|
2020
|
+
for i in range(MESSAGE_SCROLLS):
|
|
2021
|
+
if stop_requested() or _window_closed(page):
|
|
2022
|
+
break
|
|
2023
|
+
try:
|
|
2024
|
+
page.evaluate("""() => { const l = document.querySelector('.msg-conversations-container__conversations-list, [class*="conversations-list"]');
|
|
2025
|
+
if (l) l.scrollTop = l.scrollHeight; }""")
|
|
2026
|
+
except Exception:
|
|
2027
|
+
pass
|
|
2028
|
+
print(f" Reading the list ({i + 1} of {MESSAGE_SCROLLS})...", flush=True)
|
|
2029
|
+
time.sleep(4)
|
|
2030
|
+
convos = []
|
|
2031
|
+
for r in kept:
|
|
2032
|
+
try:
|
|
2033
|
+
data = r.json()
|
|
2034
|
+
except Exception:
|
|
2035
|
+
continue
|
|
2036
|
+
_wire_sample(data, prefix="messages")
|
|
2037
|
+
convos.extend(voyager_conversations(data))
|
|
2038
|
+
browser.close()
|
|
2039
|
+
# You are the one in the most conversations; keep the 1:1 ones.
|
|
2040
|
+
counts = {}
|
|
2041
|
+
for c in convos:
|
|
2042
|
+
for u in c["people"]:
|
|
2043
|
+
counts[u] = counts.get(u, 0) + 1
|
|
2044
|
+
me = max(counts, key=counts.get) if counts else None
|
|
2045
|
+
people = {}
|
|
2046
|
+
for c in convos:
|
|
2047
|
+
others = [u for u in c["people"] if u != me]
|
|
2048
|
+
if len(others) != 1:
|
|
2049
|
+
continue
|
|
2050
|
+
cur = people.get(others[0])
|
|
2051
|
+
if not cur or c["at"] > cur["last"]:
|
|
2052
|
+
people[others[0]] = {"last": c["at"], "unread": c["unread"]}
|
|
2053
|
+
print(f" Found {len(convos)} conversations in LinkedIn's data, {len(people)} with one person.")
|
|
2054
|
+
try:
|
|
2055
|
+
requests.put(f"{APP_URL}/api/social", json={"live": people}, headers=app_headers(), timeout=30)
|
|
2056
|
+
print(" Saved for the Social tab.")
|
|
2057
|
+
except Exception as e:
|
|
2058
|
+
print(f" Couldn't save them: {e}")
|
|
2059
|
+
|
|
2060
|
+
|
|
2061
|
+
def _drip_wait(label, seconds):
|
|
2062
|
+
"""Wait `seconds` for an experimental rest, saying when it ends, a line a minute. False if stopped."""
|
|
2063
|
+
seconds = max(1, int(seconds))
|
|
2064
|
+
until = datetime.fromtimestamp(time.time() + seconds).strftime("%H:%M")
|
|
2065
|
+
print(f" {label}. Carrying on at {until}.", flush=True)
|
|
2066
|
+
return interruptible_sleep(seconds, on_tick=lambda left: print(f" {label}: {max(1, left // 60)} min to go", flush=True), step=60)
|
|
2067
|
+
|
|
2068
|
+
|
|
2069
|
+
def _seconds_until_search_frees(now=None):
|
|
2070
|
+
"""How long until the oldest search in the last 24 hours drops out of the daily budget."""
|
|
2071
|
+
now = now if now is not None else time.time()
|
|
2072
|
+
recent = sorted(t for t in _read_activity()["searches"] if now - DAY_SECONDS < t <= now)
|
|
2073
|
+
return (recent[0] + DAY_SECONDS - now + 5) if recent else 5
|
|
2074
|
+
|
|
2075
|
+
|
|
2076
|
+
def _drip_before_search():
|
|
2077
|
+
"""Experimental pacing, before a search: rest after a sitting, sleep through the
|
|
2078
|
+
night, and wait for a used daily budget to free up. True to go ahead, False if stopped."""
|
|
2079
|
+
while True:
|
|
2080
|
+
if EXPERIMENT["pages"] >= SESSION_PAGES:
|
|
2081
|
+
EXPERIMENT["pages"] = 0
|
|
2082
|
+
if not _drip_wait(f"Resting after {SESSION_PAGES} pages", SESSION_REST):
|
|
2083
|
+
return False
|
|
2084
|
+
continue
|
|
2085
|
+
now = datetime.fromtimestamp(time.time())
|
|
2086
|
+
if not (DRIP_HOURS[0] <= now.hour < DRIP_HOURS[1]):
|
|
2087
|
+
start = now.replace(hour=DRIP_HOURS[0], minute=0, second=0, microsecond=0)
|
|
2088
|
+
if now.hour >= DRIP_HOURS[1]:
|
|
2089
|
+
start += timedelta(days=1)
|
|
2090
|
+
if not _drip_wait("Resting overnight", (start - now).total_seconds()):
|
|
2091
|
+
return False
|
|
2092
|
+
continue
|
|
2093
|
+
left, kind = searches_left()
|
|
2094
|
+
if left <= 0 and kind == "daily":
|
|
2095
|
+
if not _drip_wait("Today's searches are used", _seconds_until_search_frees()):
|
|
2096
|
+
return False
|
|
2097
|
+
continue
|
|
2098
|
+
return True
|
|
2099
|
+
|
|
2100
|
+
|
|
1790
2101
|
def interruptible_sleep(seconds, on_tick=None, step=5):
|
|
1791
2102
|
"""Sleep, but notice a stop request. Returns False if we were interrupted."""
|
|
1792
2103
|
waited = 0
|
|
@@ -2402,6 +2713,12 @@ def _scrape_one_bridge(page, bridge_name, bridge_id, profile_url, max_pages=LINK
|
|
|
2402
2713
|
# 1st, 2nd and 3rd+ — all of them; the app drops your own connections when
|
|
2403
2714
|
# it saves. It used to be announced as a "3rd+ filter", which it never was.
|
|
2404
2715
|
search_url = f"https://www.linkedin.com/search/results/people/?network=%5B%22F%22%2C%22S%22%2C%22O%22%5D&connectionOf=%5B%22{urn}%22%5D"
|
|
2716
|
+
if EXPERIMENT["on"] and not _drip_before_search():
|
|
2717
|
+
reach["more"] = True
|
|
2718
|
+
print(" Stopped before their list opened; the next run carries on from there.")
|
|
2719
|
+
return [], "stopped", reach
|
|
2720
|
+
if EXPERIMENT["on"]:
|
|
2721
|
+
_wire_tap(page)
|
|
2405
2722
|
left, kind = searches_left()
|
|
2406
2723
|
if left <= 0:
|
|
2407
2724
|
reach["budget"] = kind
|
|
@@ -2547,6 +2864,9 @@ def _scrape_one_bridge(page, bridge_name, bridge_id, profile_url, max_pages=LINK
|
|
|
2547
2864
|
break
|
|
2548
2865
|
|
|
2549
2866
|
page_results = [c for c in page_results if slug not in c.get("profileUrl", "")]
|
|
2867
|
+
if EXPERIMENT["on"]:
|
|
2868
|
+
page_results = _wire_merge(page, profile_url, page_results)
|
|
2869
|
+
EXPERIMENT["pages"] += 1
|
|
2550
2870
|
chunk.extend(page_results)
|
|
2551
2871
|
chunk_pages += 1
|
|
2552
2872
|
reach["last"] = pg
|
|
@@ -2569,7 +2889,7 @@ def _scrape_one_bridge(page, bridge_name, bridge_id, profile_url, max_pages=LINK
|
|
|
2569
2889
|
# own path: through the page-limit branch, a missing Next button would
|
|
2570
2890
|
# have marked the list finished.
|
|
2571
2891
|
left, kind = searches_left()
|
|
2572
|
-
if left <= 0:
|
|
2892
|
+
if left <= 0 and not (EXPERIMENT["on"] and kind == "daily"):
|
|
2573
2893
|
# Looking for Next costs nothing. No Next on a live page of results
|
|
2574
2894
|
# means the list is finished — not paused at the next page forever.
|
|
2575
2895
|
if _find_next(page) is None and not _window_closed(page) and _result_links(page):
|
|
@@ -2582,10 +2902,10 @@ def _scrape_one_bridge(page, bridge_name, bridge_id, profile_url, max_pages=LINK
|
|
|
2582
2902
|
|
|
2583
2903
|
# Rest before the next search, and longer after every SAVE_EVERY_PAGES.
|
|
2584
2904
|
rest = PAGE_PAUSE
|
|
2585
|
-
if (pg - start_page + 1) % SAVE_EVERY_PAGES == 0:
|
|
2905
|
+
if not EXPERIMENT["on"] and (pg - start_page + 1) % SAVE_EVERY_PAGES == 0:
|
|
2586
2906
|
rest += CHUNK_COOLDOWN
|
|
2587
2907
|
print(f" {SAVE_EVERY_PAGES} pages read; resting {rest}s before the next search.")
|
|
2588
|
-
if not interruptible_sleep(rest) or _window_closed(page):
|
|
2908
|
+
if not interruptible_sleep(rest) or _window_closed(page) or (EXPERIMENT["on"] and not _drip_before_search()):
|
|
2589
2909
|
reach["more"] = True
|
|
2590
2910
|
print(f" Stopped before page {pg + 1}; the next run carries on from there.")
|
|
2591
2911
|
break
|
|
@@ -2610,7 +2930,7 @@ def _scrape_one_bridge(page, bridge_name, bridge_id, profile_url, max_pages=LINK
|
|
|
2610
2930
|
|
|
2611
2931
|
# Save as it goes, so a stop, a crash or the search limit costs at most
|
|
2612
2932
|
# the last few pages rather than the whole list.
|
|
2613
|
-
if on_save and chunk_pages >= SAVE_EVERY_PAGES:
|
|
2933
|
+
if on_save and chunk_pages >= (1 if EXPERIMENT["on"] else SAVE_EVERY_PAGES):
|
|
2614
2934
|
on_save(_dedupe(chunk), reach["last"], True, reach["urn"])
|
|
2615
2935
|
chunk, chunk_pages = [], 0
|
|
2616
2936
|
|
|
@@ -3752,6 +4072,11 @@ Examples:
|
|
|
3752
4072
|
parser.add_argument("--bridge", type=str, help="Name of one bridge person to scrape")
|
|
3753
4073
|
parser.add_argument("--rescrape", type=str, help="Delete + re-scrape a bridge's cluster from scratch")
|
|
3754
4074
|
parser.add_argument("--company", type=str, help="Scan everyone the app can see at one company")
|
|
4075
|
+
parser.add_argument("--messages", action="store_true",
|
|
4076
|
+
help="Experimental: read your messages list once for the Social tab (who, when, unread; never text)")
|
|
4077
|
+
parser.add_argument("--experimental", action="store_true",
|
|
4078
|
+
help="Auto-Bridge, experimental: all-day pacing (sittings, rests, daytime only, "
|
|
4079
|
+
"waits for the daily budget) and reading LinkedIn's own data beside the page text")
|
|
3755
4080
|
parser.add_argument("--auto-bridge", action="store_true",
|
|
3756
4081
|
help="Map every bridge in turn, highest tier first")
|
|
3757
4082
|
parser.add_argument("--retry-private", action="store_true",
|
|
@@ -3783,6 +4108,9 @@ Examples:
|
|
|
3783
4108
|
"(every scan also does this at its end)")
|
|
3784
4109
|
parser.add_argument("--headless", action="store_true", help="Run browser in headless mode")
|
|
3785
4110
|
args = parser.parse_args()
|
|
4111
|
+
if getattr(args, "experimental", False):
|
|
4112
|
+
EXPERIMENT["on"] = True
|
|
4113
|
+
print("Experimental Auto-Bridge: all-day pacing, and LinkedIn's own data read beside the page text.")
|
|
3786
4114
|
args.max_pages = max(1, min(LINKEDIN_MAX_PAGES, args.max_pages))
|
|
3787
4115
|
|
|
3788
4116
|
# A failed save ends the run with its reason, not a traceback (TRAPS §32).
|
|
@@ -3843,6 +4171,8 @@ Examples:
|
|
|
3843
4171
|
only_unfinished=args.only_unfinished)
|
|
3844
4172
|
done = sum(1 for r in results if r.get("status") == "done")
|
|
3845
4173
|
print(f"\nDone. {done}/{len(results)} bridges mapped.")
|
|
4174
|
+
elif args.messages:
|
|
4175
|
+
sync_messages(headless=args.headless)
|
|
3846
4176
|
elif args.search:
|
|
3847
4177
|
scrape_full(headless=args.headless)
|
|
3848
4178
|
elif args.full:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,40643,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(22016),a=e.i(40996),o=e.i(68792);let l={full:"Scanning your network",refresh:"Checking for new connections",bridge:"Scanning a circle",resume:"Carrying on with a circle","resume-all":"Carrying on with circles","auto-bridge":"Auto-Bridge","auto-bridge-retry":"Auto-Bridge",rescrape:"Re-scanning a circle",login:"Signing in to LinkedIn",setup:"Setting up the scanner",company:"Scanning a company",photos:"Saving photos",messages:"Reading your messages list"};e.s(["default",0,function(){let e,u,[i,s]=(0,r.useState)(()=>(0,a.scannerNow)()),[c,d]=(0,r.useState)(!1),f=(0,r.useSyncExternalStore)(o.watchAllDay,o.allDayNow,()=>!1);(0,r.useEffect)(()=>(0,a.watchScanner)(()=>{let e=(0,a.scannerNow)();s(e),e.running||d(!1)}),[]);let p={position:"fixed",left:"50%",top:"var(--scan-bar-top, 94px)",transform:"translateX(-50%)",zIndex:60,maxWidth:"calc(100vw - 32px)",display:"flex",alignItems:"center",gap:12,flexWrap:"nowrap",whiteSpace:"nowrap",padding:"8px 12px",borderRadius:12,fontSize:12,color:"#cfd8d8",background:"rgba(14,16,32,0.94)"};if(!i?.running)return f?(0,t.jsxs)("div",{role:"status",style:{...p,opacity:.55,border:"1px solid rgba(255,255,255,0.1)"},children:[(0,t.jsx)("span",{style:{width:8,height:8,borderRadius:"50%",background:"#556",flexShrink:0}}),(0,t.jsx)("b",{style:{color:"#b8c4c4"},children:"Auto scan"}),(0,t.jsx)("span",{style:{color:"#8b9a9a"},children:"ready · press Auto scan beside Scan to start"})]}):null;let g=i.progress,h=g?.kind==="batch"&&g.total?`${g.current||g.done||0} of ${g.total}`:g?.kind==="walk"&&g.total?`${(g.done||0).toLocaleString()} of ${g.total.toLocaleString()} read`:g?.kind==="saving"?"saving":null,y=i.budget,m=[...i.log||[]].reverse().find(e=>e&&e.trim())?.trim();return(0,t.jsxs)("div",{role:"status","aria-live":"polite",style:{...p,border:"1px solid rgba(0,255,136,0.25)"},children:[(0,t.jsx)("span",{style:{width:8,height:8,borderRadius:"50%",background:"#00ff88",flexShrink:0}}),(0,t.jsx)("b",{style:{color:"#fff"},children:l[i.action]||"Scanning"}),i.target?.name&&(0,t.jsx)("span",{children:i.target.name}),h&&(0,t.jsx)("span",{style:{color:"#8b9a9a"},children:h}),y&&(0,t.jsxs)("span",{style:{color:(e=y.searches,(u=y.cap)?e/u>=.9?"#ff6b6b":e/u>=.6?"#FFD700":"#00ff88":"#8b9a9a")},title:"Searches on your LinkedIn account in the last 24 hours, and your daily budget",children:[y.searches,y.cap?` of ${y.cap}`:""," searches today"]}),m&&(0,t.jsx)("span",{style:{color:"#667",flex:"0 1 240px",minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:m,children:m}),(0,t.jsx)(n.default,{href:"/setup",style:{color:"#3498DB",textDecoration:"none"},children:"Details"}),(0,t.jsx)("button",{onClick:async()=>{d(!0);try{await (0,a.stopScrape)()}catch{d(!1)}},disabled:c,title:"Stops after saving what's been read; Resume on the Scan page carries on from the same page",style:{padding:"4px 10px",borderRadius:8,fontSize:12,cursor:c?"default":"pointer",background:"rgba(255,107,107,0.12)",color:"#ff9b9b",border:"1px solid rgba(255,107,107,0.35)"},children:c?"Stopping…":"Stop"})]})}])},87915,e=>{"use strict";var t=e.i(71645),r=e.i(40996),n=e.i(64745);let a=!1;e.s(["default",0,function(){return(0,t.useEffect)(()=>{if(n.IS_DEMO||a)return;let e=()=>{};return fetch("/api/social").then(e=>e.json()).then(({social:t})=>{if(!t?.autoSync||a)return;let n=t.liveAt?Date.parse(t.liveAt):0,o=new Date().getHours();Date.now()-n<864e5||o<9||o>=19||(e=(0,r.watchScanner)(()=>{let t=(0,r.scannerNow)();t.known&&!a&&(a=!0,e(),t.running||(0,r.beginScrape)("messages").catch(()=>{}))}))}).catch(()=>{}),()=>e()},[]),null}])},37711,e=>{"use strict";var t=e.i(43476),r=e.i(71645);e.s(["default",0,function(){let[e,n]=(0,r.useState)(null);return((0,r.useEffect)(()=>{let e=!0;return fetch("/api/update").then(e=>e.json()).then(t=>{e&&t?.restartNeeded&&n(t)}).catch(()=>{}),()=>{e=!1}},[]),e)?(0,t.jsxs)("div",{role:"status",style:{position:"fixed",left:0,right:0,bottom:0,zIndex:9999,background:"linear-gradient(90deg, #FFD700, #FF6B35)",color:"#1a1200",padding:"9px 16px",fontSize:13,fontWeight:600,lineHeight:1.5,display:"flex",alignItems:"center",justifyContent:"center",gap:10,flexWrap:"wrap",textAlign:"center"},children:[(0,t.jsxs)("span",{children:["You have newer code on disk (",e.sha,") than this server is running (",e.bootSha,"). Restart it to see the changes — ",(0,t.jsx)("code",{style:{background:"rgba(0,0,0,0.16)",padding:"1px 6px",borderRadius:4},children:"Ctrl-C"})," in the terminal, then ",(0,t.jsx)("code",{style:{background:"rgba(0,0,0,0.16)",padding:"1px 6px",borderRadius:4},children:"npm run dev"}),"."]}),(0,t.jsx)("button",{onClick:()=>n(null),style:{border:"none",background:"rgba(0,0,0,0.18)",color:"#1a1200",borderRadius:6,padding:"3px 10px",fontWeight:700,cursor:"pointer"},children:"Dismiss"})]}):null}])},15812,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(65084),a=e.i(64745),o=e.i(7837);let l=(0,r.createContext)({userId:null,userName:null,userProfile:null,ready:!1});e.s(["default",0,function({children:e}){let[u,i]=(0,r.useState)(null),[s,c]=(0,r.useState)(null),[d,f]=(0,r.useState)(null),[p,g]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{if(a.IS_DEMO){i(a.DEMO_USER.id),c(a.DEMO_USER.name),f({name:a.DEMO_USER.name,headline:a.DEMO_USER.headline,role:"",company:"",industry:"",sectors:[],goals:[],linkedin_url:""}),g(!0);return}if((0,o.hasCsvNetwork)()){i(o.CSV_USER.id),c(o.CSV_USER.name),f({name:o.CSV_USER.name,headline:"Imported from your LinkedIn CSV",role:"",company:"",industry:"",sectors:[],goals:[],linkedin_url:""}),g(!0);return}fetch("/api/users?me=1").then(e=>e.json()).then(e=>{let t=e.user;if(!t)throw Error("no profile");(0,n.setUser)(t.id,t.name),i(t.id),c(t.name),f({name:t.name,headline:t.headline||"",role:t.role||"",company:t.company||"",industry:t.industry||"",sectors:t.sectors||[],goals:t.goals||[],linkedin_url:t.linkedin_url||""})}).catch(()=>{(0,n.hasUser)()&&(i((0,n.getUserId)()),c((0,n.getUserName)()))}).finally(()=>g(!0))},[]),(0,t.jsx)(l.Provider,{value:{userId:u,userName:s,userProfile:d,ready:p,login:(e,t)=>{(0,n.setUser)(e,t),i(e),c(t),fetch(`/api/users?id=${e}`).then(e=>e.json()).then(e=>{e.user&&f({name:e.user.name,headline:e.user.headline||"",role:e.user.role||"",company:e.user.company||"",industry:e.user.industry||"",sectors:e.user.sectors||[],goals:e.user.goals||[],linkedin_url:e.user.linkedin_url||""})}).catch(()=>{})}},children:e})},"useUser",0,function(){return(0,r.useContext)(l)}])},64745,e=>{"use strict";var t=e.i(47167),r=e.i(7837);let n="true"===t.default.env.NEXT_PUBLIC_DEMO_MODE,a=null;async function o(){if(a)return a;let e=await fetch("/demo-data.json",{cache:"no-cache"});if(!e.ok)throw Error("demo-data.json not found — run: node scripts/gen-synthetic.mjs");let t=await e.json();return a={degree1:t.degree1||[],degree2:t.degree2||[]}}async function l(){let e=await o();return(0,r.saveSessionNetwork)({degree1:e.degree1,degree2:e.degree2,source:"sample"}),{degree1:e.degree1.length,degree2:e.degree2.length}}e.s(["DEMO_USER",0,{id:"synthetic-demo-user",name:"You",headline:"Sample network"},"IS_DEMO",0,n,"loadDemoNetwork",0,o,"loadSampleIntoSession",0,l])},68792,e=>{"use strict";var t=e.i(40996);let r=(e,t)=>{try{let r=localStorage.getItem(e);return null===r?t:JSON.parse(r)}catch{return t}};e.s(["allDayNow",0,function(){try{return"true"===localStorage.getItem("six-degrees-experimental-auto")}catch{return!1}},"startAutoScan",0,function(){let e=r("six-degrees-bridge-order","newest");return(0,t.beginScrape)("auto-bridge",{experimental:!0,maxBridges:10,order:e,tiers:"score"===e?["S","A"]:[],maxPages:r("six-degrees-bridge-pages-v2",100),deeper:r("six-degrees-bridge-finish",!0)})},"watchAllDay",0,function(e){return window.addEventListener("storage",e),window.addEventListener("six-degrees:experimental",e),()=>{window.removeEventListener("storage",e),window.removeEventListener("six-degrees:experimental",e)}}])},40996,e=>{"use strict";async function t(){let e=await fetch("/api/scraper");if(!e.ok)throw Error("Could not reach the app.");return e.json()}async function r(e,t,n={}){let a=await fetch("/api/scraper",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:e,...t?{name:t}:{},...n})}),o=await a.json().catch(()=>({}));if(!a.ok)throw Error(o.error||"Could not start the scanner.");return o}async function n(e){let t=await fetch(`/api/scraper?resume=${encodeURIComponent(e)}`);return t.ok?(await t.json()).resume??null:null}Symbol.for("six-degrees.scan-state");let a=Object.freeze({skips:[],read:[]});async function o(){try{let e=await fetch("/api/scraper?reach=1");if(!e.ok)return a;let t=await e.json();return{skips:Array.isArray(t.skips)?t.skips:[],read:Array.isArray(t.read)?t.read:[]}}catch{return a}}async function l(e){let t=await fetch(`/api/scraper?person=${encodeURIComponent(e)}`);return t.ok?t.json():{person:null}}async function u(){await fetch("/api/scraper",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"cancel"})})}let i=Object.freeze({known:!1,running:!1,pending:!1,action:null,target:null,startedAt:null,progress:null,log:[],finished:[]}),s=new Set,c=i,d=JSON.stringify(c),f=null,p=null,g=0,h=!1,y=new Set;function m(e){let t=JSON.stringify(e);if(t!==d)for(let r of(d=t,c=Object.freeze(e),[...s]))r()}async function b(){(!("u">typeof document&&document.hidden)||c.running)&&await function(){if(p&&p.epoch===g)return p.promise;let e=g,t=fetch("/api/scraper?job=1").then(e=>e.ok?e.json():null).then(t=>{e===g&&function(e){if(!e||"object"!=typeof e)return;let t=!0===e.running;t&&null!=e.startedAt&&y.add(e.startedAt);let r=(Array.isArray(e.recent)?e.recent:[]).filter(e=>y.has(e.startedAt)).map(r=>({...r,log:!t&&r.startedAt===e.startedAt&&Array.isArray(e.log)?e.log:[]}));m({known:!0,running:t||h,pending:h&&!t,action:t?e.action??null:h?c.action:null,target:t?e.target??null:h?c.target:null,startedAt:t?e.startedAt??null:null,progress:t?e.progress??null:null,budget:t?e.budget??null:null,log:t&&Array.isArray(e.log)?e.log:[],finished:r})}(t)}).catch(()=>{}).finally(()=>{p?.promise===t&&(p=null)});return p={epoch:e,promise:t},t}(),clearTimeout(f),f=s.size?setTimeout(b,c.running?1500:5e3):null}function v(e){return s.add(e),1===s.size&&b(),()=>{s.delete(e),s.size||(clearTimeout(f),f=null)}}async function _(e,{name:t,id:n,onLog:a,...o}={}){let l;g++,h=!0,m({...c,known:!0,running:!0,pending:!0,action:e,target:t||n?{id:n??null,name:t??null}:null,startedAt:null,progress:null,log:[]});try{l=await r(e,t,{...n?{id:n}:{},...o})}catch(e){throw h=!1,g++,c.pending&&m({...c,running:!1,pending:!1,action:null,target:null,log:[]}),b(),e}h=!1,g++;let u=l?.startedAt??null;null!=u&&y.add(u);let i=new Promise(e=>{let t=v(()=>{c.running&&c.startedAt===u&&a?.(c.log);let r=null==u?c.running?null:{exitCode:null,failure:null,log:[]}:c.finished.find(e=>e.startedAt===u);r&&(t(),r.log.length&&a?.(r.log),e(r))});b()});return{startedAt:u,ended:i}}function j(e){return!!e?.target&&["bridge","rescrape","resume"].includes(e.action)}e.s(["NO_SCAN_NOTES",0,a,"SCANNER_UNKNOWN",0,i,"beginScrape",0,_,"busyReason",0,function(e=c){if(!e?.running)return null;let t=e.target?.name;switch(e.action){case"bridge":case"rescrape":case"resume":return t?`${t}’s circle is being scanned`:"A circle is being scanned";case"company":return t?`${t} is being scanned`:"A company is being scanned";case"auto-bridge":case"auto-bridge-retry":case"resume-all":return"Your bridges are being mapped, one by one";case"full":case"refresh":return"Your own connections are being scanned";default:switch(e.action){case"install":return"The scanner's packages are being installed";case"setup":return"The scanner is being set up";case"login":return"The LinkedIn sign-in window is open";case"photos":return"Profile photos are being saved";default:return"A scan is running"}}},"isCircleScan",0,j,"loadScanNotes",0,o,"notReadyMessage",0,function(e){if(!e)return"Could not reach the app.";let t=e.checks||{};return t.scriptsFound?t.dependencies?t.chrome?null:"Google Chrome is not installed.":t.python||t.download?"The scanner is not set up yet — open Scan to set it up.":"No Python 3.10 to 3.14 is installed on this machine.":"The scanner files are missing from this install."},"pickedPerson",0,l,"resumePoint",0,n,"runScrape",0,function(e,t={}){return _(e,t).then(e=>e.ended)},"scannerNow",0,function(){return c},"scansCircleOf",0,function(e,t){if(!j(e)||!t)return!1;let{id:r,name:n}=e.target;return r&&t.id?r===t.id:!!n&&n===t.name},"scraperStatus",0,t,"stopScrape",0,u,"watchScanner",0,v],40996)},22016,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return m},useLinkStatus:function(){return v}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809),l=e.r(43476),u=o._(e.r(71645)),i=e.r(95057),s=e.r(8372),c=e.r(18581),d=e.r(18967),f=e.r(5550),p=e.r(88540),g=e.r(91949),h=e.r(73668),y=e.r(9396);function m(t){var r;let n,a,o,[m,v]=(0,u.useOptimistic)(g.IDLE_LINK_STATUS),_=(0,u.useRef)(null),{href:j,as:S,children:x,prefetch:P=null,passHref:O,replace:C,shallow:w,scroll:E,onClick:R,onMouseEnter:T,onTouchStart:N,legacyBehavior:A=!1,onNavigate:k,transitionTypes:M,ref:D,unstable_dynamicOnHover:F,...L}=t;n=x,A&&("string"==typeof n||"number"==typeof n)&&(n=(0,l.jsx)("a",{children:n}));let I=u.default.useContext(s.AppRouterContext),U=!1!==P,B=!1===P?"none":!0===P?"full":"auto",$="none"!==B?"auto"===B?y.FetchStrategy.PPR:y.FetchStrategy.Full:y.FetchStrategy.PPR,H="string"==typeof(r=S||j)?r:(0,i.formatUrl)(r);if(A){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});a=u.default.Children.only(n)}let z=A?a&&"object"==typeof a&&a.ref:D,V,K=u.default.useCallback(e=>(null!==I&&(_.current=(0,g.mountLinkInstance)(e,H,I,$,U,v,V)),()=>{_.current&&((0,g.unmountLinkForCurrentNavigation)(_.current),_.current=null),(0,g.unmountPrefetchableInstance)(e)}),[U,H,I,$,v,V]),W={ref:(0,c.useMergedRef)(K,z),onClick(t){A||"function"!=typeof R||R(t),A&&a.props&&"function"==typeof a.props.onClick&&a.props.onClick(t),!I||t.defaultPrevented||function(t,r,n,a,o,l,i,s="none"){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,h.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:f}=e.r(99781);u.default.startTransition(()=>{f(r,a?"replace":"push",!1===o?p.ScrollBehavior.NoScroll:p.ScrollBehavior.Default,n.current,i,s)})}}(t,H,_,C,E,k,M,B)},onMouseEnter(e){A||"function"!=typeof T||T(e),A&&a.props&&"function"==typeof a.props.onMouseEnter&&a.props.onMouseEnter(e),I&&U&&(0,g.onNavigationIntent)(e.currentTarget,!0===F)},onTouchStart:function(e){A||"function"!=typeof N||N(e),A&&a.props&&"function"==typeof a.props.onTouchStart&&a.props.onTouchStart(e),I&&U&&(0,g.onNavigationIntent)(e.currentTarget,!0===F)}};return(0,d.isAbsoluteUrl)(H)?W.href=H:A&&!O&&("a"!==a.type||"href"in a.props)||(W.href=(0,f.addBasePath)(H)),o=A?u.default.cloneElement(a,W):(0,l.jsx)("a",{...L,...W,children:n}),(0,l.jsx)(b.Provider,{value:m,children:o})}let b=(0,u.createContext)(g.IDLE_LINK_STATUS),v=()=>(0,u.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},28298,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useRouterBFCache",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t,r){let[a,o]=(0,n.useState)(()=>({tree:e,cacheNode:t,stateKey:r,next:null}));if(a.tree===e)return a;let l={tree:e,cacheNode:t,stateKey:r,next:null},u=1,i=a,s=l;for(;null!==i&&u<1;){if(i.stateKey===r){s.next=i.next;break}{u++;let e={tree:i.tree,cacheNode:i.cacheNode,stateKey:i.stateKey,next:null};s.next=e,s=e}i=i.next}return o(l),l}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},47257,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientPageRoot",{enumerable:!0,get:function(){return s}});let n=e.r(43476),a=e.r(8372),o=e.r(71645),l=e.r(33906),u=e.r(61994),i=e.r(15783);function s({Component:e,serverProvidedParams:t}){let r,c;if(null!==t)r=t.searchParams,c=t.params;else{let e=(0,o.use)(a.LayoutRouterContext);c=null!==e?e.parentParams:{},r=(0,l.urlSearchParamsToParsedUrlQuery)((0,o.use)(u.SearchParamsContext))}let d=(0,i.createClientSearchParams)(r),f=(0,i.createClientParams)(c);return(0,n.jsx)(e,{params:f,searchParams:d})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92825,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientSegmentRoot",{enumerable:!0,get:function(){return u}});let n=e.r(43476),a=e.r(8372),o=e.r(71645),l=e.r(15783);function u({Component:e,slots:t,serverProvidedParams:r}){let i;if(null!==r)i=r.params;else{let e=(0,o.use)(a.LayoutRouterContext);i=null!==e?e.parentParams:{}}let s=(0,l.createClientParams)(i);return(0,n.jsx)(e,{...t,params:s})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68017,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HTTPAccessFallbackBoundary",{enumerable:!0,get:function(){return c}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),l=e.r(90373),u=e.r(54394),i=e.r(8372);class s extends o.default.Component{constructor(e){super(e),this.state={triggeredStatus:void 0,previousPathname:e.pathname}}componentDidCatch(){}static getDerivedStateFromError(e){if((0,u.isHTTPAccessFallbackError)(e))return{triggeredStatus:(0,u.getAccessFallbackHTTPStatus)(e)};throw e}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.triggeredStatus?{triggeredStatus:void 0,previousPathname:e.pathname}:{triggeredStatus:t.triggeredStatus,previousPathname:e.pathname}}render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.props,{triggeredStatus:o}=this.state,l={[u.HTTPAccessErrorStatus.NOT_FOUND]:e,[u.HTTPAccessErrorStatus.FORBIDDEN]:t,[u.HTTPAccessErrorStatus.UNAUTHORIZED]:r};if(o){let i=o===u.HTTPAccessErrorStatus.NOT_FOUND&&e,s=o===u.HTTPAccessErrorStatus.FORBIDDEN&&t,c=o===u.HTTPAccessErrorStatus.UNAUTHORIZED&&r;return i||s||c?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("meta",{name:"robots",content:"noindex"}),!1,l[o]]}):n}return n}}function c({notFound:e,forbidden:t,unauthorized:r,children:n}){let u=(0,l.useUntrackedPathname)(),d=(0,o.useContext)(i.MissingSlotContext);return e||t||r?(0,a.jsx)(s,{pathname:u,notFound:e,forbidden:t,unauthorized:r,missingSlots:d,children:n}):(0,a.jsx)(a.Fragment,{children:n})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22976,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return o},PlaceValidationBoundaryBelowThisLevel:function(){return l},RenderValidationBoundaryAtThisLevel:function(){return u},SlotMarker:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=null,l=null,u=null,i=null;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},77694,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return o.InstantValidationBoundaryContext},PlaceValidationBoundaryBelowThisLevel:function(){return o.PlaceValidationBoundaryBelowThisLevel},RenderValidationBoundaryAtThisLevel:function(){return o.RenderValidationBoundaryAtThisLevel},SlotMarker:function(){return o.SlotMarker}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(22976);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39756,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={LoadingBoundaryProvider:function(){return O},default:function(){return w}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(55682),l=e.r(90809),u=e.r(43476),i=l._(e.r(71645)),s=o._(e.r(74080)),c=e.r(8372),d=e.r(1244),f=e.r(72383),p=e.r(91915),g=e.r(58442),h=e.r(68017);e.r(77694);let y=e.r(70725),m=e.r(28298);e.r(74180);let b=e.r(61994),v=e.r(33906),_=e.r(95871);s.default.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function j(e,t,r){let n=e.getClientRects();if(0===n.length)return 0;let a=1/0;for(let e=0;e<n.length;e++){let t=n[e];t.top<a&&(a=t.top)}return a>=r()&&a<=t?1:2}i.default.Component;let S=function(e){let t=i.default.useRef(null);return(0,i.useLayoutEffect)(()=>{let{focusAndScrollRef:r,cacheNode:n}=e,a=r.forceScroll?r.scrollRef:n.scrollRef;if(null===a||!a.current)return;let o=null,l=r.hashFragment;if(l){var u;if(null===(o="top"===(u=l)?document.body:document.getElementById(u)??document.getElementsByName(u)[0]??null)){a.current=!1,r.onlyHashChange=!1,r.hashFragment=null;return}}else o=t.current;if(null===o)return;let i=!1;(0,p.disableSmoothScrollDuringRouteTransition)(()=>{let e=document.documentElement,t=null,r=null,n=null,u=()=>{var r,a;let o,l;return null===n&&(r=e,a=t,n=!Number.isFinite(l=Number.parseFloat(o=getComputedStyle(r).scrollPaddingTop))||l<0?0:o.endsWith("px")?l:o.endsWith("%")?l/100*a:0),n};(l||(t=e.clientHeight,0!==(r=j(o,t,u))))&&((i=!0,a.current=!1,l)?o.scrollIntoView():1!==r&&(e.scrollTop=0,2===j(o,t,u)&&o.scrollIntoView()))},{dontForceLayout:!0,onlyHashChange:r.onlyHashChange}),i&&(r.onlyHashChange=!1,r.hashFragment=null)},void 0),(0,u.jsx)(i.Fragment,{ref:t,children:e.children})};function x({children:e,cacheNode:t}){let r=(0,i.useContext)(c.GlobalLayoutRouterContext);if(!r)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});return(0,u.jsx)(S,{focusAndScrollRef:r.focusAndScrollRef,cacheNode:t,children:e})}function P({tree:e,segmentPath:t,debugNameContext:r,cacheNode:n,params:a,url:o,isActive:l}){let s,f=(0,i.useContext)(c.GlobalLayoutRouterContext);if((0,i.useContext)(b.NavigationPromisesContext),!f)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});let p=null!==n?n:(0,i.use)(d.unresolvedThenable),g=null!==p.prefetchRsc?p.prefetchRsc:p.rsc,h=(0,i.useDeferredValue)(p.rsc,g);if((0,_.isDeferredRsc)(h)){let e=(0,i.use)(h);null===e&&(0,i.use)(d.unresolvedThenable),s=e}else null===h&&(0,i.use)(d.unresolvedThenable),s=h;let y=s;return(0,u.jsx)(c.LayoutRouterContext.Provider,{value:{parentTree:e,parentCacheNode:p,parentSegmentPath:t,parentParams:a,parentLoadingData:null,debugNameContext:r,url:o,isActive:l},children:y})}function O({loading:e,children:t}){let r=(0,i.use)(c.LayoutRouterContext);return null===r?t:(0,u.jsx)(c.LayoutRouterContext.Provider,{value:{parentTree:r.parentTree,parentCacheNode:r.parentCacheNode,parentSegmentPath:r.parentSegmentPath,parentParams:r.parentParams,parentLoadingData:e,debugNameContext:r.debugNameContext,url:r.url,isActive:r.isActive},children:t})}function C({name:e,loading:t,children:r}){if(null!==t){let n=t[0],a=t[1],o=t[2];return(0,u.jsx)(i.Suspense,{name:e,fallback:(0,u.jsxs)(u.Fragment,{children:[a,o,n]}),children:r})}return(0,u.jsx)(u.Fragment,{children:r})}function w({parallelRouterKey:e,error:t,errorStyles:r,errorScripts:n,templateStyles:a,templateScripts:o,template:l,notFound:s,forbidden:p,unauthorized:b,segmentViewBoundaries:_}){let j=(0,i.useContext)(c.LayoutRouterContext);if(!j)throw Object.defineProperty(Error("invariant expected layout router to be mounted"),"__NEXT_ERROR_CODE",{value:"E56",enumerable:!1,configurable:!0});let{parentTree:S,parentCacheNode:O,parentSegmentPath:E,parentParams:R,parentLoadingData:T,url:N,isActive:A,debugNameContext:k}=j,M=S[0],D=null===E?[e]:E.concat([M,e]),F=S[1][e],L=O.slots;(void 0===F||null===L)&&(0,i.use)(d.unresolvedThenable);let I=F[0],U=L[e]??null,B=(0,y.createRouterCacheKey)(I,!0),$=(0,m.useRouterBFCache)(F,U,B),H=[];do{let e=$.tree,i=$.cacheNode,d=$.stateKey,y=e[0],m=R;if(Array.isArray(y)){let e=y[0],t=y[1],r=y[2],n=(0,v.getParamValueFromCacheKey)(t,r);null!==n&&(m={...R,[e]:n})}let _=function(e){if("/"===e)return"/";if("string"==typeof e)if("(__SLOT__)"===e)return;else return e+"/";return e[1]+"/"}(y),j=_??k,S=void 0===_?void 0:k,O=(0,u.jsxs)(x,{cacheNode:i,children:[(0,u.jsx)(f.ErrorBoundary,{errorComponent:t,errorStyles:r,errorScripts:n,children:(0,u.jsx)(C,{name:S,loading:T,children:(0,u.jsx)(h.HTTPAccessFallbackBoundary,{notFound:s,forbidden:p,unauthorized:b,children:(0,u.jsxs)(g.RedirectBoundary,{children:[(0,u.jsx)(P,{url:N,tree:e,params:m,cacheNode:i,segmentPath:D,debugNameContext:j,isActive:A&&d===B}),null]})})})}),null]}),w=(0,u.jsxs)(c.TemplateContext.Provider,{value:O,children:[a,o,l]},d);H.push(w),$=$.next}while(null!==$)return H}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},37457,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return u}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),l=e.r(8372);function u(){let e=(0,o.useContext)(l.TemplateContext);return(0,a.jsx)(a.Fragment,{children:e})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},6831,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},97689,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(6831).createRenderParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},93504,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},66996,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(93504).createRenderSearchParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},15783,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createClientParams:function(){return o.createRenderParamsFromClient},createClientSearchParams:function(){return l.createRenderSearchParamsFromClient}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(97689),l=e.r(66996);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=o(e,n)),t&&(a.current=o(t,n))},[e,t])}function o(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18967,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={DecodeError:function(){return m},MiddlewareNotFoundError:function(){return j},MissingStaticPage:function(){return _},NormalizeError:function(){return b},PageNotFoundError:function(){return v},SP:function(){return h},ST:function(){return y},WEB_VITALS:function(){return o},execOnce:function(){return l},getDisplayName:function(){return d},getLocationOrigin:function(){return s},getURL:function(){return c},isAbsoluteUrl:function(){return i},isResSent:function(){return f},loadGetInitialProps:function(){return g},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return S}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=["CLS","FCP","FID","INP","LCP","TTFB"];function l(e){let t,r=!1;return(...n)=>(r||(r=!0,t=e(...n)),t)}let u=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,i=e=>{let t=e.charCodeAt(0);return!!(t>=65&&t<=90||t>=97&&t<=122)&&u.test(e)};function s(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function c(){let{href:e}=window.location,t=s();return e.substring(t.length)}function d(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function f(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function g(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await g(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&f(r))return n;if(!n)throw Object.defineProperty(Error(`"${d(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return n}let h="u">typeof performance,y=h&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class m extends Error{}class b extends Error{}class v extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class _ extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class j extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function S(e){return JSON.stringify({message:e.message,stack:e.stack})}},27201,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"IconMark",{enumerable:!0,get:function(){return a}});let n=e.r(43476),a=()=>"u">typeof window?null:(0,n.jsx)("meta",{name:"«nxt-icon»"})},91915,(e,t,r)=>{"use strict";function n(e,t={}){if(t.onlyHashChange)return void e();let r=document.documentElement;if("smooth"!==r.dataset.scrollBehavior)return void e();let a=r.style.scrollBehavior;r.style.scrollBehavior="auto",t.dontForceLayout||r.getClientRects(),e(),r.style.scrollBehavior=a}e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"disableSmoothScrollDuringRouteTransition",{enumerable:!0,get:function(){return n}})},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return o}});let n=e.r(18967),a=e.r(52817);function o(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},98183,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={assign:function(){return i},searchParamsToUrlQuery:function(){return o},urlQueryToSearchParams:function(){return u}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function o(e){let t={};for(let[r,n]of e.entries()){let e=t[r];void 0===e?t[r]=n:Array.isArray(e)?e.push(n):t[r]=[e,n]}return t}function l(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function u(e){let t=new URLSearchParams;for(let[r,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)t.append(r,l(e));else t.set(r,l(n));return t}function i(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,n]of r.entries())e.append(t,n)}return e}},95057,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return u},formatWithValidation:function(){return s},urlObjectKeys:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function u(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",u=e.hash||"",i=e.query||"",s=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?s=t+e.host:r&&(s=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(s+=":"+e.port)),i&&"object"==typeof i&&(i=String(o.urlQueryToSearchParams(i)));let c=e.search||i&&`?${i}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||l.test(n))&&!1!==s?(s="//"+(s||""),a&&"/"!==a[0]&&(a="/"+a)):s||(s=""),u&&"#"!==u[0]&&(u="#"+u),c&&"?"!==c[0]&&(c="?"+c),a=a.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${n}${s}${a}${c}${u}`}let i=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function s(e){return u(e)}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,2776,e=>{"use strict";var t=e.i(43476),n=e.i(15812);e.s(["default",0,function({children:e}){let{userId:r,ready:i}=(0,n.useUser)();return i&&r?e:(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff",padding:24,textAlign:"center",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:i?(0,t.jsxs)("div",{style:{maxWidth:420},children:[(0,t.jsx)("div",{style:{fontSize:18,fontWeight:700,marginBottom:8},children:"Can’t reach Six Degrees’ local server"}),(0,t.jsx)("div",{style:{color:"#888",fontSize:14,lineHeight:1.6},children:"The page loaded but the app behind it is not answering. If you started it from a terminal, check that window for an error, then reload this page."})]}):(0,t.jsx)("div",{style:{fontSize:18,fontWeight:600},children:"Loading…"})})}])},99201,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(19821),i=e.i(5258),o=e.i(48235);let l={height:10,borderRadius:6},s={background:"rgba(52,152,219,0.06)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(52,152,219,0.2)"};function a({degree1:e=[],degree2:n=[],skips:r=[]}){let c=function(e=[],t=[],n=[]){let r=(0,o.reachIndex)(e,t,{skips:n}),i=e=>{let t=(0,o.circleState)(e,r);return"scanned"===t?"mapped":t},l={mapped:0,hidden:0,todo:0},s={};for(let t of e){let e=i(t);l[e]+=1;let n=t.tier||"D";s[n]=s[n]||{mapped:0,hidden:0,todo:0,total:0},s[n][e]+=1,s[n].total+=1}let a=e.length,d=l.mapped+l.hidden;return{...l,total:a,resolved:d,percent:a?Math.round(d/a*100):0,batches:Math.ceil(l.todo/25),byTier:s}}(e,n,r);if(!c.total)return null;let u=e=>c.total?e/c.total*100:0,g=0===c.todo;return(0,t.jsxs)("div",{style:s,children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"baseline",marginBottom:10},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,margin:0,color:"#3498DB"},children:"2nd-degree mapping"}),(0,t.jsx)("span",{style:{fontSize:12,color:g?"#00ff88":"#8b9a9a",fontWeight:600},children:g?"Everything reachable is mapped":`${c.percent}%`})]}),(0,t.jsxs)("div",{style:{...l,display:"flex",overflow:"hidden",background:"rgba(255,255,255,0.06)"},children:[(0,t.jsx)("div",{style:{width:`${u(c.mapped)}%`,background:"#00ff88"}}),(0,t.jsx)("div",{style:{width:`${u(c.hidden)}%`,background:"rgba(255,255,255,0.22)"}})]}),(0,t.jsxs)("div",{style:{display:"flex",gap:16,marginTop:10,fontSize:12,flexWrap:"wrap"},children:[(0,t.jsx)(d,{color:"#00ff88",label:"mapped",value:c.mapped}),(0,t.jsx)(d,{color:"rgba(255,255,255,0.35)",label:"hidden",value:c.hidden}),(0,t.jsx)(d,{color:"rgba(255,255,255,0.12)",label:"to go",value:c.todo}),(0,t.jsxs)("span",{style:{color:"#667",marginLeft:"auto"},children:["of ",c.total]})]}),c.hidden>0&&(0,t.jsx)("p",{style:{fontSize:11.5,color:"#667",margin:"10px 0 0",lineHeight:1.6},children:"Hidden means they keep their connections private — that will not change, and it does not count against you."}),!g&&(0,t.jsxs)("p",{style:{fontSize:11.5,color:"#8b9a9a",margin:"10px 0 0",lineHeight:1.6},children:[c.todo," left — about ",(0,t.jsxs)("b",{children:[c.batches," ",1===c.batches?"batch":"batches"]})," of ",25,". Run one, leave it a while, run another. Long unbroken runs are what gets an account restricted."]}),(0,t.jsx)("div",{style:{marginTop:16,display:"flex",flexDirection:"column",gap:7},children:["S","A","B","C","D"].filter(e=>c.byTier[e]?.total).map(e=>{let n=c.byTier[e];return(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,fontSize:11},children:[(0,t.jsx)("span",{style:{width:14,color:i.TIER_COLORS_CLASSIC[e],fontWeight:700},children:e}),(0,t.jsxs)("div",{style:{flex:1,height:5,borderRadius:3,display:"flex",overflow:"hidden",background:"rgba(255,255,255,0.06)"},children:[(0,t.jsx)("div",{style:{width:`${n.mapped/n.total*100}%`,background:i.TIER_COLORS_CLASSIC[e]}}),(0,t.jsx)("div",{style:{width:`${n.hidden/n.total*100}%`,background:"rgba(255,255,255,0.22)"}})]}),(0,t.jsxs)("span",{style:{color:"#667",width:62,textAlign:"right"},children:[n.mapped,"/",n.total]})]},e)})})]})}function d({color:e,label:n,value:r}){return(0,t.jsxs)("span",{style:{display:"flex",alignItems:"center",gap:6,color:"#8b9a9a"},children:[(0,t.jsx)("span",{style:{width:8,height:8,borderRadius:2,background:e}}),(0,t.jsx)("b",{style:{color:"#e2e8f0"},children:r})," ",n]})}var c=e.i(64745),u=e.i(2776),g=e.i(15812),h=e.i(69083),f=e.i(22016);let p={1:"Observer",11:"Connector",31:"Networker",51:"Strategist",76:"Architect"};function y(){let{userId:e,userName:i,userProfile:o}=(0,g.useUser)(),l=o||{name:i||"User",headline:"",sectors:[],goals:[]},[s,d]=(0,n.useState)(null),[u,y]=(0,n.useState)(!0),[b,x]=(0,n.useState)([]),[v,S]=(0,n.useState)({total:0,sent:0,accepted:0}),[j,k]=(0,n.useState)({degree1:[],degree2:[],skips:[]}),[w,C]=(0,n.useState)(null);if((0,n.useEffect)(()=>{!c.IS_DEMO&&e&&t();async function t(){fetch("/api/settings").then(e=>e.json().then(t=>e.ok&&t.settings?t:Promise.reject(Error(t.error)))).then(e=>C(e.settings.sectorFocus||{sectors:[],strength:"lean"})).catch(()=>C({failed:!0}));let t=await (0,r.loadNetwork)(e),n=t.degree1,i=t.degree2,o={S:0,A:0,B:0,C:0,D:0};n.forEach(e=>{o[e.tier]=(o[e.tier]||0)+1});let l={S:0,A:0,B:0,C:0,D:0};i.forEach(e=>{l[e.tier]=(l[e.tier]||0)+1});let s=[...new Set(i.map(e=>e.source_connection_id).filter(Boolean))].length,a=n.filter(e=>e.is_catalyst).length,c={};n.forEach(e=>{e.company&&(c[e.company]=(c[e.company]||0)+1)});let u=Object.entries(c).sort((e,t)=>t[1]-e[1]).slice(0,10),g=100*o.S+40*o.A+15*o.B+5*o.C+ +o.D+200*s+150*a+50*l.S+n.length,h=Math.floor(Math.sqrt(g/10)),f=h*h*10,p=(h+1)*(h+1)*10;d({d1Count:n.length,d2Count:i.length,tiers:o,d2Tiers:l,clusters:s,catalysts:a,networkPower:g,level:h,xpProgress:(g-f)/(p-f)*100,topCompanies:u,unlockedPaths:0}),fetch("/api/scraper").then(e=>e.json()).then(e=>k({degree1:n,degree2:i,skips:e.skips||[]})).catch(()=>k({degree1:n,degree2:i,skips:[]})),fetch(`/api/notifications?userId=${e}`).then(e=>e.json()).then(e=>x(e.notifications||[])).catch(()=>{}),fetch("/api/queue").then(e=>e.json()).then(e=>{let t=e.items||[];S({total:t.length,sent:t.filter(e=>"sent"===e.status).length,accepted:t.filter(e=>"accepted"===e.status).length})}).catch(()=>{}),y(!1)}},[e]),c.IS_DEMO)return(0,t.jsxs)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"rgba(255,255,255,0.7)",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,textAlign:"center",padding:24,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:[(0,t.jsx)("h2",{style:{margin:0,fontSize:20,fontWeight:700,color:"#fff"},children:"Not part of the demo"}),(0,t.jsx)("p",{style:{margin:0,fontSize:13},children:"The public demo includes the Network Circle and Degrees views only."}),(0,t.jsx)(f.default,{href:"/",style:{fontSize:12,color:"rgba(255,255,255,0.5)",textDecoration:"none"},children:"← Back to the network"})]});if(u)return(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff"},children:"Loading profile..."});let B={S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},I=[{label:"First S-Tier",done:s.tiers.S>0,icon:"👑"},{label:"100 Connections",done:s.d1Count>=100,icon:"🔗"},{label:"500 Connections",done:s.d1Count>=500,icon:"🌐"},{label:"First Cluster",done:s.clusters>0,icon:"🔭"},{label:"10 Clusters",done:s.clusters>=10,icon:"🏰"},{label:"50 S-Tier",done:s.tiers.S>=50,icon:"💎"},{label:"Catalyst Found",done:s.catalysts>0,icon:"⚡"},{label:"Level 25",done:s.level>=25,icon:"🎯"},{label:"Level 50",done:s.level>=50,icon:"🚀"},{label:"D2 S-Tier > 50",done:s.d2Tiers.S>=50,icon:"🌟"}];return(0,t.jsxs)("div",{style:{height:"100vh",background:"#0a0a1a",color:"#fff",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',display:"flex",flexDirection:"column",overflow:"hidden"},children:[(0,t.jsxs)("header",{style:{padding:"16px 24px",borderBottom:"1px solid rgba(255,255,255,0.1)",display:"flex",alignItems:"center",gap:16},children:[(0,t.jsxs)(f.default,{href:"/",style:{display:"flex",alignItems:"center",gap:6,color:"#888",textDecoration:"none",fontSize:13,fontWeight:600,padding:"6px 14px",borderRadius:6,background:"rgba(255,255,255,0.06)",border:"1px solid rgba(255,255,255,0.1)"},children:[(0,t.jsx)("span",{style:{fontSize:16},children:"←"})," Back to Map"]}),(0,t.jsx)("h1",{style:{fontSize:22,fontWeight:700,margin:0,background:"linear-gradient(135deg, #FFD700, #9B59B6, #3498DB)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:"Profile"})]}),(0,t.jsx)("div",{style:{flex:1,overflow:"auto",padding:"30px 20px"},children:(0,t.jsxs)("div",{style:{maxWidth:700,margin:"0 auto"},children:[(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.05)",borderRadius:16,padding:32,marginBottom:24,border:"1px solid rgba(255,215,0,0.2)",textAlign:"center"},children:[(0,t.jsx)("div",{style:{width:100,height:100,borderRadius:"50%",margin:"0 auto 16px",background:"linear-gradient(135deg, #FFD700, #FF6B35)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:36,fontWeight:800,color:"#000",boxShadow:"0 0 30px rgba(255,215,0,0.3)"},children:s.level}),(0,t.jsx)("div",{style:{fontSize:24,fontWeight:700,marginBottom:4},children:l.name}),(0,t.jsx)("div",{style:{fontSize:14,color:"#888",marginBottom:4},children:l.headline}),(0,t.jsx)("div",{style:{display:"inline-block",padding:"4px 16px",borderRadius:20,background:"rgba(255,215,0,0.15)",border:"1px solid rgba(255,215,0,0.3)",color:"#FFD700",fontSize:13,fontWeight:700,marginBottom:16},children:function(e){let t="Observer";for(let[n,r]of Object.entries(p))e>=parseInt(n)&&(t=r);return t}(s.level)}),(0,t.jsxs)("div",{style:{maxWidth:300,margin:"0 auto"},children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",fontSize:10,color:"#666",marginBottom:4},children:[(0,t.jsxs)("span",{children:["Level ",s.level]}),(0,t.jsxs)("span",{children:["Level ",s.level+1]})]}),(0,t.jsx)("div",{style:{height:8,background:"rgba(255,255,255,0.1)",borderRadius:4},children:(0,t.jsx)("div",{style:{height:"100%",width:`${Math.min(s.xpProgress,100)}%`,background:"linear-gradient(90deg, #FFD700, #FF6B35)",borderRadius:4,transition:"width 1s ease"}})}),(0,t.jsxs)("div",{style:{fontSize:10,color:"#888",marginTop:4},children:["Network Power: ",s.networkPower.toLocaleString()]})]})]}),(0,t.jsx)(a,{degree1:j.degree1,degree2:j.degree2,skips:j.skips}),(0,t.jsxs)("div",{style:{background:"rgba(255,107,53,0.06)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,107,53,0.2)"},children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:12},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,margin:0,color:"#FF6B35"},children:"Queue Progress"}),(0,t.jsx)(f.default,{href:"/queue",style:{fontSize:11,color:"#FF6B35",textDecoration:"none",fontWeight:600},children:"View Queue →"})]}),(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:12},children:[(0,t.jsxs)("div",{style:{textAlign:"center"},children:[(0,t.jsx)("div",{style:{fontSize:22,fontWeight:700,color:"#FFA500"},children:v.total}),(0,t.jsx)("div",{style:{fontSize:10,color:"#888"},children:"In Queue"})]}),(0,t.jsxs)("div",{style:{textAlign:"center"},children:[(0,t.jsx)("div",{style:{fontSize:22,fontWeight:700,color:"#3498DB"},children:v.sent}),(0,t.jsx)("div",{style:{fontSize:10,color:"#888"},children:"Sent"})]}),(0,t.jsxs)("div",{style:{textAlign:"center"},children:[(0,t.jsx)("div",{style:{fontSize:22,fontWeight:700,color:"#00ff88"},children:v.accepted}),(0,t.jsx)("div",{style:{fontSize:10,color:"#888"},children:"Accepted"})]})]})]}),b.length>0&&(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsxs)("h3",{style:{fontSize:14,fontWeight:700,marginTop:0,marginBottom:12},children:["Recent Activity (",b.filter(e=>!e.seen).length," new)"]}),(0,t.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:6,maxHeight:200,overflowY:"auto"},children:b.slice(0,10).map(e=>(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center",padding:"6px 8px",borderRadius:6,background:e.seen?"transparent":"rgba(255,215,0,0.05)",borderLeft:e.seen?"none":"2px solid #FFD700"},children:[(0,t.jsx)("span",{style:{fontSize:16},children:e.icon||"📌"}),(0,t.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,t.jsx)("div",{style:{fontSize:12,fontWeight:600,color:e.seen?"#888":"#fff"},children:e.title}),e.message&&(0,t.jsx)("div",{style:{fontSize:10,color:"#666"},children:e.message})]}),(0,t.jsx)("span",{style:{fontSize:9,color:"#555",flexShrink:0},children:new Date(e.created_at).toLocaleDateString()})]},e.id))})]}),(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:12,marginBottom:24},children:[(0,t.jsx)(m,{label:"Connections",value:s.d1Count}),(0,t.jsx)(m,{label:"Degree-2 Reach",value:s.d2Count}),(0,t.jsx)(m,{label:"Clusters",value:s.clusters}),(0,t.jsx)(m,{label:"S-Tier",value:s.tiers.S,color:"#FFD700"}),(0,t.jsx)(m,{label:"A-Tier",value:s.tiers.A,color:"#9B59B6"}),(0,t.jsx)(m,{label:"Catalysts",value:s.catalysts,color:"#00ff88"})]}),(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,marginTop:0,marginBottom:12},children:"Tier Distribution"}),["S","A","B","C","D"].map(e=>{let n=s.tiers[e]||0,r=s.d1Count>0?n/s.d1Count*100:0;return(0,t.jsxs)("div",{style:{marginBottom:8},children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",fontSize:11,marginBottom:2},children:[(0,t.jsxs)("span",{style:{color:B[e],fontWeight:600},children:[e,"-Tier"]}),(0,t.jsxs)("span",{style:{color:"#888"},children:[n," (",r.toFixed(1),"%)"]})]}),(0,t.jsx)("div",{style:{height:6,background:"rgba(255,255,255,0.08)",borderRadius:3},children:(0,t.jsx)("div",{style:{height:"100%",width:`${r}%`,background:B[e],borderRadius:3}})})]},e)})]}),(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,marginTop:0,marginBottom:12},children:"Degree-2 Reach"}),(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12},children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{style:{fontSize:24,fontWeight:700,color:"#FF6B35"},children:s.d2Count}),(0,t.jsx)("div",{style:{fontSize:11,color:"#888"},children:"People reachable via bridges"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{style:{fontSize:24,fontWeight:700,color:"#FFD700"},children:s.d2Tiers.S}),(0,t.jsx)("div",{style:{fontSize:11,color:"#888"},children:"S-Tier degree-2"})]})]})]}),(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsxs)("h3",{style:{fontSize:14,fontWeight:700,marginTop:0,marginBottom:12},children:["Milestones (",I.filter(e=>e.done).length,"/",I.length,")"]}),(0,t.jsx)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:8},children:I.map((e,n)=>(0,t.jsxs)("div",{style:{padding:"8px 10px",borderRadius:8,fontSize:12,background:e.done?"rgba(255,215,0,0.08)":"rgba(255,255,255,0.02)",border:`1px solid ${e.done?"rgba(255,215,0,0.2)":"rgba(255,255,255,0.05)"}`,color:e.done?"#FFD700":"#555",display:"flex",alignItems:"center",gap:6},children:[(0,t.jsx)("span",{style:{fontSize:16},children:e.done?e.icon:"🔒"}),(0,t.jsx)("span",{style:{fontWeight:e.done?600:400},children:e.label})]},n))})]}),(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,marginTop:0,marginBottom:12},children:"Top Companies in Your Network"}),s.topCompanies.map(([e,n],r)=>(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",padding:"4px 0",borderBottom:r<s.topCompanies.length-1?"1px solid rgba(255,255,255,0.04)":"none",fontSize:12},children:[(0,t.jsx)("span",{children:e}),(0,t.jsx)("span",{style:{color:"#888"},children:n})]},r))]}),(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:12},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,margin:0},children:"Your Sectors"}),(0,t.jsxs)(f.default,{href:"/scores#sector",style:{fontSize:11,color:"#3498DB",textDecoration:"none",fontWeight:600},children:[w?.sectors?.length?"Change":w&&!w.failed?"Pick on Scores":"Scores"," →"]})]}),w?w.failed?(0,t.jsx)("div",{style:{fontSize:12,color:"#ff7676"},children:"Couldn’t load your sectors. Reload this page, or open Settings to see them."}):w.sectors?.length?(0,t.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"center"},children:[w.sectors.map(e=>{let n=(0,h.sectorByKey)(e);return(0,t.jsx)("span",{style:{padding:"4px 12px",borderRadius:20,fontSize:11,fontWeight:600,background:`${n.color}26`,border:`1px solid ${n.color}66`,color:n.color},children:n.label},e)}),(0,t.jsxs)("span",{style:{fontSize:11,color:"#888"},children:["strong"===w.strength?"Strong":"Lean",": companies here count for more in your scores."]})]}):(0,t.jsx)("div",{style:{fontSize:12,color:"#888"},children:"None picked. Pick up to three in Settings and companies in them count for more in your scores."}):(0,t.jsx)("div",{style:{fontSize:12,color:"#888"},children:"Loading…"})]})]})})]})}function m({label:e,value:n,color:r}){return(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:10,padding:"14px 12px",border:"1px solid rgba(255,255,255,0.08)",textAlign:"center"},children:[(0,t.jsx)("div",{style:{fontSize:22,fontWeight:700,color:r||"#fff"},children:n}),(0,t.jsx)("div",{style:{fontSize:10,color:"#888",marginTop:2},children:e})]})}e.s(["default",0,function(){return(0,t.jsx)(u.default,{children:(0,t.jsx)(y,{})})}],99201)},89154,e=>{"use strict";var t=e.i(90179);function n(e){let n=(0,t.readTitle)(e);return{key:n.key,label:n.label,level:n.level}}function r(e){return(0,t.currentCompany)(e)}let i=[{key:"defense",label:"Government, Defense & Aerospace",color:"#7f8c8d",words:/\b(government|federal|state of|county|city of|defen[cs]e|army|navy|air force|marine corps|military|dod|nasa|aerospace|lockheed|northrop|boeing|raytheon|l3harris|leidos|blue origin|spacex|public sector)\b/i},{key:"finance",label:"Finance & Investing",color:"#2ecc71",words:/\b(bank|banking|capital|ventures?|vc|investments?|investor|fund|private equity|growth equity|asset management|wealth|trading|trader|hedge|crypto|blockchain|web3|defi|fintech|stripe|coinbase|blackrock|robinhood|goldman|morgan stanley|jpmorgan|chase|bny|mellon|wells fargo|citi|citigroup|capital one|fidelity|vanguard|schwab|visa|mastercard|amex|american express|paypal|insurance|accounting|cpa|financial)\b/i},{key:"health",label:"Healthcare & Biotech",color:"#e74c3c",words:/\b(health|healthcare|medical|medicine|hospital|clinic|pharma|pharmaceutical|biotech|nurse|nursing|physician|doctor|dental|therapy|therapist|wellness)\b/i},{key:"education",label:"Education",color:"#f1c40f",words:/\b(university|college|school|education|student|professor|teacher|academy|phd|faculty|alumni)\b/i},{key:"media",label:"Marketing & Media",color:"#e67e22",words:/\b(marketing|brand|branding|advertising|agency|media|content|social media|creative|creator|influencer|pr|public relations|communications|tiktok|pinterest|youtube|growth marketing)\b/i},{key:"entertainment",label:"Entertainment & Gaming",color:"#9b59b6",words:/\b(entertainment|film|movie|music|records|gaming|games?|esports|studio|studios|netflix|disney|spotify|hollywood|theater|theatre|sports)\b/i},{key:"tech",label:"Tech, Software & AI",color:"#3498db",words:/\b(software|saas|engineer|engineering|developer|tech|technology|technologies|ai|artificial intelligence|machine learning|ml|data|cloud|cyber|security|devops|product manager|google|microsoft|apple|meta|amazon|nvidia|openai|anthropic|palantir|salesforce|oracle|ibm|intel|app|apps|startup|platform|labs?)\b/i},{key:"consulting",label:"Consulting, Legal & Services",color:"#1abc9c",words:/\b(consulting|consultant|consultancy|deloitte|accenture|mckinsey|kpmg|pwc|ey|bain|bcg|legal|law|lawyer|attorney|paralegal|recruiting|recruiter|staffing|talent)\b/i},{key:"realestate",label:"Real Estate & Construction",color:"#d35400",words:/\b(real estate|realtor|realty|property|properties|construction|architecture|architect|mortgage|homes|housing|builders?)\b/i},{key:"consumer",label:"Retail, Consumer & Hospitality",color:"#ff79c6",words:/\b(retail|e-?commerce|shopify|consumer|cpg|fashion|apparel|beauty|cosmetics|food|beverage|restaurant|hospitality|hotel|travel|tourism|coca-cola|nike|store|shop)\b/i},{key:"industry",label:"Manufacturing, Energy & Logistics",color:"#95a5a6",words:/\b(manufacturing|energy|oil|gas|solar|utilities|automotive|tesla|siemens|ge|general electric|honeywell|3m|logistics|supply chain|shipping|freight|fedex|ups|industrial|mining|chemicals?)\b/i},{key:"nonprofit",label:"Nonprofit & Community",color:"#bdc3c7",words:/\b(nonprofit|non-profit|foundation|charity|ngo|church|ministry|volunteer)\b/i}],o={key:"unknown",label:"Unclear",color:"#555c66"},l=Object.fromEntries([...i,o].map(e=>[e.key,e])),s=e=>l[e]||o;function a(e,t){for(let n of[e,t]){if(!n)continue;let e=i.find(e=>e.words.test(n));if(e)return e}return o}let d=(e,t)=>a(e,t).key,c=e=>n(e).level>=4;e.s(["INDUSTRIES",0,i,"UNKNOWN_INDUSTRY",0,o,"buildCompanyIndex",0,function(e=[]){let n=new Map,r=e=>(n.has(e)||n.set(e,(0,t.rolesWithCompanies)(e)),n.get(e)),{industries:i}=(0,t.networkCompanies)(e,{industryOf:d,rolesOf:r}),o=new Map;for(let t of e){let e=t.profile_url||`id:${t.id}`,n=o.get(e);(!n||(t.degree||9)<(n.degree||9))&&o.set(e,t)}let l=new Map;for(let e of o.values()){let t=r(e).find(e=>!e.former)?.company;if(!t)continue;let n=l.get(t);n||(n={name:t,people:[],d1:0,d2:0,d3:0,S:0,A:0,senior:0},l.set(t,n)),n.people.push(e),1===e.degree?n.d1++:2===e.degree?n.d2++:n.d3++,"S"===e.tier&&n.S++,"A"===e.tier&&n.A++,c(e.headline)&&n.senior++}for(let e of l.values())e.industry=s(i.get(e.name));return l},"companyLinks",0,function(e=[],t=[]){let n=new Map;for(let t of e){let e=r(t);e&&n.set(t.id,e)}let i=new Map;for(let e of t){let t=n.get(e.source_connection_id),o=r(e);if(!t||!o||t===o)continue;let[l,s]=t<o?[t,o]:[o,t],a=`${l}\u0000${s}`,d=i.get(a);d||(d={a:l,b:s,weight:0,via:new Set},i.set(a,d)),d.weight++,d.via.add(e.source_connection_id)}return[...i.values()]},"companyOf",0,r,"getSeniority",0,n,"industryByKey",0,s,"industryOf",0,a,"isSenior",0,c,"waysInto",0,function(e,t=[],n=[]){let i=t.filter(t=>r(t)===e),o=new Map;for(let t of n)r(t)===e&&o.set(t.source_connection_id,(o.get(t.source_connection_id)||0)+1);let l=new Map(t.map(e=>[e.id,e]));return{direct:i,bridges:[...o.entries()].map(([e,t])=>({bridge:l.get(e),n:t})).filter(e=>e.bridge).sort((e,t)=>t.n-e.n||(Number(t.bridge.power_score)||0)-(Number(e.bridge.power_score)||0))}}])},19821,e=>{"use strict";async function t(e){let t=e?`/api/network?userId=${encodeURIComponent(e)}`:"/api/network",n=await fetch(t);if(!n.ok)throw Error(`Failed to load network (${n.status})`);let r=await n.json();return{degree1:r.degree1||[],degree2:r.degree2||[],degree3:r.degree3||[],ties:Number(r.ties)||0}}e.s(["loadNetwork",0,t])},36774,e=>{"use strict";let t=/^[A-Za-z0-9_-]+\.(webp|jpg|jpeg|png)$/,n="/avatars/";e.s(["localPhoto",0,function(e){return"string"==typeof e&&e.startsWith(n)&&t.test(e.slice(n.length))?e:null}])},48235,e=>{"use strict";var t=e.i(7214);function n(e,n){return e?n.scanned.has(e.id)||e.profile_url&&n.read?.has((0,t.keyFor)(e))?"scanned":e.profile_url&&n.hidden.has((0,t.keyFor)(e))?"hidden":"todo":"todo"}function r(e,t){if(!e||1!==e.degree||null==e.unlocked_from_bridge_id)return null;let r=n(e,t);return"todo"===r?"ready":r}e.s(["circleScanCost",0,function(e=100){let t=Math.max(1,Math.min(100,Math.round(e)||100));return{profileViews:1,searches:t,minutes:t>=100?55:Math.max(5,Math.round(.55*t))}},"circleState",0,n,"reachIndex",0,function(e=[],n=[],r={}){let i=new Set;for(let e of n||[])e?.source_connection_id!=null&&i.add(e.source_connection_id);let o=new Set;for(let e of r?.skips||[])e?.profileUrl&&o.add((0,t.keyFor)({profile_url:e.profileUrl}));let l=new Set;for(let e of r?.read||[])e&&l.add((0,t.keyFor)({profile_url:e}));let s=new Map;for(let[e,n]of Object.entries(r?.lists||{}))e&&n&&s.set((0,t.keyFor)({profile_url:e}),n);let a=new Map;for(let t of e||[]){let e=t?.unlocked_from_bridge_id;if(null==e||1!==t.degree)continue;let n=a.get(e);n||a.set(e,n=[]),n.push(t)}return{scanned:i,read:l,hidden:o,reachedFrom:a,lists:s}},"reachState",0,r,"readyByCircle",0,function(e){let t=new Map;for(let[n,i]of e.reachedFrom){let o=i.filter(t=>"ready"===r(t,e)).length;o&&t.set(n,o)}return t},"readyToScan",0,function(e,n){return(e||[]).filter(e=>"ready"===r(e,n)).sort(t.compareBridges)},"scanBars",0,function(e,r){let i=n(e,r),o=e?.profile_url?r.lists?.get((0,t.keyFor)(e)):null;return"hidden"===i?null:o?o.more?o.total?Math.max(1,Math.min(4,Math.round(5*Math.min(1,10*o.pages/o.total)))):2:5:"scanned"===i?2:null}])},69083,e=>{"use strict";var t=e.i(89154);let n=new Map(t.INDUSTRIES.map(e=>[e.key,e.color])),r=new Map([...t.INDUSTRIES.map(e=>[e.key,Object.freeze({key:e.key,label:e.label,color:e.color,group:e.key,kind:"industry"})]),...Object.entries({software:["Software & SaaS","tech","function"],"ai-data":["AI & Data","tech","function"],cybersecurity:["Cybersecurity","tech","function"],telecom:["Telecom","tech","industry"],fintech:["Fintech & Payments","finance","industry"],banking:["Banking & Lending","finance","industry"],"vc-pe":["Venture Capital & Private Equity","finance","industry"],wealth:["Wealth & Asset Management","finance","industry"],insurance:["Insurance","finance","industry"],accounting:["Accounting & Tax","finance","function"],crypto:["Crypto & Web3","finance","industry"],hospitals:["Hospitals & Clinics","health","industry"],dental:["Dental","health","industry"],"pharma-biotech":["Pharma & Biotech","health","industry"],"medical-devices":["Medical Devices","health","industry"],"mental-health":["Mental Health","health","industry"],"fitness-wellness":["Fitness & Wellness","health","industry"],veterinary:["Veterinary & Animal Care","health","industry"],k12:["K-12 Education","education","industry"],"higher-ed":["Higher Education","education","industry"],"marketing-advertising":["Marketing & Advertising","media","function"],"pr-comms":["PR & Communications","media","function"],"media-publishing":["Media & Publishing","media","industry"],"creator-economy":["Creator Economy","media","industry"],"film-tv-music":["Film, TV & Music","entertainment","industry"],"gaming-esports":["Gaming & Esports","entertainment","industry"],sports:["Sports","entertainment","industry"],"ecommerce-retail":["E-commerce & Retail","consumer","industry"],"consumer-goods":["Consumer Goods","consumer","industry"],restaurants:["Restaurants & Food Service","consumer","industry"],"hospitality-travel":["Hospitality & Travel","consumer","industry"],"beauty-personal-care":["Beauty & Personal Care","consumer","industry"],logistics:["Logistics & Supply Chain","industry","industry"],manufacturing:["Manufacturing","industry","industry"],energy:["Energy & Utilities","industry","industry"],automotive:["Automotive","industry","industry"],agriculture:["Agriculture & Farming","industry","industry"],"aerospace-defense":["Aerospace & Defense","defense","industry"],military:["Military","defense","industry"],government:["Government & Public Sector","defense","industry"],legal:["Legal","consulting","function"],"management-consulting":["Management Consulting","consulting","function"],"hr-recruiting":["HR & Recruiting","consulting","function"],"security-services":["Security Services","consulting","function"],"real-estate":["Real Estate","realestate","industry"],"construction-trades":["Construction & Trades","realestate","industry"],charities:["Nonprofits & Charities","nonprofit","industry"],"social-work":["Social Work & Human Services","nonprofit","industry"],faith:["Faith & Ministry","nonprofit","industry"]}).map(([e,[r,i,o]])=>[e,Object.freeze({key:e,label:r,color:n.get(i)||t.UNKNOWN_INDUSTRY.color,group:i,kind:o})])]);e.s(["sectorByKey",0,function(e){return r.get(e)||{key:e,label:t.UNKNOWN_INDUSTRY.label,color:t.UNKNOWN_INDUSTRY.color,group:null,kind:null}}])},7214,e=>{"use strict";var t=e.i(36774);let n={S:0,A:1,B:2,C:3,D:4};function r(e){let t=parseFloat(e?.power_score);return Number.isFinite(t)?t:0}function i(e){return Math.round(10*r(e))/10}function o(e){return String(e?.profile_url||"").split(/[?#]/)[0].replace(/\/+$/,"")||`id:${e?.id}`}let l=(e,t)=>String(e??"").localeCompare(String(t??""),void 0,{numeric:!0});function s(e,t){return(n[e.tier]??9)-(n[t.tier]??9)||r(t)-r(e)||String(e.name||"").localeCompare(String(t.name||""))||l(e.id,t.id)}function a(e,t){return e.bridge&&t.bridge?s(e.bridge,t.bridge):e.bridge?-1:t.bridge?1:l(e.id,t.id)}function d(e,t){return t.score-e.score||t.waysIn-e.waysIn||a(e.routes[0]||c,t.routes[0]||c)||String(e.person.name||"").localeCompare(String(t.person.name||""))||(e.key<t.key?-1:+(e.key>t.key))}let c={id:null,bridge:null};function u(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return t.length<2?t[0]||"":`${t[0]} ${t[t.length-1].charAt(0)}.`}function g(e,t){let n=String(e||"");return t<=1?n?"…":"":n.length>t?`${n.slice(0,t-1)}…`:n}e.s(["TIERS",0,["S","A","B","C","D"],"compareBridges",0,s,"compareWaysIn",0,function(e,t){return t.waysIn-e.waysIn||d(e,t)},"keyFor",0,o,"routeIndex",0,function(e=[]){let t=new Map;for(let n of e||[]){let e=o(n),r=t.get(e);r||(r=new Set,t.set(e,r)),r.add(n.source_connection_id??null)}return t},"routesFor",0,function(e,t,n){return e?[...t?.get(o(e))??(null!=e.source_connection_id?new Set([e.source_connection_id]):new Set)].map(e=>({id:e,bridge:n?.get(e)??null})).sort(a):[]},"score",0,r,"score1",0,i,"separationPeople",0,function(e=[],n=[]){let r=new Map;for(let e of n||[])r.set(e.id,e);let s=new Map,c=new Map;for(let n of e||[]){let e=o(n);c.set(n.id,e);let r=s.get(e);r?function(e,n){let r=i(e)-i(n);if(r)return r>0;let o=!!(0,t.localPhoto)(e.profile_image_url);return!!(0,t.localPhoto)(n.profile_image_url)!==o?o:0>l(e.id,n.id)}(n,r.person)&&(r.person=n):(r={key:e,person:n,rowIds:[],routeIds:new Set},s.set(e,r)),r.rowIds.push(n.id),r.routeIds.add(n.source_connection_id??null)}let u={people:s.size,byTier:{S:0,A:0,B:0,C:0,D:0},multi:0,bridges:0,unresolvedIds:0,peopleOnlyUnresolved:0,onlyUnresolvedVia:0},g=new Set,h=new Set,f=new Set,p=[];for(let e of s.values()){let t=[...e.routeIds].map(e=>({id:e,bridge:r.get(e)??null}));t.sort(a);let n=t.filter(e=>e.bridge);for(let e of t)(e.bridge?g:h).add(e.id);if(!n.length)for(let e of(u.peopleOnlyUnresolved++,t))f.add(e.id);let{person:o}=e,l=o.tier;void 0!==u.byTier[l]&&u.byTier[l]++,t.length>1&&u.multi++,p.push({key:e.key,person:o,score:i(o),tier:l,routes:t,waysIn:t.length,rowIds:e.rowIds,haystack:[o.name,o.headline,o.company,o.role,...n.map(e=>e.bridge.name)].filter(Boolean).join("\n").toLowerCase(),rank:0,tied:!1})}return u.bridges=g.size,u.unresolvedIds=h.size,u.onlyUnresolvedVia=f.size,p.sort(d),function(e){for(let t=0;t<e.length;t++){let n=e[t],r=e[t-1],i=r&&r.score===n.score&&r.waysIn===n.waysIn;n.rank=i?r.rank:t+1,i&&(n.tied=!0,r.tied=!0)}}(p),{people:p,rowToKey:c,summary:u}},"shortName",0,u,"summitLayout",0,function(e=[],t=800,n=!1){let r=n?36:26,i=Math.round(.42*t),o=Math.round(.58*t),l=e.map((e,n)=>{var i;return{key:e.key,p:e,x:o,y:16+n*r,r:(i=e.waysIn)>=4?8.5:3===i?7:2===i?5.5:4,label:g(`#${e.rank}${e.tied?"=":""} ${e.person.name||""}`,Math.floor((t-o-60)/6.2))}}),a=new Map,d="\0unresolved";for(let e of l)for(let t of e.p.routes){let n=t.bridge?t.id:d,r=a.get(n);r||(r={id:t.bridge?t.id:null,bridge:t.bridge,unresolved:!t.bridge,ys:[],count:0},a.set(n,r)),r.count++,r.ys.push(e.y)}let c=[...a.values()].map(e=>({...e,bary:e.ys.reduce((e,t)=>e+t,0)/e.ys.length}));c.sort((e,t)=>e.bary-t.bary||e.unresolved-t.unresolved||(e.bridge&&t.bridge?s(e.bridge,t.bridge):0));let h=l.length?l[l.length-1].y:16,f=c.length>1?Math.max(18,(h-16)/(c.length-1)):0,p=Math.max(4,Math.floor((i-10-42)/6));c.forEach((e,t)=>{if(e.x=i,e.y=1===c.length?(16+h)/2:16+t*f,e.r=5,e.unresolved)e.label=g(`can't be named (${e.count})`,p);else{let t=e.bridge.name||"";e.label=t.length<=p?t:g(u(t),p)}delete e.ys});let y=new Map(c.map(e=>[e.unresolved?d:e.id,e])),m=[];for(let e of l){let t=new Set;e.p.routes.forEach((n,r)=>{let i=n.bridge?n.id:d;if(t.has(i))return;t.add(i);let o=y.get(i);m.push({key:e.key,bridgeId:o.id,primary:0===r&&!o.unresolved,unresolved:o.unresolved,tier:o.bridge?.tier??null,x1:o.x,y1:o.y,x2:e.x,y2:e.y})})}let b=Math.max(h,c.length?c[c.length-1].y:0),x=l.length?Math.ceil(b+16):0,v={x:20,y:l.length?(16+Math.max(h,b))/2:16,r:14},S=c.map(e=>({id:e.id,x1:v.x,y1:v.y,x2:e.x,y2:e.y}));return{width:t,height:x,you:v,people:l,bridges:c,links:m,spokes:S}}])},5258,e=>{"use strict";e.s(["TIER_COLORS",0,{S:"#f6c344",A:"#a78bfa",B:"#60a5fa",C:"#94a3b8",D:"#6b7280"},"TIER_COLORS_CLASSIC",0,{S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},"TIER_ORDER",0,["S","A","B","C","D"],"TIER_RING_RADIUS",0,{S:150,A:230,B:310,C:390,D:470},"initialsFor",0,function(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return 0===t.length?"?":(t[0].charAt(0)+(t.length>1?t[t.length-1].charAt(0):"")).toUpperCase()}])}]);
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/fef07dbb0973bf53-s.3p2_lha1f2xer.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/8a480f0b521d4e75-s.1qq4vpdcun5oj.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/53b9e256198e5412-s.390ncx5urfkfu.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/7178b3e590c64307-s.21jp631_3pja2.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Fallback;src:local(Arial);ascent-override:95.94%;descent-override:28.16%;line-gap-override:0.0%;size-adjust:104.76%}.geist_2ae47f08-module__h69qWW__className{font-family:Geist,Geist Fallback;font-style:normal}.geist_2ae47f08-module__h69qWW__variable{--font-geist-sans:"Geist", "Geist Fallback"}
|
|
2
2
|
@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/5ce348bf30bf5439-s.31988l_ccedte.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/4fa387ec64143e14-s.2tuy5pz7dlieh.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/6306c77e7c8268e4-s.2dbetqa9o8jxf.woff2)format("woff2");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/7d817b4c03b0c5f1-s.1uyisp29ctx0d.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/bbc41e54d2fcbd21-s.1rgnod-3esatf.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/797e433ab948586e-s.p.0r6juujl39pe6.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Fallback;src:local(Arial);ascent-override:74.67%;descent-override:21.92%;line-gap-override:0.0%;size-adjust:134.59%}.geist_mono_eb58308d-module__w_p2Lq__className{font-family:Geist Mono,Geist Mono Fallback;font-style:normal}.geist_mono_eb58308d-module__w_p2Lq__variable{--font-geist-mono:"Geist Mono", "Geist Mono Fallback"}
|
|
3
|
-
*{box-sizing:border-box;margin:0;padding:0}body{color:#fff;background:#0a0a1a;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}body:has(>div>[data-map]){overflow:hidden}html:has([data-field-question]){scroll-padding-bottom:80px}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#ffffff26;border-radius:3px}
|
|
3
|
+
*{box-sizing:border-box;margin:0;padding:0}body{color:#fff;background:#0a0a1a;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}body:has(>div>[data-map]){overflow:hidden}html:has([data-field-question]){scroll-padding-bottom:80px}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#ffffff26;border-radius:3px}:root{--scan-bar-top:94px}@media (max-width:767px){:root{--scan-bar-top:66px}}
|