From a0301f4cd2effb5371e83f387d08334ae10813d0 Mon Sep 17 00:00:00 2001 From: Russel Yasol <73575327+dr-dolomite@users.noreply.github.com> Date: Thu, 13 Mar 2025 20:51:47 +0800 Subject: [PATCH] Added missing cgi-bin directory --- .../root/www/404.html | 2 +- .../root/www/404/index.html | 2 +- .../static/chunks/2394-bec269701e2d0c16.js | 1 + .../static/chunks/3453-59569df86cb1327e.js | 1 + .../static/chunks/5755-b330e14a84ee51bb.js | 1 + .../static/chunks/7231-9bf29e950cdd6225.js | 1 - .../static/chunks/9007-7f45a2e4a42c9be9.js | 1 - .../cell-scanner/page-2c4956be7a457748.js | 1 + .../cell-scanner/page-a4709c7977b627a1.js | 1 - .../freq-calculator/page-72839bc94c5707d7.js | 1 - .../freq-calculator/page-76fc91defa16e132.js | 1 + .../www/_next/static/css/2adbd6ec1a3f6224.css | 3 + .../www/_next/static/css/562f52882551f4eb.css | 3 - .../_buildManifest.js | 0 .../_ssgManifest.js | 0 .../quecmanager/advance/fetch_commands.sh | 26 + .../cgi-bin/quecmanager/advance/fetch_macs.sh | 49 + .../www/cgi-bin/quecmanager/advance/mtu.sh | 90 + .../www/cgi-bin/quecmanager/advance/ttl.sh | 94 + .../quecmanager/at_cmd/at_queue_client.sh | 266 + .../cgi-bin/quecmanager/at_cmd/fetch_data.sh | 195 + .../root/www/cgi-bin/quecmanager/auth.sh | 62 + .../quecmanager/cell-locking/get_cell_lock.sh | 113 + .../cell-locking/scheduled_cell_locking.sh | 205 + .../apn-profiles/delete-apn-profile.sh | 127 + .../apn-profiles/fetch-apn-profile.sh | 144 + .../apn-profiles/save-apn-profile.sh | 345 + .../imei-profiles/delete-imei-profile.sh | 127 + .../imei-profiles/fetch-imei-profile.sh | 138 + .../imei-profiles/save-imei-profile.sh | 291 + .../cell-settings/scheduled_cell_locking.sh | 262 + .../cell-settings/sms/sms_delete.sh | 50 + .../cell-settings/sms/sms_inbox.sh | 10 + .../quecmanager/cell-settings/sms/sms_send.sh | 57 + .../experimental/cell_scanner/cell_scan.sh | 168 + .../cell_scanner/cell_scan_worker.sh | 323 + .../experimental/cell_scanner/check_scan.sh | 104 + .../experimental/cell_scanner/fetch_mccmnc.sh | 40 + .../experimental/cell_scanner/network_info.sh | 311 + .../quecmanager/experimental/keep_alive.sh | 195 + .../quecwatch/disable-quecwatch.sh | 63 + .../quecwatch/enable-quecwatch.sh | 137 + .../experimental/quecwatch/fetch-quecwatch.sh | 139 + .../experimental/quecwatch/reset-quecwatch.sh | 57 + .../root/www/cgi-bin/quecmanager/heartbeat.sh | 10 + .../www/cgi-bin/quecmanager/home/check_net.sh | 14 + .../quecmanager/home/fetch_data_usage.sh | 8 + .../quecmanager/home/fetch_hw_details.sh | 119 + .../quecmanager/home/fetch_signal_metrics.sh | 30 + .../cgi-bin/quecmanager/home/ping_latency.sh | 24 + .../www/cgi-bin/quecmanager/mcc-mnc-list.json | 37130 ++++++++++++++++ .../quecmanager/profiles/check_status.sh | 95 + .../quecmanager/profiles/list_profiles.sh | 154 + .../profiles/quec_profile_create.sh | 355 + .../profiles/quec_profile_delete.sh | 138 + .../quecmanager/profiles/quec_profile_edit.sh | 392 + .../quecmanager/settings/device-uptime.sh | 38 + .../quecmanager/settings/force-rerun.sh | 64 + .../www/cgi-bin/services/at_queue_manager.sh | 672 + .../cgi-bin/services/log_signal_metrics.sh | 198 + .../cgi-bin/services/quec_profile_daemon.sh | 1045 + .../root/www/cgi-bin/services/quecprofile.sh | 1045 + .../root/www/cgi-bin/services/quecwatch.sh | 544 + .../services/scheduled_cell_locking.sh | 429 + .../root/www/dashboard/about/index.html | 2 +- .../root/www/dashboard/about/index.txt | 4 +- .../advanced-settings/at-terminal/index.html | 2 +- .../advanced-settings/at-terminal/index.txt | 4 +- .../advanced-settings/connectivity/index.html | 2 +- .../advanced-settings/connectivity/index.txt | 4 +- .../advanced-settings/mtu/index.html | 2 +- .../dashboard/advanced-settings/mtu/index.txt | 4 +- .../advanced-settings/ttl-settings/index.html | 2 +- .../advanced-settings/ttl-settings/index.txt | 4 +- .../cell-settings/band-locking/index.html | 2 +- .../cell-settings/band-locking/index.txt | 4 +- .../cell-settings/basic-settings/index.html | 2 +- .../cell-settings/basic-settings/index.txt | 4 +- .../cell-settings/cell-locking/index.html | 2 +- .../cell-settings/cell-locking/index.txt | 4 +- .../cell-settings/imei-mangling/index.html | 2 +- .../cell-settings/imei-mangling/index.txt | 4 +- .../dashboard/cell-settings/sms/index.html | 2 +- .../www/dashboard/cell-settings/sms/index.txt | 4 +- .../experimental/cell-scanner/index.html | 2 +- .../experimental/cell-scanner/index.txt | 6 +- .../experimental/freq-calculator/index.html | 2 +- .../experimental/freq-calculator/index.txt | 6 +- .../experimental/keep-alive/index.html | 2 +- .../experimental/keep-alive/index.txt | 4 +- .../experimental/quecprofiles/index.html | 2 +- .../experimental/quecprofiles/index.txt | 4 +- .../experimental/quecwatch/index.html | 2 +- .../experimental/quecwatch/index.txt | 4 +- .../root/www/dashboard/home/index.html | 2 +- .../root/www/dashboard/home/index.txt | 4 +- .../settings/games/tetris/index.html | 2 +- .../dashboard/settings/games/tetris/index.txt | 4 +- .../dashboard/settings/security/index.html | 2 +- .../www/dashboard/settings/security/index.txt | 4 +- .../root/www/index.txt | 4 +- .../root/www/login.html | 2 +- .../root/www/login/index.html | 2 +- .../root/www/login/index.txt | 4 +- 104 files changed, 46764 insertions(+), 71 deletions(-) create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/2394-bec269701e2d0c16.js create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/3453-59569df86cb1327e.js create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/5755-b330e14a84ee51bb.js delete mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/7231-9bf29e950cdd6225.js delete mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/9007-7f45a2e4a42c9be9.js create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/cell-scanner/page-2c4956be7a457748.js delete mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/cell-scanner/page-a4709c7977b627a1.js delete mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/freq-calculator/page-72839bc94c5707d7.js create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/freq-calculator/page-76fc91defa16e132.js create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/css/2adbd6ec1a3f6224.css delete mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/css/562f52882551f4eb.css rename ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/{Kt0Xe6YYT_RuYVm3o2asX => xeZlQ8jLyR2FPwewgDcLc}/_buildManifest.js (100%) rename ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/{Kt0Xe6YYT_RuYVm3o2asX => xeZlQ8jLyR2FPwewgDcLc}/_ssgManifest.js (100%) create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/fetch_commands.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/fetch_macs.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/mtu.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/ttl.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/at_cmd/at_queue_client.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/at_cmd/fetch_data.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/auth.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-locking/get_cell_lock.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-locking/scheduled_cell_locking.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/apn-profiles/delete-apn-profile.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/apn-profiles/fetch-apn-profile.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/apn-profiles/save-apn-profile.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/imei-profiles/delete-imei-profile.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/imei-profiles/fetch-imei-profile.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/imei-profiles/save-imei-profile.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/scheduled_cell_locking.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_delete.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_inbox.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_send.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/cell_scan.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/cell_scan_worker.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/check_scan.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/fetch_mccmnc.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/network_info.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/keep_alive.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/disable-quecwatch.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/enable-quecwatch.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/fetch-quecwatch.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/reset-quecwatch.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/heartbeat.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/check_net.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_data_usage.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_hw_details.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_signal_metrics.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/ping_latency.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/mcc-mnc-list.json create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/check_status.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/list_profiles.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_create.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_delete.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_edit.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/settings/device-uptime.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/settings/force-rerun.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/at_queue_manager.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/log_signal_metrics.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quec_profile_daemon.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quecprofile.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quecwatch.sh create mode 100644 ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/scheduled_cell_locking.sh diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/404.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/404.html index a141733..0e8e9ca 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/404.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/404.html @@ -1 +1 @@ -404: This page could not be found.QuecManager

404

This page could not be found.

    \ No newline at end of file +404: This page could not be found.QuecManager

    404

    This page could not be found.

      \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/404/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/404/index.html index a141733..0e8e9ca 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/404/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/404/index.html @@ -1 +1 @@ -404: This page could not be found.QuecManager

      404

      This page could not be found.

        \ No newline at end of file +404: This page could not be found.QuecManager

        404

        This page could not be found.

          \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/2394-bec269701e2d0c16.js b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/2394-bec269701e2d0c16.js new file mode 100644 index 0000000..17f0265 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/2394-bec269701e2d0c16.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2394],{76076:(e,r,t)=>{t.d(r,{A:()=>a});let a=(0,t(39997).A)("FileUp",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"m15 15-3-3-3 3",key:"15xj92"}]])},59166:(e,r,t)=>{t.d(r,{A:()=>a});let a=(0,t(39997).A)("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]])},91994:(e,r,t)=>{t.d(r,{A:()=>a});let a=(0,t(39997).A)("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},27720:(e,r,t)=>{t.d(r,{A:()=>a});let a=(0,t(39997).A)("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]])},28702:(e,r,t)=>{t.d(r,{UC:()=>ei,Y9:()=>en,q7:()=>ea,bL:()=>et,l9:()=>eo});var a=t(20107),n=t(45170),o=t(32474),i=t(64236),l=t(94521),s=t(13061),c=t(34544),d=t(54122),u=t(54245),p=t(72763),f=t(20475),v="Collapsible",[m,h]=(0,n.A)(v),[b,y]=m(v),g=a.forwardRef((e,r)=>{let{__scopeCollapsible:t,open:n,defaultOpen:o,disabled:i,onOpenChange:l,...d}=e,[u=!1,v]=(0,s.i)({prop:n,defaultProp:o,onChange:l});return(0,f.jsx)(b,{scope:t,disabled:i,contentId:(0,p.B)(),open:u,onOpenToggle:a.useCallback(()=>v(e=>!e),[v]),children:(0,f.jsx)(c.sG.div,{"data-state":C(u),"data-disabled":i?"":void 0,...d,ref:r})})});g.displayName=v;var w="CollapsibleTrigger",x=a.forwardRef((e,r)=>{let{__scopeCollapsible:t,...a}=e,n=y(w,t);return(0,f.jsx)(c.sG.button,{type:"button","aria-controls":n.contentId,"aria-expanded":n.open||!1,"data-state":C(n.open),"data-disabled":n.disabled?"":void 0,disabled:n.disabled,...a,ref:r,onClick:(0,l.m)(e.onClick,n.onOpenToggle)})});x.displayName=w;var j="CollapsibleContent",O=a.forwardRef((e,r)=>{let{forceMount:t,...a}=e,n=y(j,e.__scopeCollapsible);return(0,f.jsx)(u.C,{present:t||n.open,children:e=>{let{present:t}=e;return(0,f.jsx)(k,{...a,ref:r,present:t})}})});O.displayName=j;var k=a.forwardRef((e,r)=>{let{__scopeCollapsible:t,present:n,children:o,...l}=e,s=y(j,t),[u,p]=a.useState(n),v=a.useRef(null),m=(0,i.s)(r,v),h=a.useRef(0),b=h.current,g=a.useRef(0),w=g.current,x=s.open||u,O=a.useRef(x),k=a.useRef();return a.useEffect(()=>{let e=requestAnimationFrame(()=>O.current=!1);return()=>cancelAnimationFrame(e)},[]),(0,d.N)(()=>{let e=v.current;if(e){k.current=k.current||{transitionDuration:e.style.transitionDuration,animationName:e.style.animationName},e.style.transitionDuration="0s",e.style.animationName="none";let r=e.getBoundingClientRect();h.current=r.height,g.current=r.width,O.current||(e.style.transitionDuration=k.current.transitionDuration,e.style.animationName=k.current.animationName),p(n)}},[s.open,n]),(0,f.jsx)(c.sG.div,{"data-state":C(s.open),"data-disabled":s.disabled?"":void 0,id:s.contentId,hidden:!x,...l,ref:m,style:{"--radix-collapsible-content-height":b?"".concat(b,"px"):void 0,"--radix-collapsible-content-width":w?"".concat(w,"px"):void 0,...e.style},children:x&&o})});function C(e){return e?"open":"closed"}var A=t(76056),N="Accordion",R=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[P,I,D]=(0,o.N)(N),[_,E]=(0,n.A)(N,[D,h]),S=h(),M=a.forwardRef((e,r)=>{let{type:t,...a}=e;return(0,f.jsx)(P.Provider,{scope:e.__scopeAccordion,children:"multiple"===t?(0,f.jsx)(T,{...a,ref:r}):(0,f.jsx)(L,{...a,ref:r})})});M.displayName=N;var[G,q]=_(N),[z,H]=_(N,{collapsible:!1}),L=a.forwardRef((e,r)=>{let{value:t,defaultValue:n,onValueChange:o=()=>{},collapsible:i=!1,...l}=e,[c,d]=(0,s.i)({prop:t,defaultProp:n,onChange:o});return(0,f.jsx)(G,{scope:e.__scopeAccordion,value:c?[c]:[],onItemOpen:d,onItemClose:a.useCallback(()=>i&&d(""),[i,d]),children:(0,f.jsx)(z,{scope:e.__scopeAccordion,collapsible:i,children:(0,f.jsx)(F,{...l,ref:r})})})}),T=a.forwardRef((e,r)=>{let{value:t,defaultValue:n,onValueChange:o=()=>{},...i}=e,[l=[],c]=(0,s.i)({prop:t,defaultProp:n,onChange:o}),d=a.useCallback(e=>c(function(){let r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return[...r,e]}),[c]),u=a.useCallback(e=>c(function(){let r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return r.filter(r=>r!==e)}),[c]);return(0,f.jsx)(G,{scope:e.__scopeAccordion,value:l,onItemOpen:d,onItemClose:u,children:(0,f.jsx)(z,{scope:e.__scopeAccordion,collapsible:!0,children:(0,f.jsx)(F,{...i,ref:r})})})}),[U,B]=_(N),F=a.forwardRef((e,r)=>{let{__scopeAccordion:t,disabled:n,dir:o,orientation:s="vertical",...d}=e,u=a.useRef(null),p=(0,i.s)(u,r),v=I(t),m="ltr"===(0,A.jH)(o),h=(0,l.m)(e.onKeyDown,e=>{var r;if(!R.includes(e.key))return;let t=e.target,a=v().filter(e=>{var r;return!(null===(r=e.ref.current)||void 0===r?void 0:r.disabled)}),n=a.findIndex(e=>e.ref.current===t),o=a.length;if(-1===n)return;e.preventDefault();let i=n,l=o-1,c=()=>{(i=n+1)>l&&(i=0)},d=()=>{(i=n-1)<0&&(i=l)};switch(e.key){case"Home":i=0;break;case"End":i=l;break;case"ArrowRight":"horizontal"===s&&(m?c():d());break;case"ArrowDown":"vertical"===s&&c();break;case"ArrowLeft":"horizontal"===s&&(m?d():c());break;case"ArrowUp":"vertical"===s&&d()}null===(r=a[i%o].ref.current)||void 0===r||r.focus()});return(0,f.jsx)(U,{scope:t,disabled:n,direction:o,orientation:s,children:(0,f.jsx)(P.Slot,{scope:t,children:(0,f.jsx)(c.sG.div,{...d,"data-orientation":s,ref:p,onKeyDown:n?void 0:h})})})}),K="AccordionItem",[V,W]=_(K),Y=a.forwardRef((e,r)=>{let{__scopeAccordion:t,value:a,...n}=e,o=B(K,t),i=q(K,t),l=S(t),s=(0,p.B)(),c=a&&i.value.includes(a)||!1,d=o.disabled||e.disabled;return(0,f.jsx)(V,{scope:t,open:c,disabled:d,triggerId:s,children:(0,f.jsx)(g,{"data-orientation":o.orientation,"data-state":er(c),...l,...n,ref:r,disabled:d,open:c,onOpenChange:e=>{e?i.onItemOpen(a):i.onItemClose(a)}})})});Y.displayName=K;var Z="AccordionHeader",J=a.forwardRef((e,r)=>{let{__scopeAccordion:t,...a}=e,n=B(N,t),o=W(Z,t);return(0,f.jsx)(c.sG.h3,{"data-orientation":n.orientation,"data-state":er(o.open),"data-disabled":o.disabled?"":void 0,...a,ref:r})});J.displayName=Z;var Q="AccordionTrigger",X=a.forwardRef((e,r)=>{let{__scopeAccordion:t,...a}=e,n=B(N,t),o=W(Q,t),i=H(Q,t),l=S(t);return(0,f.jsx)(P.ItemSlot,{scope:t,children:(0,f.jsx)(x,{"aria-disabled":o.open&&!i.collapsible||void 0,"data-orientation":n.orientation,id:o.triggerId,...l,...a,ref:r})})});X.displayName=Q;var $="AccordionContent",ee=a.forwardRef((e,r)=>{let{__scopeAccordion:t,...a}=e,n=B(N,t),o=W($,t),i=S(t);return(0,f.jsx)(O,{role:"region","aria-labelledby":o.triggerId,"data-orientation":n.orientation,...i,...a,ref:r,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...e.style}})});function er(e){return e?"open":"closed"}ee.displayName=$;var et=M,ea=Y,en=J,eo=X,ei=ee},33466:(e,r,t)=>{t.d(r,{C1:()=>x,bL:()=>w});var a=t(20107),n=t(54379),o=t(34544),i=t(20475),l="Progress",[s,c]=(0,n.A)(l),[d,u]=s(l),p=a.forwardRef((e,r)=>{var t,a,n,l;let{__scopeProgress:s,value:c=null,max:u,getValueLabel:p=m,...f}=e;(u||0===u)&&!y(u)&&console.error((t="".concat(u),a="Progress","Invalid prop `max` of value `".concat(t,"` supplied to `").concat(a,"`. Only numbers greater than 0 are valid max values. Defaulting to `").concat(100,"`.")));let v=y(u)?u:100;null===c||g(c,v)||console.error((n="".concat(c),l="Progress","Invalid prop `value` of value `".concat(n,"` supplied to `").concat(l,"`. The `value` prop must be:\n - a positive number\n - less than the value passed to `max` (or ").concat(100," if no `max` prop is set)\n - `null` or `undefined` if the progress is indeterminate.\n\nDefaulting to `null`.")));let w=g(c,v)?c:null,x=b(w)?p(w,v):void 0;return(0,i.jsx)(d,{scope:s,value:w,max:v,children:(0,i.jsx)(o.sG.div,{"aria-valuemax":v,"aria-valuemin":0,"aria-valuenow":b(w)?w:void 0,"aria-valuetext":x,role:"progressbar","data-state":h(w,v),"data-value":null!=w?w:void 0,"data-max":v,...f,ref:r})})});p.displayName=l;var f="ProgressIndicator",v=a.forwardRef((e,r)=>{var t;let{__scopeProgress:a,...n}=e,l=u(f,a);return(0,i.jsx)(o.sG.div,{"data-state":h(l.value,l.max),"data-value":null!==(t=l.value)&&void 0!==t?t:void 0,"data-max":l.max,...n,ref:r})});function m(e,r){return"".concat(Math.round(e/r*100),"%")}function h(e,r){return null==e?"indeterminate":e===r?"complete":"loading"}function b(e){return"number"==typeof e}function y(e){return b(e)&&!isNaN(e)&&e>0}function g(e,r){return b(e)&&!isNaN(e)&&e<=r&&e>=0}v.displayName=f;var w=p,x=v},91475:(e,r,t)=>{t.d(r,{b:()=>l,s:()=>i});var a=t(20107),n=t(34544),o=t(20475),i=a.forwardRef((e,r)=>(0,o.jsx)(n.sG.span,{...e,ref:r,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}));i.displayName="VisuallyHidden";var l=i},45930:(e,r,t)=>{t.d(r,{k5:()=>d});var a=t(20107),n={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},o=a.createContext&&a.createContext(n),i=["attr","size","title"];function l(){return(l=Object.assign?Object.assign.bind():function(e){for(var r=1;ra.createElement(u,l({attr:c({},e.attr)},r),function e(r){return r&&r.map((r,t)=>a.createElement(r.tag,c({key:t},r.attr),e(r.child)))}(e.child))}function u(e){var r=r=>{var t,{attr:n,size:o,title:s}=e,d=function(e,r){if(null==e)return{};var t,a,n=function(e,r){if(null==e)return{};var t={};for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){if(r.indexOf(a)>=0)continue;t[a]=e[a]}return t}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0)&&Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}(e,i),u=o||r.size||"1em";return r.className&&(t=r.className),e.className&&(t=(t?t+" ":"")+e.className),a.createElement("svg",l({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},r.attr,n,d,{className:t,style:c(c({color:e.color||r.color},r.style),e.style),height:u,width:u,xmlns:"http://www.w3.org/2000/svg"}),s&&a.createElement("title",null,s),e.children)};return void 0!==o?a.createElement(o.Consumer,null,e=>r(e)):r(n)}}}]); \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/3453-59569df86cb1327e.js b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/3453-59569df86cb1327e.js new file mode 100644 index 0000000..6107e3c --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/3453-59569df86cb1327e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3453],{39997:(e,t,r)=>{r.d(t,{A:()=>s});var n=r(20107);let o=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),a=function(){for(var e=arguments.length,t=Array(e),r=0;r!!e&&r.indexOf(e)===t).join(" ")};var l={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let i=(0,n.forwardRef)((e,t)=>{let{color:r="currentColor",size:o=24,strokeWidth:i=2,absoluteStrokeWidth:s,className:u="",children:c,iconNode:d,...f}=e;return(0,n.createElement)("svg",{ref:t,...l,width:o,height:o,stroke:r,strokeWidth:s?24*Number(i)/Number(o):i,className:a("lucide",u),...f},[...d.map(e=>{let[t,r]=e;return(0,n.createElement)(t,r)}),...Array.isArray(c)?c:[c]])}),s=(e,t)=>{let r=(0,n.forwardRef)((r,l)=>{let{className:s,...u}=r;return(0,n.createElement)(i,{ref:l,iconNode:t,className:a("lucide-".concat(o(e)),s),...u})});return r.displayName="".concat(e),r}},51873:(e,t,r)=>{r.d(t,{A:()=>n});let n=(0,r(39997).A)("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]])},32474:(e,t,r)=>{r.d(t,{N:()=>s});var n=r(20107),o=r(54379),a=r(64236),l=r(61837),i=r(20475);function s(e){let t=e+"CollectionProvider",[r,s]=(0,o.A)(t),[u,c]=r(t,{collectionRef:{current:null},itemMap:new Map}),d=e=>{let{scope:t,children:r}=e,o=n.useRef(null),a=n.useRef(new Map).current;return(0,i.jsx)(u,{scope:t,itemMap:a,collectionRef:o,children:r})};d.displayName=t;let f=e+"CollectionSlot",m=n.forwardRef((e,t)=>{let{scope:r,children:n}=e,o=c(f,r),s=(0,a.s)(t,o.collectionRef);return(0,i.jsx)(l.DX,{ref:s,children:n})});m.displayName=f;let v=e+"CollectionItemSlot",p="data-radix-collection-item",h=n.forwardRef((e,t)=>{let{scope:r,children:o,...s}=e,u=n.useRef(null),d=(0,a.s)(t,u),f=c(v,r);return n.useEffect(()=>(f.itemMap.set(u,{ref:u,...s}),()=>void f.itemMap.delete(u))),(0,i.jsx)(l.DX,{[p]:"",ref:d,children:o})});return h.displayName=v,[{Provider:d,Slot:m,ItemSlot:h},function(t){let r=c(e+"CollectionConsumer",t);return n.useCallback(()=>{let e=r.collectionRef.current;if(!e)return[];let t=Array.from(e.querySelectorAll("[".concat(p,"]")));return Array.from(r.itemMap.values()).sort((e,r)=>t.indexOf(e.ref.current)-t.indexOf(r.ref.current))},[r.collectionRef,r.itemMap])},s]}},71856:(e,t,r)=>{r.d(t,{RG:()=>g,bL:()=>E,q7:()=>N});var n=r(20107),o=r(94521),a=r(32474),l=r(64236),i=r(54379),s=r(72763),u=r(34544),c=r(46774),d=r(13061),f=r(76056),m=r(20475),v="rovingFocusGroup.onEntryFocus",p={bubbles:!1,cancelable:!0},h="RovingFocusGroup",[w,b,y]=(0,a.N)(h),[x,g]=(0,i.A)(h,[y]),[R,A]=x(h),C=n.forwardRef((e,t)=>(0,m.jsx)(w.Provider,{scope:e.__scopeRovingFocusGroup,children:(0,m.jsx)(w.Slot,{scope:e.__scopeRovingFocusGroup,children:(0,m.jsx)(k,{...e,ref:t})})}));C.displayName=h;var k=n.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:r,orientation:a,loop:i=!1,dir:s,currentTabStopId:h,defaultCurrentTabStopId:w,onCurrentTabStopIdChange:y,onEntryFocus:x,preventScrollOnEntryFocus:g=!1,...A}=e,C=n.useRef(null),k=(0,l.s)(t,C),j=(0,f.jH)(s),[I=null,D]=(0,d.i)({prop:h,defaultProp:w,onChange:y}),[E,N]=n.useState(!1),M=(0,c.c)(x),T=b(r),G=n.useRef(!1),[L,S]=n.useState(0);return n.useEffect(()=>{let e=C.current;if(e)return e.addEventListener(v,M),()=>e.removeEventListener(v,M)},[M]),(0,m.jsx)(R,{scope:r,orientation:a,dir:j,loop:i,currentTabStopId:I,onItemFocus:n.useCallback(e=>D(e),[D]),onItemShiftTab:n.useCallback(()=>N(!0),[]),onFocusableItemAdd:n.useCallback(()=>S(e=>e+1),[]),onFocusableItemRemove:n.useCallback(()=>S(e=>e-1),[]),children:(0,m.jsx)(u.sG.div,{tabIndex:E||0===L?-1:0,"data-orientation":a,...A,ref:k,style:{outline:"none",...e.style},onMouseDown:(0,o.m)(e.onMouseDown,()=>{G.current=!0}),onFocus:(0,o.m)(e.onFocus,e=>{let t=!G.current;if(e.target===e.currentTarget&&t&&!E){let t=new CustomEvent(v,p);if(e.currentTarget.dispatchEvent(t),!t.defaultPrevented){let e=T().filter(e=>e.focusable);F([e.find(e=>e.active),e.find(e=>e.id===I),...e].filter(Boolean).map(e=>e.ref.current),g)}}G.current=!1}),onBlur:(0,o.m)(e.onBlur,()=>N(!1))})})}),j="RovingFocusGroupItem",I=n.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:r,focusable:a=!0,active:l=!1,tabStopId:i,...c}=e,d=(0,s.B)(),f=i||d,v=A(j,r),p=v.currentTabStopId===f,h=b(r),{onFocusableItemAdd:y,onFocusableItemRemove:x}=v;return n.useEffect(()=>{if(a)return y(),()=>x()},[a,y,x]),(0,m.jsx)(w.ItemSlot,{scope:r,id:f,focusable:a,active:l,children:(0,m.jsx)(u.sG.span,{tabIndex:p?0:-1,"data-orientation":v.orientation,...c,ref:t,onMouseDown:(0,o.m)(e.onMouseDown,e=>{a?v.onItemFocus(f):e.preventDefault()}),onFocus:(0,o.m)(e.onFocus,()=>v.onItemFocus(f)),onKeyDown:(0,o.m)(e.onKeyDown,e=>{if("Tab"===e.key&&e.shiftKey){v.onItemShiftTab();return}if(e.target!==e.currentTarget)return;let t=function(e,t,r){var n;let o=(n=e.key,"rtl"!==r?n:"ArrowLeft"===n?"ArrowRight":"ArrowRight"===n?"ArrowLeft":n);if(!("vertical"===t&&["ArrowLeft","ArrowRight"].includes(o))&&!("horizontal"===t&&["ArrowUp","ArrowDown"].includes(o)))return D[o]}(e,v.orientation,v.dir);if(void 0!==t){if(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;e.preventDefault();let r=h().filter(e=>e.focusable).map(e=>e.ref.current);if("last"===t)r.reverse();else if("prev"===t||"next"===t){"prev"===t&&r.reverse();let n=r.indexOf(e.currentTarget);r=v.loop?function(e,t){return e.map((r,n)=>e[(t+n)%e.length])}(r,n+1):r.slice(n+1)}setTimeout(()=>F(r))}})})})});I.displayName=j;var D={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function F(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=document.activeElement;for(let n of e)if(n===r||(n.focus({preventScroll:t}),document.activeElement!==r))return}var E=C,N=I},93677:(e,t,r)=>{r.d(t,{B8:()=>F,UC:()=>N,bL:()=>D,l9:()=>E});var n=r(20107),o=r(94521),a=r(45170),l=r(71856),i=r(54245),s=r(34544),u=r(76056),c=r(13061),d=r(72763),f=r(20475),m="Tabs",[v,p]=(0,a.A)(m,[l.RG]),h=(0,l.RG)(),[w,b]=v(m),y=n.forwardRef((e,t)=>{let{__scopeTabs:r,value:n,onValueChange:o,defaultValue:a,orientation:l="horizontal",dir:i,activationMode:m="automatic",...v}=e,p=(0,u.jH)(i),[h,b]=(0,c.i)({prop:n,onChange:o,defaultProp:a});return(0,f.jsx)(w,{scope:r,baseId:(0,d.B)(),value:h,onValueChange:b,orientation:l,dir:p,activationMode:m,children:(0,f.jsx)(s.sG.div,{dir:p,"data-orientation":l,...v,ref:t})})});y.displayName=m;var x="TabsList",g=n.forwardRef((e,t)=>{let{__scopeTabs:r,loop:n=!0,...o}=e,a=b(x,r),i=h(r);return(0,f.jsx)(l.bL,{asChild:!0,...i,orientation:a.orientation,dir:a.dir,loop:n,children:(0,f.jsx)(s.sG.div,{role:"tablist","aria-orientation":a.orientation,...o,ref:t})})});g.displayName=x;var R="TabsTrigger",A=n.forwardRef((e,t)=>{let{__scopeTabs:r,value:n,disabled:a=!1,...i}=e,u=b(R,r),c=h(r),d=j(u.baseId,n),m=I(u.baseId,n),v=n===u.value;return(0,f.jsx)(l.q7,{asChild:!0,...c,focusable:!a,active:v,children:(0,f.jsx)(s.sG.button,{type:"button",role:"tab","aria-selected":v,"aria-controls":m,"data-state":v?"active":"inactive","data-disabled":a?"":void 0,disabled:a,id:d,...i,ref:t,onMouseDown:(0,o.m)(e.onMouseDown,e=>{a||0!==e.button||!1!==e.ctrlKey?e.preventDefault():u.onValueChange(n)}),onKeyDown:(0,o.m)(e.onKeyDown,e=>{[" ","Enter"].includes(e.key)&&u.onValueChange(n)}),onFocus:(0,o.m)(e.onFocus,()=>{let e="manual"!==u.activationMode;v||a||!e||u.onValueChange(n)})})})});A.displayName=R;var C="TabsContent",k=n.forwardRef((e,t)=>{let{__scopeTabs:r,value:o,forceMount:a,children:l,...u}=e,c=b(C,r),d=j(c.baseId,o),m=I(c.baseId,o),v=o===c.value,p=n.useRef(v);return n.useEffect(()=>{let e=requestAnimationFrame(()=>p.current=!1);return()=>cancelAnimationFrame(e)},[]),(0,f.jsx)(i.C,{present:a||v,children:r=>{let{present:n}=r;return(0,f.jsx)(s.sG.div,{"data-state":v?"active":"inactive","data-orientation":c.orientation,role:"tabpanel","aria-labelledby":d,hidden:!n,id:m,tabIndex:0,...u,ref:t,style:{...e.style,animationDuration:p.current?"0s":void 0},children:n&&l})}})});function j(e,t){return"".concat(e,"-trigger-").concat(t)}function I(e,t){return"".concat(e,"-content-").concat(t)}k.displayName=C;var D=y,F=g,E=A,N=k}}]); \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/5755-b330e14a84ee51bb.js b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/5755-b330e14a84ee51bb.js new file mode 100644 index 0000000..eecbd9b --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/5755-b330e14a84ee51bb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5755],{58212:(e,t,n)=>{n.d(t,{A:()=>r});let r=(0,n(39997).A)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},94521:(e,t,n)=>{n.d(t,{m:()=>r});function r(e,t,{checkForDefaultPrevented:n=!0}={}){return function(r){if(e?.(r),!1===n||!r.defaultPrevented)return t?.(r)}}},54379:(e,t,n)=>{n.d(t,{A:()=>o});var r=n(20107),u=n(20475);function o(e,t=[]){let n=[],i=()=>{let t=n.map(e=>r.createContext(e));return function(n){let u=n?.[e]||t;return r.useMemo(()=>({[`__scope${e}`]:{...n,[e]:u}}),[n,u])}};return i.scopeName=e,[function(t,o){let i=r.createContext(o),l=n.length;function a(t){let{scope:n,children:o,...a}=t,s=n?.[e][l]||i,c=r.useMemo(()=>a,Object.values(a));return(0,u.jsx)(s.Provider,{value:c,children:o})}return n=[...n,o],a.displayName=t+"Provider",[a,function(n,u){let a=u?.[e][l]||i,s=r.useContext(a);if(s)return s;if(void 0!==o)return o;throw Error(`\`${n}\` must be used within \`${t}\``)}]},function(...e){let t=e[0];if(1===e.length)return t;let n=()=>{let n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let u=n.reduce((t,{useScope:n,scopeName:r})=>{let u=n(e)[`__scope${r}`];return{...t,...u}},{});return r.useMemo(()=>({[`__scope${t.scopeName}`]:u}),[u])}};return n.scopeName=t.scopeName,n}(i,...t)]}},45170:(e,t,n)=>{n.d(t,{A:()=>i,q:()=>o});var r=n(20107),u=n(20475);function o(e,t){let n=r.createContext(t),o=e=>{let{children:t,...o}=e,i=r.useMemo(()=>o,Object.values(o));return(0,u.jsx)(n.Provider,{value:i,children:t})};return o.displayName=e+"Provider",[o,function(u){let o=r.useContext(n);if(o)return o;if(void 0!==t)return t;throw Error(`\`${u}\` must be used within \`${e}\``)}]}function i(e,t=[]){let n=[],o=()=>{let t=n.map(e=>r.createContext(e));return function(n){let u=n?.[e]||t;return r.useMemo(()=>({[`__scope${e}`]:{...n,[e]:u}}),[n,u])}};return o.scopeName=e,[function(t,o){let i=r.createContext(o),l=n.length;n=[...n,o];let a=t=>{let{scope:n,children:o,...a}=t,s=n?.[e]?.[l]||i,c=r.useMemo(()=>a,Object.values(a));return(0,u.jsx)(s.Provider,{value:c,children:o})};return a.displayName=t+"Provider",[a,function(n,u){let a=u?.[e]?.[l]||i,s=r.useContext(a);if(s)return s;if(void 0!==o)return o;throw Error(`\`${n}\` must be used within \`${t}\``)}]},function(...e){let t=e[0];if(1===e.length)return t;let n=()=>{let n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let u=n.reduce((t,{useScope:n,scopeName:r})=>{let u=n(e)[`__scope${r}`];return{...t,...u}},{});return r.useMemo(()=>({[`__scope${t.scopeName}`]:u}),[u])}};return n.scopeName=t.scopeName,n}(o,...t)]}},76056:(e,t,n)=>{n.d(t,{jH:()=>o});var r=n(20107);n(20475);var u=r.createContext(void 0);function o(e){let t=r.useContext(u);return e||t||"ltr"}},72763:(e,t,n)=>{n.d(t,{B:()=>a});var r,u=n(20107),o=n(54122),i=(r||(r=n.t(u,2)))["useId".toString()]||(()=>void 0),l=0;function a(e){let[t,n]=u.useState(i());return(0,o.N)(()=>{e||n(e=>e??String(l++))},[e]),e||(t?`radix-${t}`:"")}},21840:(e,t,n)=>{n.d(t,{b:()=>l});var r=n(20107),u=n(34544),o=n(20475),i=r.forwardRef((e,t)=>(0,o.jsx)(u.sG.label,{...e,ref:t,onMouseDown:t=>{var n;t.target.closest("button, input, select, textarea")||(null===(n=e.onMouseDown)||void 0===n||n.call(e,t),!t.defaultPrevented&&t.detail>1&&t.preventDefault())}}));i.displayName="Label";var l=i},54245:(e,t,n)=>{n.d(t,{C:()=>i});var r=n(20107),u=n(64236),o=n(54122),i=e=>{let{present:t,children:n}=e,i=function(e){var t,n;let[u,i]=r.useState(),a=r.useRef({}),s=r.useRef(e),c=r.useRef("none"),[d,f]=(t=e?"mounted":"unmounted",n={mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}},r.useReducer((e,t)=>{let r=n[e][t];return null!=r?r:e},t));return r.useEffect(()=>{let e=l(a.current);c.current="mounted"===d?e:"none"},[d]),(0,o.N)(()=>{let t=a.current,n=s.current;if(n!==e){let r=c.current,u=l(t);e?f("MOUNT"):"none"===u||(null==t?void 0:t.display)==="none"?f("UNMOUNT"):n&&r!==u?f("ANIMATION_OUT"):f("UNMOUNT"),s.current=e}},[e,f]),(0,o.N)(()=>{if(u){var e;let t;let n=null!==(e=u.ownerDocument.defaultView)&&void 0!==e?e:window,r=e=>{let r=l(a.current).includes(e.animationName);if(e.target===u&&r&&(f("ANIMATION_END"),!s.current)){let e=u.style.animationFillMode;u.style.animationFillMode="forwards",t=n.setTimeout(()=>{"forwards"===u.style.animationFillMode&&(u.style.animationFillMode=e)})}},o=e=>{e.target===u&&(c.current=l(a.current))};return u.addEventListener("animationstart",o),u.addEventListener("animationcancel",r),u.addEventListener("animationend",r),()=>{n.clearTimeout(t),u.removeEventListener("animationstart",o),u.removeEventListener("animationcancel",r),u.removeEventListener("animationend",r)}}f("ANIMATION_END")},[u,f]),{isPresent:["mounted","unmountSuspended"].includes(d),ref:r.useCallback(e=>{e&&(a.current=getComputedStyle(e)),i(e)},[])}}(t),a="function"==typeof n?n({present:i.isPresent}):r.Children.only(n),s=(0,u.s)(i.ref,function(e){var t,n;let r=null===(t=Object.getOwnPropertyDescriptor(e.props,"ref"))||void 0===t?void 0:t.get,u=r&&"isReactWarning"in r&&r.isReactWarning;return u?e.ref:(u=(r=null===(n=Object.getOwnPropertyDescriptor(e,"ref"))||void 0===n?void 0:n.get)&&"isReactWarning"in r&&r.isReactWarning)?e.props.ref:e.props.ref||e.ref}(a));return"function"==typeof n||i.isPresent?r.cloneElement(a,{ref:s}):null};function l(e){return(null==e?void 0:e.animationName)||"none"}i.displayName="Presence"},34544:(e,t,n)=>{n.d(t,{hO:()=>a,sG:()=>l});var r=n(20107),u=n(25642),o=n(61837),i=n(20475),l=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","span","svg","ul"].reduce((e,t)=>{let n=r.forwardRef((e,n)=>{let{asChild:r,...u}=e,l=r?o.DX:t;return"undefined"!=typeof window&&(window[Symbol.for("radix-ui")]=!0),(0,i.jsx)(l,{...u,ref:n})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function a(e,t){e&&u.flushSync(()=>e.dispatchEvent(t))}},46774:(e,t,n)=>{n.d(t,{c:()=>u});var r=n(20107);function u(e){let t=r.useRef(e);return r.useEffect(()=>{t.current=e}),r.useMemo(()=>(...e)=>t.current?.(...e),[])}},13061:(e,t,n)=>{n.d(t,{i:()=>o});var r=n(20107),u=n(46774);function o({prop:e,defaultProp:t,onChange:n=()=>{}}){let[o,i]=function({defaultProp:e,onChange:t}){let n=r.useState(e),[o]=n,i=r.useRef(o),l=(0,u.c)(t);return r.useEffect(()=>{i.current!==o&&(l(o),i.current=o)},[o,i,l]),n}({defaultProp:t,onChange:n}),l=void 0!==e,a=l?e:o,s=(0,u.c)(n);return[a,r.useCallback(t=>{if(l){let n="function"==typeof t?t(e):t;n!==e&&s(n)}else i(t)},[l,e,i,s])]}},54122:(e,t,n)=>{n.d(t,{N:()=>u});var r=n(20107),u=globalThis?.document?r.useLayoutEffect:()=>{}},29395:(e,t,n)=>{n.d(t,{F:()=>o});let r=e=>"boolean"==typeof e?"".concat(e):0===e?"0":e,u=function(){for(var e,t,n=0,r="";nn=>{var o;if((null==t?void 0:t.variants)==null)return u(e,null==n?void 0:n.class,null==n?void 0:n.className);let{variants:i,defaultVariants:l}=t,a=Object.keys(i).map(e=>{let t=null==n?void 0:n[e],u=null==l?void 0:l[e];if(null===t)return null;let o=r(t)||r(u);return i[e][o]}),s=n&&Object.entries(n).reduce((e,t)=>{let[n,r]=t;return void 0===r||(e[n]=r),e},{});return u(e,a,null==t?void 0:null===(o=t.compoundVariants)||void 0===o?void 0:o.reduce((e,t)=>{let{class:n,className:r,...u}=t;return Object.entries(u).every(e=>{let[t,n]=e;return Array.isArray(n)?n.includes({...l,...s}[t]):({...l,...s})[t]===n})?[...e,n,r]:e},[]),null==n?void 0:n.class,null==n?void 0:n.className)}}}]); \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/7231-9bf29e950cdd6225.js b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/7231-9bf29e950cdd6225.js deleted file mode 100644 index 1094d91..0000000 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/7231-9bf29e950cdd6225.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7231],{39997:(e,r,t)=>{t.d(r,{A:()=>c});var a=t(20107);let n=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),o=function(){for(var e=arguments.length,r=Array(e),t=0;t!!e&&t.indexOf(e)===r).join(" ")};var l={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let i=(0,a.forwardRef)((e,r)=>{let{color:t="currentColor",size:n=24,strokeWidth:i=2,absoluteStrokeWidth:c,className:s="",children:u,iconNode:d,...p}=e;return(0,a.createElement)("svg",{ref:r,...l,width:n,height:n,stroke:t,strokeWidth:c?24*Number(i)/Number(n):i,className:o("lucide",s),...p},[...d.map(e=>{let[r,t]=e;return(0,a.createElement)(r,t)}),...Array.isArray(u)?u:[u]])}),c=(e,r)=>{let t=(0,a.forwardRef)((t,l)=>{let{className:c,...s}=t;return(0,a.createElement)(i,{ref:l,iconNode:r,className:o("lucide-".concat(n(e)),c),...s})});return t.displayName="".concat(e),t}},76076:(e,r,t)=>{t.d(r,{A:()=>a});let a=(0,t(39997).A)("FileUp",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"m15 15-3-3-3 3",key:"15xj92"}]])},59166:(e,r,t)=>{t.d(r,{A:()=>a});let a=(0,t(39997).A)("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]])},91994:(e,r,t)=>{t.d(r,{A:()=>a});let a=(0,t(39997).A)("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},27720:(e,r,t)=>{t.d(r,{A:()=>a});let a=(0,t(39997).A)("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]])},51873:(e,r,t)=>{t.d(r,{A:()=>a});let a=(0,t(39997).A)("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]])},33466:(e,r,t)=>{t.d(r,{C1:()=>O,bL:()=>w});var a=t(20107),n=t(54379),o=t(34544),l=t(20475),i="Progress",[c,s]=(0,n.A)(i),[u,d]=c(i),p=a.forwardRef((e,r)=>{var t,a,n,i;let{__scopeProgress:c,value:s=null,max:d,getValueLabel:p=y,...v}=e;(d||0===d)&&!b(d)&&console.error((t="".concat(d),a="Progress","Invalid prop `max` of value `".concat(t,"` supplied to `").concat(a,"`. Only numbers greater than 0 are valid max values. Defaulting to `").concat(100,"`.")));let f=b(d)?d:100;null===s||g(s,f)||console.error((n="".concat(s),i="Progress","Invalid prop `value` of value `".concat(n,"` supplied to `").concat(i,"`. The `value` prop must be:\n - a positive number\n - less than the value passed to `max` (or ").concat(100," if no `max` prop is set)\n - `null` or `undefined` if the progress is indeterminate.\n\nDefaulting to `null`.")));let w=g(s,f)?s:null,O=m(w)?p(w,f):void 0;return(0,l.jsx)(u,{scope:c,value:w,max:f,children:(0,l.jsx)(o.sG.div,{"aria-valuemax":f,"aria-valuemin":0,"aria-valuenow":m(w)?w:void 0,"aria-valuetext":O,role:"progressbar","data-state":h(w,f),"data-value":null!=w?w:void 0,"data-max":f,...v,ref:r})})});p.displayName=i;var v="ProgressIndicator",f=a.forwardRef((e,r)=>{var t;let{__scopeProgress:a,...n}=e,i=d(v,a);return(0,l.jsx)(o.sG.div,{"data-state":h(i.value,i.max),"data-value":null!==(t=i.value)&&void 0!==t?t:void 0,"data-max":i.max,...n,ref:r})});function y(e,r){return"".concat(Math.round(e/r*100),"%")}function h(e,r){return null==e?"indeterminate":e===r?"complete":"loading"}function m(e){return"number"==typeof e}function b(e){return m(e)&&!isNaN(e)&&e>0}function g(e,r){return m(e)&&!isNaN(e)&&e<=r&&e>=0}f.displayName=v;var w=p,O=f},91475:(e,r,t)=>{t.d(r,{b:()=>i,s:()=>l});var a=t(20107),n=t(34544),o=t(20475),l=a.forwardRef((e,r)=>(0,o.jsx)(n.sG.span,{...e,ref:r,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}));l.displayName="VisuallyHidden";var i=l},45930:(e,r,t)=>{t.d(r,{k5:()=>u});var a=t(20107),n={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},o=a.createContext&&a.createContext(n),l=["attr","size","title"];function i(){return(i=Object.assign?Object.assign.bind():function(e){for(var r=1;ra.createElement(d,i({attr:s({},e.attr)},r),function e(r){return r&&r.map((r,t)=>a.createElement(r.tag,s({key:t},r.attr),e(r.child)))}(e.child))}function d(e){var r=r=>{var t,{attr:n,size:o,title:c}=e,u=function(e,r){if(null==e)return{};var t,a,n=function(e,r){if(null==e)return{};var t={};for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){if(r.indexOf(a)>=0)continue;t[a]=e[a]}return t}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0)&&Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}(e,l),d=o||r.size||"1em";return r.className&&(t=r.className),e.className&&(t=(t?t+" ":"")+e.className),a.createElement("svg",i({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},r.attr,n,u,{className:t,style:s(s({color:e.color||r.color},r.style),e.style),height:d,width:d,xmlns:"http://www.w3.org/2000/svg"}),c&&a.createElement("title",null,c),e.children)};return void 0!==o?a.createElement(o.Consumer,null,e=>r(e)):r(n)}}}]); \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/9007-7f45a2e4a42c9be9.js b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/9007-7f45a2e4a42c9be9.js deleted file mode 100644 index f21916d..0000000 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/9007-7f45a2e4a42c9be9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9007],{39997:(e,t,r)=>{r.d(t,{A:()=>l});var n=r(20107);let o=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),a=function(){for(var e=arguments.length,t=Array(e),r=0;r!!e&&r.indexOf(e)===t).join(" ")};var u={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let i=(0,n.forwardRef)((e,t)=>{let{color:r="currentColor",size:o=24,strokeWidth:i=2,absoluteStrokeWidth:l,className:s="",children:c,iconNode:d,...f}=e;return(0,n.createElement)("svg",{ref:t,...u,width:o,height:o,stroke:r,strokeWidth:l?24*Number(i)/Number(o):i,className:a("lucide",s),...f},[...d.map(e=>{let[t,r]=e;return(0,n.createElement)(t,r)}),...Array.isArray(c)?c:[c]])}),l=(e,t)=>{let r=(0,n.forwardRef)((r,u)=>{let{className:l,...s}=r;return(0,n.createElement)(i,{ref:u,iconNode:t,className:a("lucide-".concat(o(e)),l),...s})});return r.displayName="".concat(e),r}},51873:(e,t,r)=>{r.d(t,{A:()=>n});let n=(0,r(39997).A)("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]])},58212:(e,t,r)=>{r.d(t,{A:()=>n});let n=(0,r(39997).A)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},94521:(e,t,r)=>{r.d(t,{m:()=>n});function n(e,t,{checkForDefaultPrevented:r=!0}={}){return function(n){if(e?.(n),!1===r||!n.defaultPrevented)return t?.(n)}}},32474:(e,t,r)=>{r.d(t,{N:()=>l});var n=r(20107),o=r(54379),a=r(64236),u=r(61837),i=r(20475);function l(e){let t=e+"CollectionProvider",[r,l]=(0,o.A)(t),[s,c]=r(t,{collectionRef:{current:null},itemMap:new Map}),d=e=>{let{scope:t,children:r}=e,o=n.useRef(null),a=n.useRef(new Map).current;return(0,i.jsx)(s,{scope:t,itemMap:a,collectionRef:o,children:r})};d.displayName=t;let f=e+"CollectionSlot",m=n.forwardRef((e,t)=>{let{scope:r,children:n}=e,o=c(f,r),l=(0,a.s)(t,o.collectionRef);return(0,i.jsx)(u.DX,{ref:l,children:n})});m.displayName=f;let v=e+"CollectionItemSlot",p="data-radix-collection-item",y=n.forwardRef((e,t)=>{let{scope:r,children:o,...l}=e,s=n.useRef(null),d=(0,a.s)(t,s),f=c(v,r);return n.useEffect(()=>(f.itemMap.set(s,{ref:s,...l}),()=>void f.itemMap.delete(s))),(0,i.jsx)(u.DX,{[p]:"",ref:d,children:o})});return y.displayName=v,[{Provider:d,Slot:m,ItemSlot:y},function(t){let r=c(e+"CollectionConsumer",t);return n.useCallback(()=>{let e=r.collectionRef.current;if(!e)return[];let t=Array.from(e.querySelectorAll("[".concat(p,"]")));return Array.from(r.itemMap.values()).sort((e,r)=>t.indexOf(e.ref.current)-t.indexOf(r.ref.current))},[r.collectionRef,r.itemMap])},l]}},54379:(e,t,r)=>{r.d(t,{A:()=>a});var n=r(20107),o=r(20475);function a(e,t=[]){let r=[],u=()=>{let t=r.map(e=>n.createContext(e));return function(r){let o=r?.[e]||t;return n.useMemo(()=>({[`__scope${e}`]:{...r,[e]:o}}),[r,o])}};return u.scopeName=e,[function(t,a){let u=n.createContext(a),i=r.length;function l(t){let{scope:r,children:a,...l}=t,s=r?.[e][i]||u,c=n.useMemo(()=>l,Object.values(l));return(0,o.jsx)(s.Provider,{value:c,children:a})}return r=[...r,a],l.displayName=t+"Provider",[l,function(r,o){let l=o?.[e][i]||u,s=n.useContext(l);if(s)return s;if(void 0!==a)return a;throw Error(`\`${r}\` must be used within \`${t}\``)}]},function(...e){let t=e[0];if(1===e.length)return t;let r=()=>{let r=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let o=r.reduce((t,{useScope:r,scopeName:n})=>{let o=r(e)[`__scope${n}`];return{...t,...o}},{});return n.useMemo(()=>({[`__scope${t.scopeName}`]:o}),[o])}};return r.scopeName=t.scopeName,r}(u,...t)]}},45170:(e,t,r)=>{r.d(t,{A:()=>u,q:()=>a});var n=r(20107),o=r(20475);function a(e,t){let r=n.createContext(t),a=e=>{let{children:t,...a}=e,u=n.useMemo(()=>a,Object.values(a));return(0,o.jsx)(r.Provider,{value:u,children:t})};return a.displayName=e+"Provider",[a,function(o){let a=n.useContext(r);if(a)return a;if(void 0!==t)return t;throw Error(`\`${o}\` must be used within \`${e}\``)}]}function u(e,t=[]){let r=[],a=()=>{let t=r.map(e=>n.createContext(e));return function(r){let o=r?.[e]||t;return n.useMemo(()=>({[`__scope${e}`]:{...r,[e]:o}}),[r,o])}};return a.scopeName=e,[function(t,a){let u=n.createContext(a),i=r.length;r=[...r,a];let l=t=>{let{scope:r,children:a,...l}=t,s=r?.[e]?.[i]||u,c=n.useMemo(()=>l,Object.values(l));return(0,o.jsx)(s.Provider,{value:c,children:a})};return l.displayName=t+"Provider",[l,function(r,o){let l=o?.[e]?.[i]||u,s=n.useContext(l);if(s)return s;if(void 0!==a)return a;throw Error(`\`${r}\` must be used within \`${t}\``)}]},function(...e){let t=e[0];if(1===e.length)return t;let r=()=>{let r=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let o=r.reduce((t,{useScope:r,scopeName:n})=>{let o=r(e)[`__scope${n}`];return{...t,...o}},{});return n.useMemo(()=>({[`__scope${t.scopeName}`]:o}),[o])}};return r.scopeName=t.scopeName,r}(a,...t)]}},76056:(e,t,r)=>{r.d(t,{jH:()=>a});var n=r(20107);r(20475);var o=n.createContext(void 0);function a(e){let t=n.useContext(o);return e||t||"ltr"}},72763:(e,t,r)=>{r.d(t,{B:()=>l});var n,o=r(20107),a=r(54122),u=(n||(n=r.t(o,2)))["useId".toString()]||(()=>void 0),i=0;function l(e){let[t,r]=o.useState(u());return(0,a.N)(()=>{e||r(e=>e??String(i++))},[e]),e||(t?`radix-${t}`:"")}},21840:(e,t,r)=>{r.d(t,{b:()=>i});var n=r(20107),o=r(34544),a=r(20475),u=n.forwardRef((e,t)=>(0,a.jsx)(o.sG.label,{...e,ref:t,onMouseDown:t=>{var r;t.target.closest("button, input, select, textarea")||(null===(r=e.onMouseDown)||void 0===r||r.call(e,t),!t.defaultPrevented&&t.detail>1&&t.preventDefault())}}));u.displayName="Label";var i=u},54245:(e,t,r)=>{r.d(t,{C:()=>u});var n=r(20107),o=r(64236),a=r(54122),u=e=>{let{present:t,children:r}=e,u=function(e){var t,r;let[o,u]=n.useState(),l=n.useRef({}),s=n.useRef(e),c=n.useRef("none"),[d,f]=(t=e?"mounted":"unmounted",r={mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}},n.useReducer((e,t)=>{let n=r[e][t];return null!=n?n:e},t));return n.useEffect(()=>{let e=i(l.current);c.current="mounted"===d?e:"none"},[d]),(0,a.N)(()=>{let t=l.current,r=s.current;if(r!==e){let n=c.current,o=i(t);e?f("MOUNT"):"none"===o||(null==t?void 0:t.display)==="none"?f("UNMOUNT"):r&&n!==o?f("ANIMATION_OUT"):f("UNMOUNT"),s.current=e}},[e,f]),(0,a.N)(()=>{if(o){var e;let t;let r=null!==(e=o.ownerDocument.defaultView)&&void 0!==e?e:window,n=e=>{let n=i(l.current).includes(e.animationName);if(e.target===o&&n&&(f("ANIMATION_END"),!s.current)){let e=o.style.animationFillMode;o.style.animationFillMode="forwards",t=r.setTimeout(()=>{"forwards"===o.style.animationFillMode&&(o.style.animationFillMode=e)})}},a=e=>{e.target===o&&(c.current=i(l.current))};return o.addEventListener("animationstart",a),o.addEventListener("animationcancel",n),o.addEventListener("animationend",n),()=>{r.clearTimeout(t),o.removeEventListener("animationstart",a),o.removeEventListener("animationcancel",n),o.removeEventListener("animationend",n)}}f("ANIMATION_END")},[o,f]),{isPresent:["mounted","unmountSuspended"].includes(d),ref:n.useCallback(e=>{e&&(l.current=getComputedStyle(e)),u(e)},[])}}(t),l="function"==typeof r?r({present:u.isPresent}):n.Children.only(r),s=(0,o.s)(u.ref,function(e){var t,r;let n=null===(t=Object.getOwnPropertyDescriptor(e.props,"ref"))||void 0===t?void 0:t.get,o=n&&"isReactWarning"in n&&n.isReactWarning;return o?e.ref:(o=(n=null===(r=Object.getOwnPropertyDescriptor(e,"ref"))||void 0===r?void 0:r.get)&&"isReactWarning"in n&&n.isReactWarning)?e.props.ref:e.props.ref||e.ref}(l));return"function"==typeof r||u.isPresent?n.cloneElement(l,{ref:s}):null};function i(e){return(null==e?void 0:e.animationName)||"none"}u.displayName="Presence"},34544:(e,t,r)=>{r.d(t,{hO:()=>l,sG:()=>i});var n=r(20107),o=r(25642),a=r(61837),u=r(20475),i=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","span","svg","ul"].reduce((e,t)=>{let r=n.forwardRef((e,r)=>{let{asChild:n,...o}=e,i=n?a.DX:t;return"undefined"!=typeof window&&(window[Symbol.for("radix-ui")]=!0),(0,u.jsx)(i,{...o,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function l(e,t){e&&o.flushSync(()=>e.dispatchEvent(t))}},71856:(e,t,r)=>{r.d(t,{RG:()=>g,bL:()=>T,q7:()=>k});var n=r(20107),o=r(94521),a=r(32474),u=r(64236),i=r(54379),l=r(72763),s=r(34544),c=r(46774),d=r(13061),f=r(76056),m=r(20475),v="rovingFocusGroup.onEntryFocus",p={bubbles:!1,cancelable:!0},y="RovingFocusGroup",[b,w,h]=(0,a.N)(y),[N,g]=(0,i.A)(y,[h]),[x,A]=N(y),R=n.forwardRef((e,t)=>(0,m.jsx)(b.Provider,{scope:e.__scopeRovingFocusGroup,children:(0,m.jsx)(b.Slot,{scope:e.__scopeRovingFocusGroup,children:(0,m.jsx)(M,{...e,ref:t})})}));R.displayName=y;var M=n.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:r,orientation:a,loop:i=!1,dir:l,currentTabStopId:y,defaultCurrentTabStopId:b,onCurrentTabStopIdChange:h,onEntryFocus:N,preventScrollOnEntryFocus:g=!1,...A}=e,R=n.useRef(null),M=(0,u.s)(t,R),C=(0,f.jH)(l),[j=null,E]=(0,d.i)({prop:y,defaultProp:b,onChange:h}),[T,k]=n.useState(!1),D=(0,c.c)(N),O=w(r),S=n.useRef(!1),[_,F]=n.useState(0);return n.useEffect(()=>{let e=R.current;if(e)return e.addEventListener(v,D),()=>e.removeEventListener(v,D)},[D]),(0,m.jsx)(x,{scope:r,orientation:a,dir:C,loop:i,currentTabStopId:j,onItemFocus:n.useCallback(e=>E(e),[E]),onItemShiftTab:n.useCallback(()=>k(!0),[]),onFocusableItemAdd:n.useCallback(()=>F(e=>e+1),[]),onFocusableItemRemove:n.useCallback(()=>F(e=>e-1),[]),children:(0,m.jsx)(s.sG.div,{tabIndex:T||0===_?-1:0,"data-orientation":a,...A,ref:M,style:{outline:"none",...e.style},onMouseDown:(0,o.m)(e.onMouseDown,()=>{S.current=!0}),onFocus:(0,o.m)(e.onFocus,e=>{let t=!S.current;if(e.target===e.currentTarget&&t&&!T){let t=new CustomEvent(v,p);if(e.currentTarget.dispatchEvent(t),!t.defaultPrevented){let e=O().filter(e=>e.focusable);I([e.find(e=>e.active),e.find(e=>e.id===j),...e].filter(Boolean).map(e=>e.ref.current),g)}}S.current=!1}),onBlur:(0,o.m)(e.onBlur,()=>k(!1))})})}),C="RovingFocusGroupItem",j=n.forwardRef((e,t)=>{let{__scopeRovingFocusGroup:r,focusable:a=!0,active:u=!1,tabStopId:i,...c}=e,d=(0,l.B)(),f=i||d,v=A(C,r),p=v.currentTabStopId===f,y=w(r),{onFocusableItemAdd:h,onFocusableItemRemove:N}=v;return n.useEffect(()=>{if(a)return h(),()=>N()},[a,h,N]),(0,m.jsx)(b.ItemSlot,{scope:r,id:f,focusable:a,active:u,children:(0,m.jsx)(s.sG.span,{tabIndex:p?0:-1,"data-orientation":v.orientation,...c,ref:t,onMouseDown:(0,o.m)(e.onMouseDown,e=>{a?v.onItemFocus(f):e.preventDefault()}),onFocus:(0,o.m)(e.onFocus,()=>v.onItemFocus(f)),onKeyDown:(0,o.m)(e.onKeyDown,e=>{if("Tab"===e.key&&e.shiftKey){v.onItemShiftTab();return}if(e.target!==e.currentTarget)return;let t=function(e,t,r){var n;let o=(n=e.key,"rtl"!==r?n:"ArrowLeft"===n?"ArrowRight":"ArrowRight"===n?"ArrowLeft":n);if(!("vertical"===t&&["ArrowLeft","ArrowRight"].includes(o))&&!("horizontal"===t&&["ArrowUp","ArrowDown"].includes(o)))return E[o]}(e,v.orientation,v.dir);if(void 0!==t){if(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;e.preventDefault();let r=y().filter(e=>e.focusable).map(e=>e.ref.current);if("last"===t)r.reverse();else if("prev"===t||"next"===t){"prev"===t&&r.reverse();let n=r.indexOf(e.currentTarget);r=v.loop?function(e,t){return e.map((r,n)=>e[(t+n)%e.length])}(r,n+1):r.slice(n+1)}setTimeout(()=>I(r))}})})})});j.displayName=C;var E={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function I(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=document.activeElement;for(let n of e)if(n===r||(n.focus({preventScroll:t}),document.activeElement!==r))return}var T=R,k=j},93677:(e,t,r)=>{r.d(t,{B8:()=>I,UC:()=>k,bL:()=>E,l9:()=>T});var n=r(20107),o=r(94521),a=r(45170),u=r(71856),i=r(54245),l=r(34544),s=r(76056),c=r(13061),d=r(72763),f=r(20475),m="Tabs",[v,p]=(0,a.A)(m,[u.RG]),y=(0,u.RG)(),[b,w]=v(m),h=n.forwardRef((e,t)=>{let{__scopeTabs:r,value:n,onValueChange:o,defaultValue:a,orientation:u="horizontal",dir:i,activationMode:m="automatic",...v}=e,p=(0,s.jH)(i),[y,w]=(0,c.i)({prop:n,onChange:o,defaultProp:a});return(0,f.jsx)(b,{scope:r,baseId:(0,d.B)(),value:y,onValueChange:w,orientation:u,dir:p,activationMode:m,children:(0,f.jsx)(l.sG.div,{dir:p,"data-orientation":u,...v,ref:t})})});h.displayName=m;var N="TabsList",g=n.forwardRef((e,t)=>{let{__scopeTabs:r,loop:n=!0,...o}=e,a=w(N,r),i=y(r);return(0,f.jsx)(u.bL,{asChild:!0,...i,orientation:a.orientation,dir:a.dir,loop:n,children:(0,f.jsx)(l.sG.div,{role:"tablist","aria-orientation":a.orientation,...o,ref:t})})});g.displayName=N;var x="TabsTrigger",A=n.forwardRef((e,t)=>{let{__scopeTabs:r,value:n,disabled:a=!1,...i}=e,s=w(x,r),c=y(r),d=C(s.baseId,n),m=j(s.baseId,n),v=n===s.value;return(0,f.jsx)(u.q7,{asChild:!0,...c,focusable:!a,active:v,children:(0,f.jsx)(l.sG.button,{type:"button",role:"tab","aria-selected":v,"aria-controls":m,"data-state":v?"active":"inactive","data-disabled":a?"":void 0,disabled:a,id:d,...i,ref:t,onMouseDown:(0,o.m)(e.onMouseDown,e=>{a||0!==e.button||!1!==e.ctrlKey?e.preventDefault():s.onValueChange(n)}),onKeyDown:(0,o.m)(e.onKeyDown,e=>{[" ","Enter"].includes(e.key)&&s.onValueChange(n)}),onFocus:(0,o.m)(e.onFocus,()=>{let e="manual"!==s.activationMode;v||a||!e||s.onValueChange(n)})})})});A.displayName=x;var R="TabsContent",M=n.forwardRef((e,t)=>{let{__scopeTabs:r,value:o,forceMount:a,children:u,...s}=e,c=w(R,r),d=C(c.baseId,o),m=j(c.baseId,o),v=o===c.value,p=n.useRef(v);return n.useEffect(()=>{let e=requestAnimationFrame(()=>p.current=!1);return()=>cancelAnimationFrame(e)},[]),(0,f.jsx)(i.C,{present:a||v,children:r=>{let{present:n}=r;return(0,f.jsx)(l.sG.div,{"data-state":v?"active":"inactive","data-orientation":c.orientation,role:"tabpanel","aria-labelledby":d,hidden:!n,id:m,tabIndex:0,...s,ref:t,style:{...e.style,animationDuration:p.current?"0s":void 0},children:n&&u})}})});function C(e,t){return"".concat(e,"-trigger-").concat(t)}function j(e,t){return"".concat(e,"-content-").concat(t)}M.displayName=R;var E=h,I=g,T=A,k=M},46774:(e,t,r)=>{r.d(t,{c:()=>o});var n=r(20107);function o(e){let t=n.useRef(e);return n.useEffect(()=>{t.current=e}),n.useMemo(()=>(...e)=>t.current?.(...e),[])}},13061:(e,t,r)=>{r.d(t,{i:()=>a});var n=r(20107),o=r(46774);function a({prop:e,defaultProp:t,onChange:r=()=>{}}){let[a,u]=function({defaultProp:e,onChange:t}){let r=n.useState(e),[a]=r,u=n.useRef(a),i=(0,o.c)(t);return n.useEffect(()=>{u.current!==a&&(i(a),u.current=a)},[a,u,i]),r}({defaultProp:t,onChange:r}),i=void 0!==e,l=i?e:a,s=(0,o.c)(r);return[l,n.useCallback(t=>{if(i){let r="function"==typeof t?t(e):t;r!==e&&s(r)}else u(t)},[i,e,u,s])]}},54122:(e,t,r)=>{r.d(t,{N:()=>o});var n=r(20107),o=globalThis?.document?n.useLayoutEffect:()=>{}},29395:(e,t,r)=>{r.d(t,{F:()=>a});let n=e=>"boolean"==typeof e?"".concat(e):0===e?"0":e,o=function(){for(var e,t,r=0,n="";rr=>{var a;if((null==t?void 0:t.variants)==null)return o(e,null==r?void 0:r.class,null==r?void 0:r.className);let{variants:u,defaultVariants:i}=t,l=Object.keys(u).map(e=>{let t=null==r?void 0:r[e],o=null==i?void 0:i[e];if(null===t)return null;let a=n(t)||n(o);return u[e][a]}),s=r&&Object.entries(r).reduce((e,t)=>{let[r,n]=t;return void 0===n||(e[r]=n),e},{});return o(e,l,null==t?void 0:null===(a=t.compoundVariants)||void 0===a?void 0:a.reduce((e,t)=>{let{class:r,className:n,...o}=t;return Object.entries(o).every(e=>{let[t,r]=e;return Array.isArray(r)?r.includes({...i,...s}[t]):({...i,...s})[t]===r})?[...e,r,n]:e},[]),null==r?void 0:r.class,null==r?void 0:r.className)}}}]); \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/cell-scanner/page-2c4956be7a457748.js b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/cell-scanner/page-2c4956be7a457748.js new file mode 100644 index 0000000..9d2953b --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/cell-scanner/page-2c4956be7a457748.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5014],{41126:(e,s,a)=>{Promise.resolve().then(a.bind(a,88388))},88388:(e,s,a)=>{"use strict";a.r(s),a.d(s,{default:()=>L});var t=a(20475),r=a(20107),n=a(72167),l=a(51303),c=a(85014),i=a(42541),d=a(33466),o=a(22250);let u=r.forwardRef((e,s)=>{let{className:a,value:r,...n}=e;return(0,t.jsx)(d.bL,{ref:s,className:(0,o.cn)("relative h-2 w-full overflow-hidden rounded-full bg-primary/20",a),...n,children:(0,t.jsx)(d.C1,{className:"h-full w-full flex-1 bg-primary transition-all",style:{transform:"translateX(-".concat(100-(r||0),"%)")}})})});u.displayName=d.bL.displayName;var m=a(59166),x=a(27720),f=a(91994),p=a(76076),h=a(51873),g=a(45934),j=a(38741),v=a(36824),b=a(32857);let N=e=>{let{neighborCells:s}=e;(0,r.useEffect)(()=>{s&&console.log("Neighbor cells data:",s)},[s]);let a=e=>e?Array.from(e.matchAll(/\+QENG: "neighbourcell (intra|inter)","LTE",(\d+),(\d+),(-?\d+),(-?\d+)/g)).map(e=>({type:"LTE",cellType:e[1],frequency:parseInt(e[2]),pci:parseInt(e[3]),rsrq:parseInt(e[4]),rsrp:parseInt(e[5])})):[],n=e=>e?Array.from(e.matchAll(/\+QNWCFG: "nr5g_meas_info",(\d+),(\d+),(\d+),(-?\d+),(-?\d+)/g)).map(e=>({type:"NR5G-NSA",cellType:"nr5g",frequency:parseInt(e[2]),pci:parseInt(e[3]),rsrp:parseInt(e[4]),rsrq:parseInt(e[5])})):[],i=e=>e>=-65?(0,t.jsx)(j.z_q,{className:"text-xl text-green-500"}):e>=-75?(0,t.jsx)(j.sRp,{className:"text-xl text-green-400"}):e>=-85?(0,t.jsx)(j.ztD,{className:"text-xl text-yellow-500"}):e>=-95?(0,t.jsx)(j.G7Q,{className:"text-xl text-yellow-600"}):(0,t.jsx)(j.NJ4,{className:"text-xl text-red-500"}),d=[];if((null==s?void 0:s.status)==="success"){var o,u,m,x;(null===(o=s.data)||void 0===o?void 0:o.neighborCells)?d=[...d,...a(s.data.neighborCells)]:(null===(u=s.raw_data)||void 0===u?void 0:u.neighborCells)&&(d=[...d,...a(s.raw_data.neighborCells)]),(null===(m=s.data)||void 0===m?void 0:m.meas)?d=[...d,...n(s.data.meas)]:(null===(x=s.raw_data)||void 0===x?void 0:x.meas)&&(d=[...d,...n(s.raw_data.meas)])}return(d.sort((e,s)=>e.type.startsWith("NR5G")&&!s.type.startsWith("NR5G")?-1:!e.type.startsWith("NR5G")&&s.type.startsWith("NR5G")?1:s.rsrp-e.rsrp),s&&0!==d.length)?(0,t.jsx)("div",{className:"space-y-4",children:(0,t.jsxs)(l.XI,{children:[(0,t.jsx)(l.A0,{children:(0,t.jsxs)(l.Hj,{children:[(0,t.jsx)(l.nd,{children:"Type"}),(0,t.jsx)(l.nd,{children:"Cell Type"}),(0,t.jsx)(l.nd,{children:"Frequency"}),(0,t.jsx)(l.nd,{children:"PCI"}),(0,t.jsx)(l.nd,{children:"Signal"})]})}),(0,t.jsx)(l.BF,{children:d.map((e,s)=>(0,t.jsxs)(l.Hj,{children:[(0,t.jsx)(l.nA,{className:"font-medium",children:e.type}),(0,t.jsx)(l.nA,{children:e.cellType}),(0,t.jsx)(l.nA,{children:e.frequency}),(0,t.jsx)(l.nA,{children:e.pci}),(0,t.jsx)(l.nA,{children:(0,t.jsx)(c.TooltipProvider,{children:(0,t.jsxs)(c.m_,{children:[(0,t.jsx)(c.k$,{children:i(e.rsrp)}),(0,t.jsx)(c.ZI,{children:(0,t.jsxs)("div",{className:"grid gap-1",children:[(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-1",children:["RSRP ",(0,t.jsxs)("span",{className:"font-medium",children:[e.rsrp," dBm"]})]}),(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-1",children:["RSRQ ",(0,t.jsxs)("span",{className:"font-medium",children:[e.rsrq," dB"]})]})]})})]})})})]},"".concat(e.type,"-").concat(e.frequency,"-").concat(e.pci,"-").concat(s)))})]})}):(0,t.jsx)("div",{className:"text-center py-4 text-gray-500",children:"No neighbor cells data available"})};var y=a(7197);let w={6:"1.4 MHz",15:"3 MHz",25:"5 MHz",50:"10 MHz",75:"15 MHz",100:"20 MHz","-":"-"};var T=a(37921),R=a(28702);let C=R.bL,I=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)(R.q7,{ref:s,className:(0,o.cn)("border-b",a),...r})});I.displayName="AccordionItem";let S=r.forwardRef((e,s)=>{let{className:a,children:r,...n}=e;return(0,t.jsx)(R.Y9,{className:"flex",children:(0,t.jsxs)(R.l9,{ref:s,className:(0,o.cn)("flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline text-left [&[data-state=open]>svg]:rotate-180",a),...n,children:[r,(0,t.jsx)(y.D3D,{className:"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200"})]})})});S.displayName=R.l9.displayName;let k=r.forwardRef((e,s)=>{let{className:a,children:r,...n}=e;return(0,t.jsx)(R.UC,{ref:s,className:"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",...n,children:(0,t.jsx)("div",{className:(0,o.cn)("pb-4 pt-0",a),children:r})})});k.displayName=R.UC.displayName;let F=e=>{var s,a,r,l,c,i;let{cell:d,operatorInfo:o}=e,u="LTE"===d.type;return(0,t.jsxs)(n.Zp,{className:"overflow-hidden border shadow-sm",children:[(0,t.jsxs)(n.aR,{className:"bg-muted/30 pb-2",children:[(0,t.jsx)("div",{className:"flex justify-between items-center",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsxs)(g.E,{variant:u?"outline":"default",className:u?"bg-blue-600":"",children:[u?"LTE":"5G NR"," - ",(null==o?void 0:o.brand)&&o.operator?"".concat(o.brand):(null==o?void 0:o.operator)?o.operator:"".concat(d.mcc).concat(d.mnc)]}),(0,t.jsx)(n.ZB,{className:"text-base",children:u?"Band ".concat(d.band," (").concat((null===(s=d.frequencyInfo)||void 0===s?void 0:s.bandName)||"Unknown",")"):"n".concat(d.band," (").concat((null===(a=d.frequencyInfo)||void 0===a?void 0:a.bandName)||"Unknown",")")})]})}),(0,t.jsxs)(n.BT,{className:"mt-1 flex items-center space-x-2",children:[(0,t.jsx)("span",{children:d.cellId}),(0,t.jsx)("span",{children:"•"}),(0,t.jsx)("span",{children:d.pci}),(0,t.jsx)("span",{children:"•"}),(0,t.jsx)("span",{children:d.freq}),(0,t.jsx)("span",{children:"•"}),(0,t.jsxs)("span",{children:["RSRP: ",d.rsrp," dBm"]})]})]}),(0,t.jsxs)(n.Wu,{className:"pt-4",children:[(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-2",children:[(0,t.jsx)("div",{className:"space-y-3",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"text-sm font-semibold mb-1",children:"Frequency Information"}),(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-y-1 text-sm",children:[(0,t.jsx)("div",{className:"text-muted-foreground",children:"Downlink Frequency:"}),(0,t.jsxs)("div",{className:"font-medium",children:[(null===(r=d.frequencyInfo)||void 0===r?void 0:r.dlFrequency)||"Unknown"," MHz"]}),(0,t.jsx)("div",{className:"text-muted-foreground",children:"Uplink Frequency:"}),(0,t.jsxs)("div",{className:"font-medium",children:[(null===(l=d.frequencyInfo)||void 0===l?void 0:l.ulFrequency)||"Unknown"," MHz"]}),(0,t.jsx)("div",{className:"text-muted-foreground",children:"Duplex Mode:"}),(0,t.jsx)("div",{className:"font-medium",children:(null===(c=d.frequencyInfo)||void 0===c?void 0:c.duplexType)||"Unknown"}),u&&(null===(i=d.frequencyInfo)||void 0===i?void 0:i.ulEarfcn)&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"text-muted-foreground",children:"Uplink EARFCN:"}),(0,t.jsx)("div",{className:"font-medium",children:d.frequencyInfo.ulEarfcn})]})]})]})}),(0,t.jsx)("div",{className:"space-y-3",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"text-sm font-semibold mb-1",children:"Signal Parameters"}),(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-y-1 text-sm",children:[(0,t.jsx)("div",{className:"text-muted-foreground",children:"RSRP:"}),(0,t.jsxs)("div",{className:"font-medium",children:[d.rsrp," dBm"]}),(0,t.jsx)("div",{className:"text-muted-foreground",children:"RSRQ:"}),(0,t.jsxs)("div",{className:"font-medium",children:[d.rsrq," dB"]}),u?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"text-muted-foreground",children:"SQUAL:"}),(0,t.jsx)("div",{className:"font-medium",children:d.squal}),(0,t.jsx)("div",{className:"text-muted-foreground",children:"Bandwidth:"}),(0,t.jsx)("div",{className:"font-medium",children:d.bandwidthMHz||"".concat(d.bandwidth," RB")})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"text-muted-foreground",children:"Subcarrier Spacing:"}),(0,t.jsxs)("div",{className:"font-medium",children:[d.scs," kHz"]}),(0,t.jsx)("div",{className:"text-muted-foreground",children:"Carrier Bandwidth:"}),(0,t.jsxs)("div",{className:"font-medium",children:[d.carrierBandwidth," RB"]}),(0,t.jsx)("div",{className:"text-muted-foreground",children:"SSB SCS:"}),(0,t.jsxs)("div",{className:"font-medium",children:[d.ssbScs," kHz"]})]})]})]})})]}),(0,t.jsx)(C,{type:"single",collapsible:!0,className:"mt-4",children:(0,t.jsxs)(I,{value:"advanced",children:[(0,t.jsx)(S,{className:"text-sm py-2",children:"Advanced Details"}),(0,t.jsx)(k,{children:o&&(0,t.jsx)("div",{children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-y-1 text-sm",children:[(0,t.jsx)("div",{className:"text-muted-foreground",children:"SRXLEV:"}),(0,t.jsx)("div",{className:"font-medium",children:d.srxlev}),(0,t.jsx)("div",{className:"text-muted-foreground",children:"Operator:"}),(0,t.jsx)("div",{className:"font-medium",children:o.operator}),(0,t.jsx)("div",{className:"text-muted-foreground",children:"Brand:"}),(0,t.jsx)("div",{className:"font-medium",children:o.brand}),(0,t.jsx)("div",{className:"text-muted-foreground",children:"Country:"}),(0,t.jsx)("div",{className:"font-medium",children:o.countryName}),(0,t.jsx)("div",{className:"text-muted-foreground",children:"MCC-MNC:"}),(0,t.jsxs)("div",{className:"font-medium",children:[o.mcc,"-",o.mnc]})]})})})]})})]})]})},D=e=>{let{scanResult:s,isLoading:a=!1,mccMncList:l=[]}=e,[c,i]=(0,r.useState)("all"),d=(0,r.useCallback)((e,s)=>l.find(a=>a.mcc===e&&a.mnc===s)||null,[l]),o=[{band:1,name:"2100",dlLow:2110,dlHigh:2170,ulLow:1920,ulHigh:1980,earfcnOffset:0,earfcnRange:[0,599],spacing:.1,duplexType:"FDD"},{band:2,name:"1900 PCS",dlLow:1930,dlHigh:1990,ulLow:1850,ulHigh:1910,earfcnOffset:600,earfcnRange:[600,1199],spacing:.1,duplexType:"FDD"},{band:3,name:"1800",dlLow:1805,dlHigh:1880,ulLow:1710,ulHigh:1785,earfcnOffset:1200,earfcnRange:[1200,1949],spacing:.1,duplexType:"FDD"},{band:5,name:"850",dlLow:869,dlHigh:894,ulLow:824,ulHigh:849,earfcnOffset:2400,earfcnRange:[2400,2649],spacing:.1,duplexType:"FDD"},{band:7,name:"2600",dlLow:2620,dlHigh:2690,ulLow:2500,ulHigh:2570,earfcnOffset:2750,earfcnRange:[2750,3449],spacing:.1,duplexType:"FDD"},{band:8,name:"900",dlLow:925,dlHigh:960,ulLow:880,ulHigh:915,earfcnOffset:3450,earfcnRange:[3450,3799],spacing:.1,duplexType:"FDD"},{band:20,name:"800 DD",dlLow:791,dlHigh:821,ulLow:832,ulHigh:862,earfcnOffset:6150,earfcnRange:[6150,6449],spacing:.1,duplexType:"FDD"},{band:28,name:"700 APT",dlLow:758,dlHigh:803,ulLow:703,ulHigh:748,earfcnOffset:9210,earfcnRange:[9210,9659],spacing:.1,duplexType:"FDD"},{band:41,name:"TD 2500",dlLow:2496,dlHigh:2690,ulLow:2496,ulHigh:2690,earfcnOffset:39650,earfcnRange:[39650,41589],spacing:.1,duplexType:"TDD"}],u=[{band:1,name:"2100",dlLow:2110,dlHigh:2170,ulLow:1920,ulHigh:1980,nrarfcnOffset:422e3,nrarfcnRange:[422e3,434e3],duplexType:"FDD"},{band:3,name:"1800",dlLow:1805,dlHigh:1880,ulLow:1710,ulHigh:1785,nrarfcnOffset:361e3,nrarfcnRange:[361e3,376e3],duplexType:"FDD"},{band:7,name:"2600",dlLow:2620,dlHigh:2690,ulLow:2500,ulHigh:2570,nrarfcnOffset:524e3,nrarfcnRange:[524e3,538e3],duplexType:"FDD"},{band:20,name:"800 DD",dlLow:791,dlHigh:821,ulLow:832,ulHigh:862,nrarfcnOffset:158200,nrarfcnRange:[158200,164200],duplexType:"FDD"},{band:28,name:"700 APT",dlLow:758,dlHigh:803,ulLow:703,ulHigh:748,nrarfcnOffset:151600,nrarfcnRange:[151600,160600],duplexType:"FDD"},{band:41,name:"TD 2500",dlLow:2496,dlHigh:2690,ulLow:2496,ulHigh:2690,nrarfcnOffset:499200,nrarfcnRange:[499200,537999],duplexType:"TDD"},{band:77,name:"C-Band",dlLow:3300,dlHigh:4200,ulLow:3300,ulHigh:4200,nrarfcnOffset:62e4,nrarfcnRange:[62e4,68e4],duplexType:"TDD"},{band:78,name:"C-Band (3.5GHz)",dlLow:3300,dlHigh:3800,ulLow:3300,ulHigh:3800,nrarfcnOffset:62e4,nrarfcnRange:[62e4,653333],duplexType:"TDD"}],x=(0,r.useCallback)(e=>e?e.split("\n").filter(e=>e.trim().startsWith("+QSCAN:")).map(e=>{let[s,a,t,r,n,l,c,i,...d]=e.substring(e.indexOf(":")+1).trim().split(",").map(e=>e.trim().replace(/\\"/g,"").replace(/"/g,"").replace(/\r/g,"")),o={type:s=s.replace(/\\\\/g,"").replace(/\\/g,"").replace(/"/g,"").trim(),mcc:a,mnc:t,freq:parseInt(r),pci:parseInt(n),rsrp:parseInt(l),rsrq:parseInt(c),srxlev:"-"===i?0:parseInt(i),cellId:"",tac:"",band:0};if("LTE"===s){let[e,s,a,t,r]=d;return{...o,type:"LTE",squal:"-"===e?0:parseInt(e),cellId:s,tac:a,bandwidth:parseInt(t),band:parseInt(r)}}if("NR5G"===s){let[e,s,a,t,r,n,l,c]=d;return{...o,type:"NR5G",cellId:e,tac:s,scs:parseInt(a),carrierBandwidth:parseInt(t),band:parseInt(r),offsetToPointA:parseInt(n),ssbSubcarrierOffset:parseInt(l),ssbScs:parseInt(c)}}return null}).filter(e=>null!==e):[],[]),f=(0,r.useCallback)(e=>{let s,a;let t=e.freq,r=o.find(s=>t>=s.earfcnRange[0]&&t<=s.earfcnRange[1]&&s.band===e.band);if(!r){let s,a;let r=o.find(s=>s.band===e.band);if(!r)return null;let n=r.dlLow+(t-r.earfcnOffset)%1e3*r.spacing;if("FDD"===r.duplexType){s=t+18e3;let e=r.ulHigh-r.ulLow;a=(r.ulLow+e/2).toFixed(2)}else a=n.toFixed(2);return{band:r.band,bandName:r.name,earfcn:t,dlFrequency:n.toFixed(2),ulFrequency:a,ulEarfcn:s,duplexType:r.duplexType,bandwidth:e.bandwidthMHz}}let n=r.dlLow+(t-r.earfcnOffset)*r.spacing;if("FDD"===r.duplexType){let e=t-r.earfcnOffset;s=t+18e3,a=r.ulLow+e*r.spacing}else a=n;return{band:r.band,bandName:r.name,earfcn:t,dlFrequency:n.toFixed(2),ulFrequency:a.toFixed(2),ulEarfcn:s,duplexType:r.duplexType,bandwidth:e.bandwidthMHz}},[o]),p=(0,r.useCallback)(e=>{let s;let a=e.freq;if(a>=0&&a<=599999)s=0+(a-0)*.005;else if(a>=6e5&&a<=2016666)s=3e3+(a-6e5)*.015;else{if(!(a>=2016667)||!(a<=3279165))return null;s=24250.08+(a-2016667)*.06}let t=u.find(s=>a>=s.nrarfcnRange[0]&&a<=s.nrarfcnRange[1]&&s.band===e.band);if(!t){let t=u.find(s=>s.band===e.band);return t?{band:t.band,bandName:t.name,nrarfcn:a,dlFrequency:s.toFixed(2),ulFrequency:"FDD"===t.duplexType?((t.ulLow+t.ulHigh)/2).toFixed(2):s.toFixed(2),duplexType:t.duplexType,scs:e.scs,channelBandwidth:"".concat(e.carrierBandwidth," RB")}:null}let r="FDD"===t.duplexType?t.ulLow+(s-t.dlLow):s;return{band:t.band,bandName:t.name,nrarfcn:a,dlFrequency:s.toFixed(2),ulFrequency:r.toFixed(2),duplexType:t.duplexType,scs:e.scs,channelBandwidth:"".concat(e.carrierBandwidth," RB")}},[u]),h=(0,r.useMemo)(()=>{if(!(null==s?void 0:s.output))return{lte:[],nr5g:[]};let e=x(s.output),a=[],t=[];e.forEach(e=>{var s,r;let n=d(e.mcc,e.mnc);if("LTE"===e.type){let t=null!==(s=f(e))&&void 0!==s?s:void 0;a.push({...e,frequencyInfo:t,operatorInfo:n})}else if("NR5G"===e.type){let s=null!==(r=p(e))&&void 0!==r?r:void 0;t.push({...e,frequencyInfo:s,operatorInfo:n})}});let r=(e,s)=>{var a,t;let r=(null===(a=e.operatorInfo)||void 0===a?void 0:a.operator)||"",n=(null===(t=s.operatorInfo)||void 0===t?void 0:t.operator)||"";return r.localeCompare(n)};return{lte:a.sort(r),nr5g:t.sort(r)}},[s,x,f,p,d]);if(a)return(0,t.jsxs)(n.Zp,{children:[(0,t.jsxs)(n.aR,{children:[(0,t.jsx)(n.ZB,{children:"Cell Frequency Analysis"}),(0,t.jsx)(n.BT,{children:"Analyzing frequency details for detected cells..."})]}),(0,t.jsx)(n.Wu,{className:"flex items-center justify-center min-h-[300px]",children:(0,t.jsxs)("div",{className:"flex flex-col items-center space-y-4",children:[(0,t.jsx)(m.A,{className:"w-8 h-8 animate-spin text-primary"}),(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"Processing frequency information..."})]})})]});if(!s||!s.output)return(0,t.jsxs)(n.Zp,{children:[(0,t.jsxs)(n.aR,{children:[(0,t.jsx)(n.ZB,{children:"Cell Frequency Analysis"}),(0,t.jsx)(n.BT,{children:"Detailed frequency information for detected cells"})]}),(0,t.jsx)(n.Wu,{className:"flex items-center justify-center min-h-[300px]",children:(0,t.jsx)("p",{className:"text-muted-foreground",children:"Run a cell scan to view detailed frequency information"})})]});let g=h.lte.length+h.nr5g.length;return(0,t.jsxs)(n.Zp,{children:[(0,t.jsxs)(n.aR,{children:[(0,t.jsx)(n.ZB,{children:"Cell Frequency Analysis"}),(0,t.jsx)(n.BT,{children:s.timestamp&&(0,t.jsxs)("div",{className:"mt-1 text-sm text-muted-foreground",children:["Analysis based on full cell scan from: ",s.timestamp]})})]}),(0,t.jsx)(n.Wu,{children:(0,t.jsxs)(T.tU,{defaultValue:"all",value:c,onValueChange:e=>i(e),className:"mb-6",children:[(0,t.jsxs)(T.j7,{className:"grid w-full grid-cols-3",children:[(0,t.jsxs)(T.Xi,{value:"all",children:["All Cells (",g,")"]}),(0,t.jsxs)(T.Xi,{value:"lte",children:["LTE (",h.lte.length,")"]}),(0,t.jsxs)(T.Xi,{value:"nr5g",children:["5G NR (",h.nr5g.length,")"]})]}),(0,t.jsx)(T.av,{value:"all",className:"mt-4",children:(0,t.jsx)(v.F,{className:"h-[500px] pr-4",children:0===g?(0,t.jsx)("div",{className:"text-center py-8 text-muted-foreground",children:"No cells detected in the scan"}):(0,t.jsxs)("div",{className:"grid grid-cols-1 gap-4",children:[h.lte.map((e,s)=>(0,t.jsx)(F,{cell:e,operatorInfo:e.operatorInfo},"lte-".concat(e.cellId,"-").concat(s))),h.nr5g.map((e,s)=>(0,t.jsx)(F,{cell:e,operatorInfo:e.operatorInfo},"nr5g-".concat(e.cellId,"-").concat(s)))]})})}),(0,t.jsx)(T.av,{value:"lte",className:"mt-4",children:(0,t.jsx)(v.F,{className:"h-[500px] pr-4",children:0===h.lte.length?(0,t.jsx)("div",{className:"text-center py-8 text-muted-foreground",children:"No LTE cells detected in the scan"}):(0,t.jsx)("div",{className:"grid grid-cols-1 gap-4",children:h.lte.map((e,s)=>(0,t.jsx)(F,{cell:e,operatorInfo:e.operatorInfo},"lte-".concat(e.cellId,"-").concat(s)))})})}),(0,t.jsx)(T.av,{value:"nr5g",className:"mt-4",children:(0,t.jsx)(v.F,{className:"h-[500px] pr-4",children:0===h.nr5g.length?(0,t.jsx)("div",{className:"text-center py-8 text-muted-foreground",children:"No 5G NR cells detected in the scan"}):(0,t.jsx)("div",{className:"grid grid-cols-1 gap-4",children:h.nr5g.map((e,s)=>(0,t.jsx)(F,{cell:e,operatorInfo:e.operatorInfo},"nr5g-".concat(e.cellId,"-").concat(s)))})})})]})}),(0,t.jsx)(n.wL,{className:"border-t p-4 flex justify-between",children:(0,t.jsx)("div",{className:"text-xs text-muted-foreground",children:"Frequency calculation based on 3GPP TS 38.104 and TS 36.101 specifications"})})]})},L=()=>{let{toast:e}=(0,b.dj)(),[s,a]=(0,r.useState)(null),[d,o]=(0,r.useState)(null),[T,R]=(0,r.useState)(0),[C,I]=(0,r.useState)(!1),[S,k]=(0,r.useState)(null),[F,L]=(0,r.useState)([]),[A,q]=(0,r.useState)(null),[H,E]=(0,r.useState)({status:"idle",progress:0,message:""}),[B,_]=(0,r.useState)(0);(0,r.useEffect)(()=>{if(!d){R(0);return}let e=()=>{let s=new Date(d).getTime(),a=Math.max(0,6e4-(new Date().getTime()-s));R(a),a>0&&requestAnimationFrame(e)};e()},[d]);let O=(0,r.useCallback)(async()=>{try{let e=await fetch("/cgi-bin/quecmanager/experimental/cell_scanner/fetch_mccmnc.sh"),s=await e.json();L(s)}catch(s){console.error("Failed to fetch MCC-MNC list:",s),e({title:"Warning",description:"Failed to load operator information",variant:"destructive"})}},[]);(0,r.useEffect)(()=>{O()},[O]);let M=(0,r.useCallback)(async()=>{try{let e=await fetch("/cgi-bin/quecmanager/experimental/quecwatch/fetch-quecwatch.sh"),s=await e.json();k(s)}catch(s){console.error("Failed to fetch Quecwatch status:",s),e({title:"Error",description:"Failed to check Quecwatch status",variant:"destructive"})}},[]),P=(0,r.useCallback)((e,s)=>F.find(a=>a.mcc===e&&a.mnc===s)||null,[F]),z=(0,r.useCallback)(e=>e?e.split("\n").filter(e=>e.trim().startsWith("+QSCAN:")).map(e=>{let[s,a,t,r,n,l,c,i,...d]=e.substring(e.indexOf(":")+1).trim().split(",").map(e=>e.trim().replace(/\\"/g,"").replace(/"/g,"").replace(/\r/g,"")),o={type:s=s.replace(/\\\\/g,"").replace(/\\/g,"").replace(/"/g,"").trim(),mcc:a,mnc:t,freq:parseInt(r),pci:parseInt(n),rsrp:parseInt(l),rsrq:parseInt(c),srxlev:"-"===i?0:parseInt(i),cellId:"",tac:""};if("LTE"===s){let[e,s,a,t,r]=d,n=parseInt(t),l=w[n.toString()]||"".concat(n," RB");return{...o,type:"LTE",squal:"-"===e?0:parseInt(e),cellId:s,tac:a,bandwidth:n,bandwidthMHz:l,band:parseInt(r)}}if("NR5G"===s){let[e,s,a,t,r,n,l,c]=d;return{...o,type:"NR5G",cellId:e,tac:s,scs:parseInt(a),carrierBandwidth:parseInt(t),band:parseInt(r),offsetToPointA:parseInt(n),ssbSubcarrierOffset:parseInt(l),ssbScs:parseInt(c)}}return null}).filter(e=>null!==e):[],[]),G=(0,r.useCallback)(async()=>{try{let e=await fetch("/cgi-bin/quecmanager/experimental/cell_scanner/check_scan.sh",{headers:{"Cache-Control":"no-cache, no-store"}});if(!e.ok)return;let s=await e.json();"success"===s.status&&s.output?(a(s),o(s.timestamp||null)):"running"===s.status&&(E({status:"scanning",progress:50,message:"Scan in progress...",startTime:Date.now()-6e4}),Z(),setTimeout(U,2e3))}catch(e){console.error("Failed to check initial scan results",e)}},[]),U=(0,r.useCallback)(async()=>{if(B>60){console.log("Reached maximum polling attempts, waiting for results to appear");return}try{let e=await fetch("/cgi-bin/quecmanager/experimental/cell_scanner/check_scan.sh",{headers:{"Cache-Control":"no-cache, no-store"}});if(!e.ok)throw Error("HTTP error! status: ".concat(e.status));let s=await e.json();if("success"===s.status&&s.output){a(s),o(s.timestamp||null),E({status:"idle",progress:100,message:""}),_(0);return}if("running"===s.status){_(e=>e+1),setTimeout(U,2e3);return}B<30&&(_(e=>e+1),setTimeout(U,2e3))}catch(e){console.error("Failed to check scan status",e),B<60&&(_(e=>e+1),setTimeout(U,3e3))}},[B]),Z=(0,r.useCallback)(()=>{let e;e=setInterval(()=>{E(s=>{if("scanning"!==s.status)return clearInterval(e),s;let a=10+88*Math.min((Date.now()-(s.startTime||Date.now()))/12e4,1),t="Scanning available networks... This may take a minute";return a>85?t="Finalizing scan results...":a>50&&(t="Collecting operator data..."),{...s,progress:Math.min(a,98),message:t}})},1e3),setTimeout(()=>{clearInterval(e),E(e=>"scanning"===e.status?{...e,progress:98,message:"Waiting for results..."}:e)},15e4)},[]),W=(0,r.useCallback)(async()=>{if("scanning"!==H.status&&!C){I(!0),a(null),o(null),_(0),E({status:"scanning",progress:0,message:"Initiating scan...",startTime:Date.now()});try{let e=await fetch("/cgi-bin/quecmanager/experimental/cell_scanner/cell_scan.sh",{headers:{"Cache-Control":"no-cache, no-store"}});if(!e.ok)throw Error("HTTP error! status: ".concat(e.status));let s=await e.json();if("running"===s.status||"success"===s.status)E(e=>({...e,progress:10,message:"Scan in progress..."})),Z(),setTimeout(U,2e3);else throw Error(s.message||"Failed to start scan")}catch(s){console.error("Scan error:",s),e({title:"Error",description:s instanceof Error?s.message:"Failed to start cell scan",variant:"destructive"}),E({status:"idle",progress:0,message:""})}finally{I(!1)}}},[H.status,C,U,Z]),$=(0,r.useCallback)(e=>e.reduce((e,s)=>{let a="".concat(s.mcc).concat(s.mnc);if(!e[a]){let t=P(s.mcc,s.mnc);e[a]={cells:[],operatorInfo:t}}return e[a].cells.push(s),e},{}),[P]),Q=(0,r.useCallback)(e=>[...e].sort((e,s)=>e.type!==s.type?"LTE"===e.type?-1:1:s.rsrp-e.rsrp),[]),X=(0,r.useCallback)(e=>e>=-65?(0,t.jsx)(j.z_q,{className:"text-xl text-green-500"}):e>=-75?(0,t.jsx)(j.sRp,{className:"text-xl text-green-400"}):e>=-85?(0,t.jsx)(j.ztD,{className:"text-xl text-yellow-500"}):e>=-95?(0,t.jsx)(j.G7Q,{className:"text-xl text-yellow-600"}):(0,t.jsx)(j.NJ4,{className:"text-xl text-red-500"}),[]);(0,r.useEffect)(()=>{G(),M()},[G,M]);let V=(0,r.useCallback)(()=>{a(null),o(null),E({status:"idle",progress:0,message:""})},[]),J=(0,r.useCallback)(()=>{if(!(null==s?void 0:s.output))return;let e=new Blob([["Type,MCC,MNC,Frequency,PCI,RSRP,RSRQ,Band,Cell ID,TAC",...z(s.output).map(e=>"".concat(e.type,",").concat(e.mcc,",").concat(e.mnc,",").concat(e.freq,",").concat(e.pci,",").concat(e.rsrp,",").concat(e.rsrq,",").concat(e.band,",").concat(e.cellId,",").concat(e.tac))].join("\n")],{type:"text/csv;charset=utf-8;"}),a=document.createElement("a");a.href=URL.createObjectURL(e),a.setAttribute("download","cell_scan_".concat(new Date().toISOString(),".csv")),document.body.appendChild(a),a.click(),document.body.removeChild(a)},[s,z]),K=(0,r.useCallback)((e,s,a)=>a?"".concat(e).concat(s," - ").concat(a.brand," by ").concat(a.operator):"".concat(e).concat(s),[]),Y=(null==s?void 0:s.status)==="success"&&s.output?$(z(s.output)):{},ee=(0,r.useCallback)(async()=>{if(!C){I(!0),q(null);try{let e=await fetch("/cgi-bin/quecmanager/experimental/cell_scanner/network_info.sh");if(!e.ok)throw Error("HTTP error! status: ".concat(e.status));let t=await e.json();if(console.log("Neighbor cell data:",t),"success"===t.status&&t.mode){var s,a;(null===(s=t.data)||void 0===s?void 0:s.neighborCells)||(null===(a=t.data)||void 0===a?void 0:a.meas)?q(t):t.raw_data&&q({status:t.status,timestamp:t.timestamp,mode:t.mode,data:{neighborCells:t.raw_data.neighborCells,meas:t.raw_data.meas}})}else q(t)}catch(s){console.error("Failed to fetch neighbor cells",s),e({title:"Error",description:"Failed to scan neighbor cells. Please try again.",variant:"destructive"})}finally{I(!1)}}},[C]),es=(0,r.useCallback)(()=>{q(null)},[]);return(0,t.jsxs)("div",{className:"grid gap-5",children:[(0,t.jsxs)(n.Zp,{children:[(0,t.jsxs)(n.aR,{children:[(0,t.jsx)(n.ZB,{children:"Full Network Cell Scan"}),(0,t.jsxs)(n.BT,{children:["Scan all available network cells, including those from other network providers. Current network mode will affect the results and you may be disconnected during the scan.",d&&(0,t.jsxs)("div",{className:"mt-1 text-sm text-muted-foreground",children:["Last scan: ",d]})]})]}),(0,t.jsx)(n.Wu,{children:(0,t.jsxs)(v.F,{className:"h-96",children:[!s&&"idle"===H.status&&(0,t.jsx)("div",{className:"flex items-center justify-center h-full",children:(0,t.jsx)("p",{className:"text-gray-500 text-center",children:"Click the button below to start scanning the network..."})}),"scanning"===H.status&&(0,t.jsxs)("div",{className:"flex flex-col space-y-2 items-center justify-center h-full w-full",children:[(0,t.jsx)(u,{value:H.progress,className:"w-full"}),(0,t.jsx)("div",{className:"flex items-center justify-center",children:(0,t.jsx)("p",{className:"text-sm text-gray-500 text-center",children:H.message})})]}),(0,t.jsx)("div",{className:"grid gap-4",children:Object.entries(Y).map(e=>{let[s,{cells:a,operatorInfo:r}]=e;return(0,t.jsxs)(n.Zp,{className:"p-4 grid gap-2",children:[(0,t.jsx)("div",{children:(0,t.jsx)(g.E,{children:K(a[0].mcc,a[0].mnc,r)})}),(0,t.jsxs)(l.XI,{children:[(0,t.jsx)(l.A0,{children:(0,t.jsxs)(l.Hj,{children:[(0,t.jsx)(l.nd,{children:"Type"}),(0,t.jsx)(l.nd,{children:"E/ARFCN"}),(0,t.jsx)(l.nd,{children:"PCI"}),(0,t.jsx)(l.nd,{children:"Band"}),(0,t.jsx)(l.nd,{children:"Bandwidth"}),(0,t.jsx)(l.nd,{children:"Cell ID"}),(0,t.jsx)(l.nd,{children:"TAC"}),(0,t.jsx)(l.nd,{children:"Signal"})]})}),(0,t.jsx)(l.BF,{children:Q(a).map((e,s)=>(0,t.jsxs)(l.Hj,{children:[(0,t.jsx)(l.nA,{children:e.type}),(0,t.jsx)(l.nA,{children:e.freq}),(0,t.jsx)(l.nA,{children:e.pci}),(0,t.jsx)(l.nA,{children:e.band}),(0,t.jsx)(l.nA,{children:"LTE"===e.type?e.bandwidthMHz:"-"}),(0,t.jsx)(l.nA,{children:e.cellId}),(0,t.jsx)(l.nA,{children:e.tac}),(0,t.jsx)(l.nA,{children:(0,t.jsx)(c.TooltipProvider,{children:(0,t.jsxs)(c.m_,{children:[(0,t.jsx)(c.k$,{children:X(e.rsrp)}),(0,t.jsx)(c.ZI,{children:(0,t.jsxs)("div",{className:"grid gap-1",children:[(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-1",children:["RSRP"," ",(0,t.jsxs)("span",{className:"font-medium",children:[e.rsrp," dBm"]})]}),(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-1",children:["RSRQ"," ",(0,t.jsxs)("span",{className:"font-medium",children:[e.rsrq," dB"]})]})]})})]})})})]},"".concat(e.cellId,"-").concat(s)))})]})]},s)})})]})}),(0,t.jsx)(n.wL,{className:"border-t py-4",children:(0,t.jsxs)("div",{className:"flex items-center space-x-4",children:[(null==S?void 0:S.status)==="active"?(0,t.jsx)(c.TooltipProvider,{children:(0,t.jsxs)(c.m_,{children:[(0,t.jsx)(c.k$,{children:(0,t.jsx)(i.$,{disabled:!0,children:"scanning"===H.status?(0,t.jsxs)("div",{className:"flex items-center gap-x-2",children:[(0,t.jsx)(m.A,{className:"animate-spin w-4 h-4"}),(0,t.jsx)("span",{children:"Scanning Network..."})]}):s?(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(f.A,{className:"w-4 h-4"}),(0,t.jsx)("span",{children:"Run Cell Scan Again"})]}):(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(x.A,{className:"w-4 h-4"}),(0,t.jsx)("span",{children:"Start Cell Scan"})]})})}),(0,t.jsx)(c.ZI,{children:"Please disable Quecwatch first before proceeding."})]})}):(0,t.jsx)(c.TooltipProvider,{children:(0,t.jsxs)(c.m_,{children:[(0,t.jsx)(c.k$,{children:(0,t.jsx)(i.$,{onClick:W,disabled:"scanning"===H.status||C||T>0,children:"scanning"===H.status?(0,t.jsxs)("div",{className:"flex items-center gap-x-2",children:[(0,t.jsx)(m.A,{className:"animate-spin w-4 h-4"}),(0,t.jsx)("span",{children:"Scanning Network..."})]}):s?(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(f.A,{className:"w-4 h-4"}),(0,t.jsx)("span",{children:"Run Cell Scan Again"})]}):(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(x.A,{className:"w-4 h-4"}),(0,t.jsx)("span",{children:"Start Cell Scan"})]})})}),(0,t.jsx)(c.ZI,{children:T>0?(0,t.jsxs)("span",{children:["Please wait ",Math.ceil(T/1e3)," ","seconds before scanning again"]}):(0,t.jsx)("span",{children:"Start a new network scan"})})]})}),(null==s?void 0:s.status)==="success"&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(i.$,{variant:"secondary",onClick:J,disabled:"scanning"===H.status,children:[(0,t.jsx)(p.A,{className:"w-4 h-4 mr-2"}),"Export to CSV"]}),(0,t.jsxs)(i.$,{variant:"destructive",onClick:V,disabled:"scanning"===H.status,children:[(0,t.jsx)(h.A,{className:"w-4 h-4 mr-2"}),"Clear Results"]})]})]})})]}),(0,t.jsxs)(n.Zp,{children:[(0,t.jsxs)(n.aR,{children:[(0,t.jsx)(n.ZB,{children:"Neighbor Cell Scan"}),(0,t.jsxs)(n.BT,{children:["Scan neighbor cells of the current network provider. This provides detailed information about cells in your immediate vicinity that your device can connect to.",(null==A?void 0:A.timestamp)&&(0,t.jsxs)("div",{className:"mt-1 text-sm text-muted-foreground",children:["Last scan: ",A.timestamp]})]})]}),(0,t.jsx)(n.Wu,{children:(0,t.jsx)(N,{neighborCells:A})}),(0,t.jsx)(n.wL,{className:"border-t py-4",children:(0,t.jsxs)("div",{className:"flex items-center space-x-4",children:[(0,t.jsx)(i.$,{onClick:ee,disabled:C||(null==S?void 0:S.status)==="active",children:C?(0,t.jsxs)("div",{className:"flex items-center gap-x-2",children:[(0,t.jsx)(m.A,{className:"animate-spin w-4 h-4"}),(0,t.jsx)("span",{children:"Scanning..."})]}):(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(y.$p$,{className:"w-4 h-4"}),(0,t.jsx)("span",{children:"Start Neighbor Scan"})]})}),(null==A?void 0:A.status)==="success"&&(0,t.jsxs)(i.$,{variant:"destructive",onClick:es,disabled:C,children:[(0,t.jsx)(h.A,{className:"w-4 h-4 mr-2"}),"Clear Results"]})]})})]}),(0,t.jsx)(D,{scanResult:s,isLoading:"scanning"===H.status,mccMncList:F})]})}},45934:(e,s,a)=>{"use strict";a.d(s,{E:()=>c});var t=a(20475);a(20107);var r=a(29395),n=a(22250);let l=(0,r.F)("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function c(e){let{className:s,variant:a,...r}=e;return(0,t.jsx)("div",{className:(0,n.cn)(l({variant:a}),s),...r})}},42541:(e,s,a)=>{"use strict";a.d(s,{$:()=>d,r:()=>i});var t=a(20475),r=a(20107),n=a(61837),l=a(29395),c=a(22250);let i=(0,l.F)("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),d=r.forwardRef((e,s)=>{let{className:a,variant:r,size:l,asChild:d=!1,...o}=e,u=d?n.DX:"button";return(0,t.jsx)(u,{className:(0,c.cn)(i({variant:r,size:l,className:a})),ref:s,...o})});d.displayName="Button"},72167:(e,s,a)=>{"use strict";a.d(s,{BT:()=>d,Wu:()=>o,ZB:()=>i,Zp:()=>l,aR:()=>c,wL:()=>u});var t=a(20475),r=a(20107),n=a(22250);let l=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("div",{ref:s,className:(0,n.cn)("rounded-xl border bg-card text-card-foreground shadow",a),...r})});l.displayName="Card";let c=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("div",{ref:s,className:(0,n.cn)("flex flex-col space-y-1.5 p-6",a),...r})});c.displayName="CardHeader";let i=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("h3",{ref:s,className:(0,n.cn)("font-semibold leading-none tracking-tight",a),...r})});i.displayName="CardTitle";let d=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("p",{ref:s,className:(0,n.cn)("text-sm text-muted-foreground",a),...r})});d.displayName="CardDescription";let o=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("div",{ref:s,className:(0,n.cn)("p-6 pt-0",a),...r})});o.displayName="CardContent";let u=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("div",{ref:s,className:(0,n.cn)("flex items-center p-6 pt-0",a),...r})});u.displayName="CardFooter"},36824:(e,s,a)=>{"use strict";a.d(s,{$:()=>i,F:()=>c});var t=a(20475),r=a(20107),n=a(89679),l=a(22250);let c=r.forwardRef((e,s)=>{let{className:a,children:r,...c}=e;return(0,t.jsxs)(n.bL,{ref:s,className:(0,l.cn)("relative overflow-hidden",a),...c,children:[(0,t.jsx)(n.LM,{className:"h-full w-full rounded-[inherit]",children:r}),(0,t.jsx)(i,{}),(0,t.jsx)(n.OK,{})]})});c.displayName=n.bL.displayName;let i=r.forwardRef((e,s)=>{let{className:a,orientation:r="vertical",...c}=e;return(0,t.jsx)(n.VM,{ref:s,orientation:r,className:(0,l.cn)("flex touch-none select-none transition-colors","vertical"===r&&"h-full w-2.5 border-l border-l-transparent p-[1px]","horizontal"===r&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",a),...c,children:(0,t.jsx)(n.lr,{className:"relative flex-1 rounded-full bg-border"})})});i.displayName=n.VM.displayName},51303:(e,s,a)=>{"use strict";a.d(s,{A0:()=>c,BF:()=>i,Hj:()=>d,XI:()=>l,nA:()=>u,nd:()=>o,r6:()=>m});var t=a(20475),r=a(20107),n=a(22250);let l=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("div",{className:"relative w-full overflow-auto",children:(0,t.jsx)("table",{ref:s,className:(0,n.cn)("w-full caption-bottom text-sm",a),...r})})});l.displayName="Table";let c=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("thead",{ref:s,className:(0,n.cn)("[&_tr]:border-b",a),...r})});c.displayName="TableHeader";let i=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("tbody",{ref:s,className:(0,n.cn)("[&_tr:last-child]:border-0",a),...r})});i.displayName="TableBody",r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("tfoot",{ref:s,className:(0,n.cn)("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",a),...r})}).displayName="TableFooter";let d=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("tr",{ref:s,className:(0,n.cn)("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",a),...r})});d.displayName="TableRow";let o=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("th",{ref:s,className:(0,n.cn)("h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",a),...r})});o.displayName="TableHead";let u=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("td",{ref:s,className:(0,n.cn)("p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",a),...r})});u.displayName="TableCell";let m=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)("caption",{ref:s,className:(0,n.cn)("mt-4 text-sm text-muted-foreground",a),...r})});m.displayName="TableCaption"},37921:(e,s,a)=>{"use strict";a.d(s,{Xi:()=>d,av:()=>o,j7:()=>i,tU:()=>c});var t=a(20475),r=a(20107),n=a(93677),l=a(22250);let c=n.bL,i=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)(n.B8,{ref:s,className:(0,l.cn)("inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",a),...r})});i.displayName=n.B8.displayName;let d=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)(n.l9,{ref:s,className:(0,l.cn)("inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow",a),...r})});d.displayName=n.l9.displayName;let o=r.forwardRef((e,s)=>{let{className:a,...r}=e;return(0,t.jsx)(n.UC,{ref:s,className:(0,l.cn)("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",a),...r})});o.displayName=n.UC.displayName},85014:(e,s,a)=>{"use strict";a.d(s,{TooltipProvider:()=>c,ZI:()=>o,k$:()=>d,m_:()=>i});var t=a(20475),r=a(20107),n=a(43048),l=a(22250);let c=n.Kq,i=n.bL,d=n.l9,o=r.forwardRef((e,s)=>{let{className:a,sideOffset:r=4,...c}=e;return(0,t.jsx)(n.UC,{ref:s,sideOffset:r,className:(0,l.cn)("z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",a),...c})});o.displayName=n.UC.displayName},32857:(e,s,a)=>{"use strict";a.d(s,{dj:()=>m,oR:()=>u});var t=a(20107);let r=0,n=new Map,l=e=>{if(n.has(e))return;let s=setTimeout(()=>{n.delete(e),o({type:"REMOVE_TOAST",toastId:e})},1e6);n.set(e,s)},c=(e,s)=>{switch(s.type){case"ADD_TOAST":return{...e,toasts:[s.toast,...e.toasts].slice(0,1)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(e=>e.id===s.toast.id?{...e,...s.toast}:e)};case"DISMISS_TOAST":{let{toastId:a}=s;return a?l(a):e.toasts.forEach(e=>{l(e.id)}),{...e,toasts:e.toasts.map(e=>e.id===a||void 0===a?{...e,open:!1}:e)}}case"REMOVE_TOAST":if(void 0===s.toastId)return{...e,toasts:[]};return{...e,toasts:e.toasts.filter(e=>e.id!==s.toastId)}}},i=[],d={toasts:[]};function o(e){d=c(d,e),i.forEach(e=>{e(d)})}function u(e){let{...s}=e,a=(r=(r+1)%Number.MAX_SAFE_INTEGER).toString(),t=()=>o({type:"DISMISS_TOAST",toastId:a});return o({type:"ADD_TOAST",toast:{...s,id:a,open:!0,onOpenChange:e=>{e||t()}}}),{id:a,dismiss:t,update:e=>o({type:"UPDATE_TOAST",toast:{...e,id:a}})}}function m(){let[e,s]=t.useState(d);return t.useEffect(()=>(i.push(s),()=>{let e=i.indexOf(s);e>-1&&i.splice(e,1)}),[e]),{...e,toast:u,dismiss:e=>o({type:"DISMISS_TOAST",toastId:e})}}},22250:(e,s,a)=>{"use strict";a.d(s,{cn:()=>n});var t=a(64901),r=a(868);function n(){for(var e=arguments.length,s=Array(e),a=0;a{var s=s=>e(e.s=s);e.O(0,[9980,2101,7780,8885,7563,9679,3048,3453,2394,191,6035,7358],()=>s(41126)),_N_E=e.O()}]); \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/cell-scanner/page-a4709c7977b627a1.js b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/cell-scanner/page-a4709c7977b627a1.js deleted file mode 100644 index 0a1b367..0000000 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/cell-scanner/page-a4709c7977b627a1.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5014],{41126:(e,s,t)=>{Promise.resolve().then(t.bind(t,37277))},37277:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>C});var a=t(20475),r=t(20107),n=t(72167),l=t(51303),c=t(85014),i=t(42541),d=t(33466),o=t(22250);let u=r.forwardRef((e,s)=>{let{className:t,value:r,...n}=e;return(0,a.jsx)(d.bL,{ref:s,className:(0,o.cn)("relative h-2 w-full overflow-hidden rounded-full bg-primary/20",t),...n,children:(0,a.jsx)(d.C1,{className:"h-full w-full flex-1 bg-primary transition-all",style:{transform:"translateX(-".concat(100-(r||0),"%)")}})})});u.displayName=d.bL.displayName;var m=t(59166),h=t(27720),x=t(91994),p=t(76076),f=t(51873),g=t(45934),j=t(38741),b=t(36824),v=t(32857);let N=e=>{let{neighborCells:s}=e;(0,r.useEffect)(()=>{s&&console.log("Neighbor cells data:",s)},[s]);let t=e=>e?Array.from(e.matchAll(/\+QENG: "neighbourcell (intra|inter)","LTE",(\d+),(\d+),(-?\d+),(-?\d+)/g)).map(e=>({type:"LTE",cellType:e[1],frequency:parseInt(e[2]),pci:parseInt(e[3]),rsrq:parseInt(e[4]),rsrp:parseInt(e[5])})):[],n=e=>e?Array.from(e.matchAll(/\+QNWCFG: "nr5g_meas_info",(\d+),(\d+),(\d+),(-?\d+),(-?\d+)/g)).map(e=>({type:"NR5G-NSA",cellType:"nr5g",frequency:parseInt(e[2]),pci:parseInt(e[3]),rsrp:parseInt(e[4]),rsrq:parseInt(e[5])})):[],i=e=>e>=-65?(0,a.jsx)(j.z_q,{className:"text-xl text-green-500"}):e>=-75?(0,a.jsx)(j.sRp,{className:"text-xl text-green-400"}):e>=-85?(0,a.jsx)(j.ztD,{className:"text-xl text-yellow-500"}):e>=-95?(0,a.jsx)(j.G7Q,{className:"text-xl text-yellow-600"}):(0,a.jsx)(j.NJ4,{className:"text-xl text-red-500"}),d=[];if((null==s?void 0:s.status)==="success"){var o,u,m,h;(null===(o=s.data)||void 0===o?void 0:o.neighborCells)?d=[...d,...t(s.data.neighborCells)]:(null===(u=s.raw_data)||void 0===u?void 0:u.neighborCells)&&(d=[...d,...t(s.raw_data.neighborCells)]),(null===(m=s.data)||void 0===m?void 0:m.meas)?d=[...d,...n(s.data.meas)]:(null===(h=s.raw_data)||void 0===h?void 0:h.meas)&&(d=[...d,...n(s.raw_data.meas)])}return(d.sort((e,s)=>e.type.startsWith("NR5G")&&!s.type.startsWith("NR5G")?-1:!e.type.startsWith("NR5G")&&s.type.startsWith("NR5G")?1:s.rsrp-e.rsrp),s&&0!==d.length)?(0,a.jsx)("div",{className:"space-y-4",children:(0,a.jsxs)(l.XI,{children:[(0,a.jsx)(l.A0,{children:(0,a.jsxs)(l.Hj,{children:[(0,a.jsx)(l.nd,{children:"Type"}),(0,a.jsx)(l.nd,{children:"Cell Type"}),(0,a.jsx)(l.nd,{children:"Frequency"}),(0,a.jsx)(l.nd,{children:"PCI"}),(0,a.jsx)(l.nd,{children:"Signal"})]})}),(0,a.jsx)(l.BF,{children:d.map((e,s)=>(0,a.jsxs)(l.Hj,{children:[(0,a.jsx)(l.nA,{className:"font-medium",children:e.type}),(0,a.jsx)(l.nA,{children:e.cellType}),(0,a.jsx)(l.nA,{children:e.frequency}),(0,a.jsx)(l.nA,{children:e.pci}),(0,a.jsx)(l.nA,{children:(0,a.jsx)(c.TooltipProvider,{children:(0,a.jsxs)(c.m_,{children:[(0,a.jsx)(c.k$,{children:i(e.rsrp)}),(0,a.jsx)(c.ZI,{children:(0,a.jsxs)("div",{className:"grid gap-1",children:[(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-1",children:["RSRP ",(0,a.jsxs)("span",{className:"font-medium",children:[e.rsrp," dBm"]})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-1",children:["RSRQ ",(0,a.jsxs)("span",{className:"font-medium",children:[e.rsrq," dB"]})]})]})})]})})})]},"".concat(e.type,"-").concat(e.frequency,"-").concat(e.pci,"-").concat(s)))})]})}):(0,a.jsx)("div",{className:"text-center py-4 text-gray-500",children:"No neighbor cells data available"})};var y=t(7197);let w={6:"1.4 MHz",15:"3 MHz",25:"5 MHz",50:"10 MHz",75:"15 MHz",100:"20 MHz","-":"-"},C=()=>{let{toast:e}=(0,v.dj)(),[s,t]=(0,r.useState)(null),[d,o]=(0,r.useState)(null),[C,T]=(0,r.useState)(0),[S,k]=(0,r.useState)(!1),[A,R]=(0,r.useState)(null),[I,_]=(0,r.useState)([]),[E,q]=(0,r.useState)(null),[F,M]=(0,r.useState)({status:"idle",progress:0,message:""}),[D,O]=(0,r.useState)(0);(0,r.useEffect)(()=>{if(!d){T(0);return}let e=()=>{let s=new Date(d).getTime(),t=Math.max(0,6e4-(new Date().getTime()-s));T(t),t>0&&requestAnimationFrame(e)};e()},[d]);let P=(0,r.useCallback)(async()=>{try{let e=await fetch("/cgi-bin/quecmanager/experimental/cell_scanner/fetch_mccmnc.sh"),s=await e.json();_(s)}catch(s){console.error("Failed to fetch MCC-MNC list:",s),e({title:"Warning",description:"Failed to load operator information",variant:"destructive"})}},[]);(0,r.useEffect)(()=>{P()},[P]);let B=(0,r.useCallback)(async()=>{try{let e=await fetch("/cgi-bin/quecmanager/experimental/quecwatch/fetch-quecwatch.sh"),s=await e.json();R(s)}catch(s){console.error("Failed to fetch Quecwatch status:",s),e({title:"Error",description:"Failed to check Quecwatch status",variant:"destructive"})}},[]),z=(0,r.useCallback)((e,s)=>I.find(t=>t.mcc===e&&t.mnc===s)||null,[I]),H=(0,r.useCallback)(e=>e?e.split("\n").filter(e=>e.trim().startsWith("+QSCAN:")).map(e=>{let[s,t,a,r,n,l,c,i,...d]=e.substring(e.indexOf(":")+1).trim().split(",").map(e=>e.trim().replace(/\\"/g,"").replace(/"/g,"").replace(/\r/g,"")),o={type:s=s.replace(/\\\\/g,"").replace(/\\/g,"").replace(/"/g,"").trim(),mcc:t,mnc:a,freq:parseInt(r),pci:parseInt(n),rsrp:parseInt(l),rsrq:parseInt(c),srxlev:"-"===i?0:parseInt(i),cellId:"",tac:""};if("LTE"===s){let[e,s,t,a,r]=d,n=parseInt(a),l=w[n.toString()]||"".concat(n," RB");return{...o,type:"LTE",squal:"-"===e?0:parseInt(e),cellId:s,tac:t,bandwidth:n,bandwidthMHz:l,band:parseInt(r)}}if("NR5G"===s){let[e,s,t,a,r,n,l,c]=d;return{...o,type:"NR5G",cellId:e,tac:s,scs:parseInt(t),carrierBandwidth:parseInt(a),band:parseInt(r),offsetToPointA:parseInt(n),ssbSubcarrierOffset:parseInt(l),ssbScs:parseInt(c)}}return null}).filter(e=>null!==e):[],[]),L=(0,r.useCallback)(async()=>{try{let e=await fetch("/cgi-bin/quecmanager/experimental/cell_scanner/check_scan.sh",{headers:{"Cache-Control":"no-cache, no-store"}});if(!e.ok)return;let s=await e.json();"success"===s.status&&s.output?(t(s),o(s.timestamp||null)):"running"===s.status&&(M({status:"scanning",progress:50,message:"Scan in progress...",startTime:Date.now()-6e4}),G(),setTimeout($,2e3))}catch(e){console.error("Failed to check initial scan results",e)}},[]),$=(0,r.useCallback)(async()=>{if(D>60){console.log("Reached maximum polling attempts, waiting for results to appear");return}try{let e=await fetch("/cgi-bin/quecmanager/experimental/cell_scanner/check_scan.sh",{headers:{"Cache-Control":"no-cache, no-store"}});if(!e.ok)throw Error("HTTP error! status: ".concat(e.status));let s=await e.json();if("success"===s.status&&s.output){t(s),o(s.timestamp||null),M({status:"idle",progress:100,message:""}),O(0);return}if("running"===s.status){O(e=>e+1),setTimeout($,2e3);return}D<30&&(O(e=>e+1),setTimeout($,2e3))}catch(e){console.error("Failed to check scan status",e),D<60&&(O(e=>e+1),setTimeout($,3e3))}},[D]),G=(0,r.useCallback)(()=>{let e;e=setInterval(()=>{M(s=>{if("scanning"!==s.status)return clearInterval(e),s;let t=10+88*Math.min((Date.now()-(s.startTime||Date.now()))/12e4,1),a="Scanning available networks... This may take a minute";return t>85?a="Finalizing scan results...":t>50&&(a="Collecting operator data..."),{...s,progress:Math.min(t,98),message:a}})},1e3),setTimeout(()=>{clearInterval(e),M(e=>"scanning"===e.status?{...e,progress:98,message:"Waiting for results..."}:e)},15e4)},[]),Q=(0,r.useCallback)(async()=>{if("scanning"!==F.status&&!S){k(!0),t(null),o(null),O(0),M({status:"scanning",progress:0,message:"Initiating scan...",startTime:Date.now()});try{let e=await fetch("/cgi-bin/quecmanager/experimental/cell_scanner/cell_scan.sh",{headers:{"Cache-Control":"no-cache, no-store"}});if(!e.ok)throw Error("HTTP error! status: ".concat(e.status));let s=await e.json();if("running"===s.status||"success"===s.status)M(e=>({...e,progress:10,message:"Scan in progress..."})),G(),setTimeout($,2e3);else throw Error(s.message||"Failed to start scan")}catch(s){console.error("Scan error:",s),e({title:"Error",description:s instanceof Error?s.message:"Failed to start cell scan",variant:"destructive"}),M({status:"idle",progress:0,message:""})}finally{k(!1)}}},[F.status,S,$,G]),Z=(0,r.useCallback)(e=>e.reduce((e,s)=>{let t="".concat(s.mcc).concat(s.mnc);if(!e[t]){let a=z(s.mcc,s.mnc);e[t]={cells:[],operatorInfo:a}}return e[t].cells.push(s),e},{}),[z]),W=(0,r.useCallback)(e=>[...e].sort((e,s)=>e.type!==s.type?"LTE"===e.type?-1:1:s.rsrp-e.rsrp),[]),V=(0,r.useCallback)(e=>e>=-65?(0,a.jsx)(j.z_q,{className:"text-xl text-green-500"}):e>=-75?(0,a.jsx)(j.sRp,{className:"text-xl text-green-400"}):e>=-85?(0,a.jsx)(j.ztD,{className:"text-xl text-yellow-500"}):e>=-95?(0,a.jsx)(j.G7Q,{className:"text-xl text-yellow-600"}):(0,a.jsx)(j.NJ4,{className:"text-xl text-red-500"}),[]);(0,r.useEffect)(()=>{L(),B()},[L,B]);let U=(0,r.useCallback)(()=>{t(null),o(null),M({status:"idle",progress:0,message:""})},[]),X=(0,r.useCallback)(()=>{if(!(null==s?void 0:s.output))return;let e=new Blob([["Type,MCC,MNC,Frequency,PCI,RSRP,RSRQ,Band,Cell ID,TAC",...H(s.output).map(e=>"".concat(e.type,",").concat(e.mcc,",").concat(e.mnc,",").concat(e.freq,",").concat(e.pci,",").concat(e.rsrp,",").concat(e.rsrq,",").concat(e.band,",").concat(e.cellId,",").concat(e.tac))].join("\n")],{type:"text/csv;charset=utf-8;"}),t=document.createElement("a");t.href=URL.createObjectURL(e),t.setAttribute("download","cell_scan_".concat(new Date().toISOString(),".csv")),document.body.appendChild(t),t.click(),document.body.removeChild(t)},[s,H]),J=(0,r.useCallback)((e,s,t)=>t?"".concat(e).concat(s," - ").concat(t.brand," by ").concat(t.operator):"".concat(e).concat(s),[]),K=(null==s?void 0:s.status)==="success"&&s.output?Z(H(s.output)):{},Y=(0,r.useCallback)(async()=>{if(!S){k(!0),q(null);try{let e=await fetch("/cgi-bin/quecmanager/experimental/cell_scanner/network_info.sh");if(!e.ok)throw Error("HTTP error! status: ".concat(e.status));let a=await e.json();if(console.log("Neighbor cell data:",a),"success"===a.status&&a.mode){var s,t;(null===(s=a.data)||void 0===s?void 0:s.neighborCells)||(null===(t=a.data)||void 0===t?void 0:t.meas)?q(a):a.raw_data&&q({status:a.status,timestamp:a.timestamp,mode:a.mode,data:{neighborCells:a.raw_data.neighborCells,meas:a.raw_data.meas}})}else q(a)}catch(s){console.error("Failed to fetch neighbor cells",s),e({title:"Error",description:"Failed to scan neighbor cells. Please try again.",variant:"destructive"})}finally{k(!1)}}},[S]),ee=(0,r.useCallback)(()=>{q(null)},[]);return(0,a.jsxs)("div",{className:"grid gap-5",children:[(0,a.jsxs)(n.Zp,{children:[(0,a.jsxs)(n.aR,{children:[(0,a.jsx)(n.ZB,{children:"Full Network Cell Scan"}),(0,a.jsxs)(n.BT,{children:["Scan all available network cells, including those from other network providers. Current network mode will affect the results and you may be disconnected during the scan.",d&&(0,a.jsxs)("div",{className:"mt-1 text-sm text-muted-foreground",children:["Last scan: ",d]})]})]}),(0,a.jsx)(n.Wu,{children:(0,a.jsxs)(b.F,{className:"h-96",children:[!s&&"idle"===F.status&&(0,a.jsx)("div",{className:"flex items-center justify-center h-full",children:(0,a.jsx)("p",{className:"text-gray-500 text-center",children:"Click the button below to start scanning the network..."})}),"scanning"===F.status&&(0,a.jsxs)("div",{className:"flex flex-col space-y-2 items-center justify-center h-full w-full",children:[(0,a.jsx)(u,{value:F.progress,className:"w-full"}),(0,a.jsx)("div",{className:"flex items-center justify-center",children:(0,a.jsx)("p",{className:"text-sm text-gray-500 text-center",children:F.message})})]}),(0,a.jsx)("div",{className:"grid gap-4",children:Object.entries(K).map(e=>{let[s,{cells:t,operatorInfo:r}]=e;return(0,a.jsxs)(n.Zp,{className:"p-4 grid gap-2",children:[(0,a.jsx)("div",{children:(0,a.jsx)(g.E,{children:J(t[0].mcc,t[0].mnc,r)})}),(0,a.jsxs)(l.XI,{children:[(0,a.jsx)(l.A0,{children:(0,a.jsxs)(l.Hj,{children:[(0,a.jsx)(l.nd,{children:"Type"}),(0,a.jsx)(l.nd,{children:"E/ARFCN"}),(0,a.jsx)(l.nd,{children:"PCI"}),(0,a.jsx)(l.nd,{children:"Band"}),(0,a.jsx)(l.nd,{children:"Bandwidth"}),(0,a.jsx)(l.nd,{children:"Cell ID"}),(0,a.jsx)(l.nd,{children:"TAC"}),(0,a.jsx)(l.nd,{children:"Signal"})]})}),(0,a.jsx)(l.BF,{children:W(t).map((e,s)=>(0,a.jsxs)(l.Hj,{children:[(0,a.jsx)(l.nA,{children:e.type}),(0,a.jsx)(l.nA,{children:e.freq}),(0,a.jsx)(l.nA,{children:e.pci}),(0,a.jsx)(l.nA,{children:e.band}),(0,a.jsx)(l.nA,{children:"LTE"===e.type?e.bandwidthMHz:"-"}),(0,a.jsx)(l.nA,{children:e.cellId}),(0,a.jsx)(l.nA,{children:e.tac}),(0,a.jsx)(l.nA,{children:(0,a.jsx)(c.TooltipProvider,{children:(0,a.jsxs)(c.m_,{children:[(0,a.jsx)(c.k$,{children:V(e.rsrp)}),(0,a.jsx)(c.ZI,{children:(0,a.jsxs)("div",{className:"grid gap-1",children:[(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-1",children:["RSRP"," ",(0,a.jsxs)("span",{className:"font-medium",children:[e.rsrp," dBm"]})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-1",children:["RSRQ"," ",(0,a.jsxs)("span",{className:"font-medium",children:[e.rsrq," dB"]})]})]})})]})})})]},"".concat(e.cellId,"-").concat(s)))})]})]},s)})})]})}),(0,a.jsx)(n.wL,{className:"border-t py-4",children:(0,a.jsxs)("div",{className:"flex items-center space-x-4",children:[(null==A?void 0:A.status)==="active"?(0,a.jsx)(c.TooltipProvider,{children:(0,a.jsxs)(c.m_,{children:[(0,a.jsx)(c.k$,{children:(0,a.jsx)(i.$,{disabled:!0,children:"scanning"===F.status?(0,a.jsxs)("div",{className:"flex items-center gap-x-2",children:[(0,a.jsx)(m.A,{className:"animate-spin w-4 h-4"}),(0,a.jsx)("span",{children:"Scanning Network..."})]}):s?(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)(x.A,{className:"w-4 h-4"}),(0,a.jsx)("span",{children:"Run Cell Scan Again"})]}):(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)(h.A,{className:"w-4 h-4"}),(0,a.jsx)("span",{children:"Start Cell Scan"})]})})}),(0,a.jsx)(c.ZI,{children:"Please disable Quecwatch first before proceeding."})]})}):(0,a.jsx)(c.TooltipProvider,{children:(0,a.jsxs)(c.m_,{children:[(0,a.jsx)(c.k$,{children:(0,a.jsx)(i.$,{onClick:Q,disabled:"scanning"===F.status||S||C>0,children:"scanning"===F.status?(0,a.jsxs)("div",{className:"flex items-center gap-x-2",children:[(0,a.jsx)(m.A,{className:"animate-spin w-4 h-4"}),(0,a.jsx)("span",{children:"Scanning Network..."})]}):s?(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)(x.A,{className:"w-4 h-4"}),(0,a.jsx)("span",{children:"Run Cell Scan Again"})]}):(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)(h.A,{className:"w-4 h-4"}),(0,a.jsx)("span",{children:"Start Cell Scan"})]})})}),(0,a.jsx)(c.ZI,{children:C>0?(0,a.jsxs)("span",{children:["Please wait ",Math.ceil(C/1e3)," ","seconds before scanning again"]}):(0,a.jsx)("span",{children:"Start a new network scan"})})]})}),(null==s?void 0:s.status)==="success"&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(i.$,{variant:"secondary",onClick:X,disabled:"scanning"===F.status,children:[(0,a.jsx)(p.A,{className:"w-4 h-4 mr-2"}),"Export to CSV"]}),(0,a.jsxs)(i.$,{variant:"destructive",onClick:U,disabled:"scanning"===F.status,children:[(0,a.jsx)(f.A,{className:"w-4 h-4 mr-2"}),"Clear Results"]})]})]})})]}),(0,a.jsxs)(n.Zp,{children:[(0,a.jsxs)(n.aR,{children:[(0,a.jsx)(n.ZB,{children:"Neighbor Cell Scan"}),(0,a.jsxs)(n.BT,{children:["Scan neighbor cells of the current network provider. This provides detailed information about cells in your immediate vicinity that your device can connect to.",(null==E?void 0:E.timestamp)&&(0,a.jsxs)("div",{className:"mt-1 text-sm text-muted-foreground",children:["Last scan: ",E.timestamp]})]})]}),(0,a.jsx)(n.Wu,{children:(0,a.jsx)(N,{neighborCells:E})}),(0,a.jsx)(n.wL,{className:"border-t py-4",children:(0,a.jsxs)("div",{className:"flex items-center space-x-4",children:[(0,a.jsx)(i.$,{onClick:Y,disabled:S||(null==A?void 0:A.status)==="active",children:S?(0,a.jsxs)("div",{className:"flex items-center gap-x-2",children:[(0,a.jsx)(m.A,{className:"animate-spin w-4 h-4"}),(0,a.jsx)("span",{children:"Scanning..."})]}):(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)(y.$p$,{className:"w-4 h-4"}),(0,a.jsx)("span",{children:"Start Neighbor Scan"})]})}),(null==E?void 0:E.status)==="success"&&(0,a.jsxs)(i.$,{variant:"destructive",onClick:ee,disabled:S,children:[(0,a.jsx)(f.A,{className:"w-4 h-4 mr-2"}),"Clear Results"]})]})})]})]})}},45934:(e,s,t)=>{"use strict";t.d(s,{E:()=>c});var a=t(20475);t(20107);var r=t(29395),n=t(22250);let l=(0,r.F)("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function c(e){let{className:s,variant:t,...r}=e;return(0,a.jsx)("div",{className:(0,n.cn)(l({variant:t}),s),...r})}},42541:(e,s,t)=>{"use strict";t.d(s,{$:()=>d,r:()=>i});var a=t(20475),r=t(20107),n=t(61837),l=t(29395),c=t(22250);let i=(0,l.F)("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),d=r.forwardRef((e,s)=>{let{className:t,variant:r,size:l,asChild:d=!1,...o}=e,u=d?n.DX:"button";return(0,a.jsx)(u,{className:(0,c.cn)(i({variant:r,size:l,className:t})),ref:s,...o})});d.displayName="Button"},72167:(e,s,t)=>{"use strict";t.d(s,{BT:()=>d,Wu:()=>o,ZB:()=>i,Zp:()=>l,aR:()=>c,wL:()=>u});var a=t(20475),r=t(20107),n=t(22250);let l=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("div",{ref:s,className:(0,n.cn)("rounded-xl border bg-card text-card-foreground shadow",t),...r})});l.displayName="Card";let c=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("div",{ref:s,className:(0,n.cn)("flex flex-col space-y-1.5 p-6",t),...r})});c.displayName="CardHeader";let i=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("h3",{ref:s,className:(0,n.cn)("font-semibold leading-none tracking-tight",t),...r})});i.displayName="CardTitle";let d=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("p",{ref:s,className:(0,n.cn)("text-sm text-muted-foreground",t),...r})});d.displayName="CardDescription";let o=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("div",{ref:s,className:(0,n.cn)("p-6 pt-0",t),...r})});o.displayName="CardContent";let u=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("div",{ref:s,className:(0,n.cn)("flex items-center p-6 pt-0",t),...r})});u.displayName="CardFooter"},36824:(e,s,t)=>{"use strict";t.d(s,{$:()=>i,F:()=>c});var a=t(20475),r=t(20107),n=t(89679),l=t(22250);let c=r.forwardRef((e,s)=>{let{className:t,children:r,...c}=e;return(0,a.jsxs)(n.bL,{ref:s,className:(0,l.cn)("relative overflow-hidden",t),...c,children:[(0,a.jsx)(n.LM,{className:"h-full w-full rounded-[inherit]",children:r}),(0,a.jsx)(i,{}),(0,a.jsx)(n.OK,{})]})});c.displayName=n.bL.displayName;let i=r.forwardRef((e,s)=>{let{className:t,orientation:r="vertical",...c}=e;return(0,a.jsx)(n.VM,{ref:s,orientation:r,className:(0,l.cn)("flex touch-none select-none transition-colors","vertical"===r&&"h-full w-2.5 border-l border-l-transparent p-[1px]","horizontal"===r&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",t),...c,children:(0,a.jsx)(n.lr,{className:"relative flex-1 rounded-full bg-border"})})});i.displayName=n.VM.displayName},51303:(e,s,t)=>{"use strict";t.d(s,{A0:()=>c,BF:()=>i,Hj:()=>d,XI:()=>l,nA:()=>u,nd:()=>o,r6:()=>m});var a=t(20475),r=t(20107),n=t(22250);let l=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("div",{className:"relative w-full overflow-auto",children:(0,a.jsx)("table",{ref:s,className:(0,n.cn)("w-full caption-bottom text-sm",t),...r})})});l.displayName="Table";let c=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("thead",{ref:s,className:(0,n.cn)("[&_tr]:border-b",t),...r})});c.displayName="TableHeader";let i=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("tbody",{ref:s,className:(0,n.cn)("[&_tr:last-child]:border-0",t),...r})});i.displayName="TableBody",r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("tfoot",{ref:s,className:(0,n.cn)("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",t),...r})}).displayName="TableFooter";let d=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("tr",{ref:s,className:(0,n.cn)("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",t),...r})});d.displayName="TableRow";let o=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("th",{ref:s,className:(0,n.cn)("h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",t),...r})});o.displayName="TableHead";let u=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("td",{ref:s,className:(0,n.cn)("p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",t),...r})});u.displayName="TableCell";let m=r.forwardRef((e,s)=>{let{className:t,...r}=e;return(0,a.jsx)("caption",{ref:s,className:(0,n.cn)("mt-4 text-sm text-muted-foreground",t),...r})});m.displayName="TableCaption"},85014:(e,s,t)=>{"use strict";t.d(s,{TooltipProvider:()=>c,ZI:()=>o,k$:()=>d,m_:()=>i});var a=t(20475),r=t(20107),n=t(43048),l=t(22250);let c=n.Kq,i=n.bL,d=n.l9,o=r.forwardRef((e,s)=>{let{className:t,sideOffset:r=4,...c}=e;return(0,a.jsx)(n.UC,{ref:s,sideOffset:r,className:(0,l.cn)("z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",t),...c})});o.displayName=n.UC.displayName},32857:(e,s,t)=>{"use strict";t.d(s,{dj:()=>m,oR:()=>u});var a=t(20107);let r=0,n=new Map,l=e=>{if(n.has(e))return;let s=setTimeout(()=>{n.delete(e),o({type:"REMOVE_TOAST",toastId:e})},1e6);n.set(e,s)},c=(e,s)=>{switch(s.type){case"ADD_TOAST":return{...e,toasts:[s.toast,...e.toasts].slice(0,1)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(e=>e.id===s.toast.id?{...e,...s.toast}:e)};case"DISMISS_TOAST":{let{toastId:t}=s;return t?l(t):e.toasts.forEach(e=>{l(e.id)}),{...e,toasts:e.toasts.map(e=>e.id===t||void 0===t?{...e,open:!1}:e)}}case"REMOVE_TOAST":if(void 0===s.toastId)return{...e,toasts:[]};return{...e,toasts:e.toasts.filter(e=>e.id!==s.toastId)}}},i=[],d={toasts:[]};function o(e){d=c(d,e),i.forEach(e=>{e(d)})}function u(e){let{...s}=e,t=(r=(r+1)%Number.MAX_SAFE_INTEGER).toString(),a=()=>o({type:"DISMISS_TOAST",toastId:t});return o({type:"ADD_TOAST",toast:{...s,id:t,open:!0,onOpenChange:e=>{e||a()}}}),{id:t,dismiss:a,update:e=>o({type:"UPDATE_TOAST",toast:{...e,id:t}})}}function m(){let[e,s]=a.useState(d);return a.useEffect(()=>(i.push(s),()=>{let e=i.indexOf(s);e>-1&&i.splice(e,1)}),[e]),{...e,toast:u,dismiss:e=>o({type:"DISMISS_TOAST",toastId:e})}}},22250:(e,s,t)=>{"use strict";t.d(s,{cn:()=>n});var a=t(64901),r=t(868);function n(){for(var e=arguments.length,s=Array(e),t=0;t{var s=s=>e(e.s=s);e.O(0,[9980,2101,7780,8885,7563,9679,3048,7231,191,6035,7358],()=>s(41126)),_N_E=e.O()}]); \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/freq-calculator/page-72839bc94c5707d7.js b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/freq-calculator/page-72839bc94c5707d7.js deleted file mode 100644 index 6e111bb..0000000 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/freq-calculator/page-72839bc94c5707d7.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[666],{33504:(e,a,n)=>{Promise.resolve().then(n.bind(n,3099))},3099:(e,a,n)=>{"use strict";n.r(a),n.d(a,{default:()=>x});var l=n(20475),r=n(20107),s=n(72167),d=n(64219),t=n(42541),i=n(49153),o=n(93677),c=n(22250);let f=o.bL,u=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)(o.B8,{ref:a,className:(0,c.cn)("inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",n),...r})});u.displayName=o.B8.displayName;let g=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)(o.l9,{ref:a,className:(0,c.cn)("inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow",n),...r})});g.displayName=o.l9.displayName,r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)(o.UC,{ref:a,className:(0,c.cn)("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",n),...r})}).displayName=o.UC.displayName;var m=n(51873),p=n(58212);let h=e=>{if(window.localStorage)try{let a=localStorage.getItem(e);console.log("LocalStorage value for ".concat(e,":"),a?JSON.parse(a):"null")}catch(e){console.error("Error reading from localStorage:",e)}else console.log("localStorage not available")},x=()=>{let[e,a]=(0,r.useState)(""),[n,o]=(0,r.useState)(null),[c,x]=(0,r.useState)(""),[y,w]=(0,r.useState)("auto"),[b,D]=(0,r.useState)([]),H=[{band:1,name:"2100",dlLow:2110,dlHigh:2170,ulLow:1920,ulHigh:1980,earfcnOffset:0,earfcnRange:[0,599],spacing:.1,duplexType:"FDD"},{band:2,name:"1900 PCS",dlLow:1930,dlHigh:1990,ulLow:1850,ulHigh:1910,earfcnOffset:600,earfcnRange:[600,1199],spacing:.1,duplexType:"FDD"},{band:3,name:"1800",dlLow:1805,dlHigh:1880,ulLow:1710,ulHigh:1785,earfcnOffset:1200,earfcnRange:[1200,1949],spacing:.1,duplexType:"FDD"},{band:4,name:"AWS-1",dlLow:2110,dlHigh:2155,ulLow:1710,ulHigh:1755,earfcnOffset:1950,earfcnRange:[1950,2399],spacing:.1,duplexType:"FDD"},{band:5,name:"850",dlLow:869,dlHigh:894,ulLow:824,ulHigh:849,earfcnOffset:2400,earfcnRange:[2400,2649],spacing:.1,duplexType:"FDD"},{band:7,name:"2600",dlLow:2620,dlHigh:2690,ulLow:2500,ulHigh:2570,earfcnOffset:2750,earfcnRange:[2750,3449],spacing:.1,duplexType:"FDD"},{band:8,name:"900",dlLow:925,dlHigh:960,ulLow:880,ulHigh:915,earfcnOffset:3450,earfcnRange:[3450,3799],spacing:.1,duplexType:"FDD"},{band:12,name:"700 a",dlLow:729,dlHigh:746,ulLow:699,ulHigh:716,earfcnOffset:5010,earfcnRange:[5010,5179],spacing:.1,duplexType:"FDD"},{band:13,name:"700 c",dlLow:746,dlHigh:756,ulLow:777,ulHigh:787,earfcnOffset:5180,earfcnRange:[5180,5279],spacing:.1,duplexType:"FDD"},{band:14,name:"700 PS",dlLow:758,dlHigh:768,ulLow:788,ulHigh:798,earfcnOffset:5280,earfcnRange:[5280,5379],spacing:.1,duplexType:"FDD"},{band:17,name:"700 b",dlLow:734,dlHigh:746,ulLow:704,ulHigh:716,earfcnOffset:5730,earfcnRange:[5730,5849],spacing:.1,duplexType:"FDD"},{band:20,name:"800 DD",dlLow:791,dlHigh:821,ulLow:832,ulHigh:862,earfcnOffset:6150,earfcnRange:[6150,6449],spacing:.1,duplexType:"FDD"},{band:25,name:"1900+",dlLow:1930,dlHigh:1995,ulLow:1850,ulHigh:1915,earfcnOffset:8040,earfcnRange:[8040,8689],spacing:.1,duplexType:"FDD"},{band:26,name:"850+",dlLow:859,dlHigh:894,ulLow:814,ulHigh:849,earfcnOffset:8690,earfcnRange:[8690,9039],spacing:.1,duplexType:"FDD"},{band:28,name:"700 APT",dlLow:758,dlHigh:803,ulLow:703,ulHigh:748,earfcnOffset:9210,earfcnRange:[9210,9659],spacing:.1,duplexType:"FDD"},{band:66,name:"AWS-3",dlLow:2110,dlHigh:2200,ulLow:1710,ulHigh:1780,earfcnOffset:66436,earfcnRange:[66436,67335],spacing:.1,duplexType:"FDD"},{band:71,name:"600",dlLow:617,dlHigh:652,ulLow:663,ulHigh:698,earfcnOffset:68586,earfcnRange:[68586,68935],spacing:.1,duplexType:"FDD"},{band:38,name:"TD 2600",dlLow:2570,dlHigh:2620,ulLow:2570,ulHigh:2620,earfcnOffset:37750,earfcnRange:[37750,38249],spacing:.1,duplexType:"TDD"},{band:40,name:"TD 2300",dlLow:2300,dlHigh:2400,ulLow:2300,ulHigh:2400,earfcnOffset:38650,earfcnRange:[38650,39649],spacing:.1,duplexType:"TDD"},{band:41,name:"TD 2500",dlLow:2496,dlHigh:2690,ulLow:2496,ulHigh:2690,earfcnOffset:39650,earfcnRange:[39650,41589],spacing:.1,duplexType:"TDD"},{band:48,name:"CBRS",dlLow:3550,dlHigh:3700,ulLow:3550,ulHigh:3700,earfcnOffset:55240,earfcnRange:[55240,56739],spacing:.1,duplexType:"TDD"}],N=[{band:5,name:"850",dlLow:869,dlHigh:894,ulLow:824,ulHigh:849,nrarfcnOffset:173800,nrarfcnRange:[173800,178800],duplexType:"FDD"},{band:8,name:"900",dlLow:925,dlHigh:960,ulLow:880,ulHigh:915,nrarfcnOffset:185e3,nrarfcnRange:[185e3,192e3],duplexType:"FDD"},{band:12,name:"700 a",dlLow:729,dlHigh:746,ulLow:699,ulHigh:716,nrarfcnOffset:145800,nrarfcnRange:[145800,149200],duplexType:"FDD"},{band:14,name:"700 PS",dlLow:758,dlHigh:768,ulLow:788,ulHigh:798,nrarfcnOffset:151600,nrarfcnRange:[151600,153600],duplexType:"FDD"},{band:20,name:"800 DD",dlLow:791,dlHigh:821,ulLow:832,ulHigh:862,nrarfcnOffset:158200,nrarfcnRange:[158200,164200],duplexType:"FDD"},{band:28,name:"700 APT",dlLow:758,dlHigh:803,ulLow:703,ulHigh:748,nrarfcnOffset:151600,nrarfcnRange:[151600,160600],duplexType:"FDD"},{band:71,name:"600",dlLow:617,dlHigh:652,ulLow:663,ulHigh:698,nrarfcnOffset:123400,nrarfcnRange:[123400,130400],duplexType:"FDD"},{band:1,name:"2100",dlLow:2110,dlHigh:2170,ulLow:1920,ulHigh:1980,nrarfcnOffset:422e3,nrarfcnRange:[422e3,434e3],duplexType:"FDD"},{band:2,name:"1900 PCS",dlLow:1930,dlHigh:1990,ulLow:1850,ulHigh:1910,nrarfcnOffset:386e3,nrarfcnRange:[386e3,398e3],duplexType:"FDD"},{band:3,name:"1800",dlLow:1805,dlHigh:1880,ulLow:1710,ulHigh:1785,nrarfcnOffset:361e3,nrarfcnRange:[361e3,376e3],duplexType:"FDD"},{band:7,name:"2600",dlLow:2620,dlHigh:2690,ulLow:2500,ulHigh:2570,nrarfcnOffset:524e3,nrarfcnRange:[524e3,538e3],duplexType:"FDD"},{band:25,name:"1900+",dlLow:1930,dlHigh:1995,ulLow:1850,ulHigh:1915,nrarfcnOffset:386e3,nrarfcnRange:[386e3,399e3],duplexType:"FDD"},{band:66,name:"AWS-3",dlLow:2110,dlHigh:2200,ulLow:1710,ulHigh:1780,nrarfcnOffset:422e3,nrarfcnRange:[422e3,44e4],duplexType:"FDD"},{band:70,name:"AWS-4",dlLow:1995,dlHigh:2020,ulLow:1695,ulHigh:1710,nrarfcnOffset:399e3,nrarfcnRange:[399e3,404e3],duplexType:"FDD"},{band:34,name:"2000 TDD",dlLow:2010,dlHigh:2025,ulLow:2010,ulHigh:2025,nrarfcnOffset:402e3,nrarfcnRange:[402e3,405e3],duplexType:"TDD"},{band:38,name:"TD 2600",dlLow:2570,dlHigh:2620,ulLow:2570,ulHigh:2620,nrarfcnOffset:514e3,nrarfcnRange:[514e3,524e3],duplexType:"TDD"},{band:39,name:"IMT 1900 TDD",dlLow:1880,dlHigh:1920,ulLow:1880,ulHigh:1920,nrarfcnOffset:376e3,nrarfcnRange:[376e3,384e3],duplexType:"TDD"},{band:40,name:"TD 2300",dlLow:2300,dlHigh:2400,ulLow:2300,ulHigh:2400,nrarfcnOffset:46e4,nrarfcnRange:[46e4,48e4],duplexType:"TDD"},{band:41,name:"TD 2500",dlLow:2496,dlHigh:2690,ulLow:2496,ulHigh:2690,nrarfcnOffset:499200,nrarfcnRange:[499200,537999],duplexType:"TDD"},{band:48,name:"CBRS",dlLow:3550,dlHigh:3700,ulLow:3550,ulHigh:3700,nrarfcnOffset:636667,nrarfcnRange:[636667,646666],duplexType:"TDD"},{band:77,name:"C-Band",dlLow:3300,dlHigh:4200,ulLow:3300,ulHigh:4200,nrarfcnOffset:62e4,nrarfcnRange:[62e4,68e4],duplexType:"TDD"},{band:78,name:"C-Band (3.5GHz)",dlLow:3300,dlHigh:3800,ulLow:3300,ulHigh:3800,nrarfcnOffset:62e4,nrarfcnRange:[62e4,653333],duplexType:"TDD"},{band:79,name:"4.5GHz",dlLow:4400,dlHigh:5e3,ulLow:4400,ulHigh:5e3,nrarfcnOffset:693334,nrarfcnRange:[693334,733333],duplexType:"TDD"},{band:90,name:"TD 2600",dlLow:2496,dlHigh:2690,ulLow:2496,ulHigh:2690,nrarfcnOffset:499200,nrarfcnRange:[499200,538e3],duplexType:"TDD"},{band:257,name:"28 GHz",dlLow:26500,dlHigh:29500,ulLow:26500,ulHigh:29500,nrarfcnOffset:2054166,nrarfcnRange:[2054166,2104165],duplexType:"TDD"},{band:258,name:"26 GHz",dlLow:24250,dlHigh:27500,ulLow:24250,ulHigh:27500,nrarfcnOffset:2016667,nrarfcnRange:[2016667,2070832],duplexType:"TDD"},{band:259,name:"41 GHz",dlLow:39500,dlHigh:43500,ulLow:39500,ulHigh:43500,nrarfcnOffset:2270832,nrarfcnRange:[2270832,2337499],duplexType:"TDD"},{band:260,name:"39 GHz",dlLow:37e3,dlHigh:4e4,ulLow:37e3,ulHigh:4e4,nrarfcnOffset:2229166,nrarfcnRange:[2229166,2279165],duplexType:"TDD"},{band:261,name:"28 GHz",dlLow:27500,dlHigh:28350,ulLow:27500,ulHigh:28350,nrarfcnOffset:2070833,nrarfcnRange:[2070833,2084999],duplexType:"TDD"}],L=e=>{let a=[];for(let n of H)if(e>=n.earfcnRange[0]&&e<=n.earfcnRange[1]){let l,r;let s=n.dlLow+(e-n.earfcnOffset)*n.spacing;if("FDD"===n.duplexType){let a=e-n.earfcnOffset;l=e+18e3,r=n.ulLow+a*n.spacing}else l=e,r=s;a.push({...n,dlFrequency:s.toFixed(2),ulFrequency:r.toFixed(2),ulEarfcn:l})}return 0===a.length?null:{networkType:"LTE",earfcn:e,frequency:a[0].dlFrequency,possibleBands:a}},v=e=>{let a;if(e>=0&&e<=599999)a=0+(e-0)*.005;else if(e>=6e5&&e<=2016666)a=3e3+(e-6e5)*.015;else{if(!(e>=2016667)||!(e<=3279165))return null;a=24250.08+(e-2016667)*.06}let n=[];for(let a of N)e>=a.nrarfcnRange[0]&&e<=a.nrarfcnRange[1]&&n.push(a);return 0===n.length?null:{networkType:"NR",earfcn:e,frequency:a.toFixed(2),possibleBands:n}},T=function(e){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=parseInt(e);return isNaN(n)?{error:"Please enter a valid number"}:"lte"===a||null===a&&n>=0&&n<=68935?L(n):"nr"===a||null===a&&n>=123400?v(n):null};(0,r.useEffect)(()=>{if(window.localStorage)try{let e=localStorage.getItem("earfcnHistory");if(h("earfcnHistory"),e)try{let a=JSON.parse(e);console.log("Parsed history:",a),D(a)}catch(e){console.error("Error parsing history JSON:",e),D([])}}catch(e){console.error("Error accessing localStorage:",e),D([])}},[]),(0,r.useEffect)(()=>{if(console.log("History changed, saving to localStorage:",b),window.localStorage)try{if(b.length>0){let e=JSON.stringify(b);console.log("Serialized history:",e),localStorage.setItem("earfcnHistory",e)}else localStorage.removeItem("earfcnHistory");h("earfcnHistory")}catch(e){console.error("Error saving history to localStorage:",e)}},[b]);let R=e=>{D(a=>a.filter(a=>a.id!==e))};return(0,l.jsxs)(s.Zp,{className:"w-full",children:[(0,l.jsxs)(s.aR,{children:[(0,l.jsx)(s.ZB,{children:"E/ARFCN Calculator"}),(0,l.jsx)(s.BT,{children:"Calculate frequency information from E/ARFCN for LTE and NR-ARFCN for 5G"})]}),(0,l.jsxs)(s.Wu,{children:[(0,l.jsx)(f,{defaultValue:"auto",value:y,onValueChange:e=>w(e),className:"mb-6",children:(0,l.jsxs)(u,{className:"grid w-full grid-cols-3",children:[(0,l.jsx)(g,{value:"auto",children:"Auto-Detect"}),(0,l.jsx)(g,{value:"lte",children:"LTE (4G)"}),(0,l.jsx)(g,{value:"nr",children:"NR (5G)"})]})}),(0,l.jsxs)("div",{className:"flex space-x-4 mb-6",children:[(0,l.jsxs)("div",{className:"flex-1",children:[(0,l.jsx)(i.J,{htmlFor:"earfcn",className:"mb-2 block",children:"lte"===y?"E-ARFCN":"nr"===y?"NR-ARFCN":"E/ARFCN Value"}),(0,l.jsx)(d.p,{id:"earfcn",type:"number",placeholder:"Enter channel number",value:e,onChange:e=>a(e.target.value),className:"w-full"})]}),(0,l.jsx)("div",{className:"flex items-end",children:(0,l.jsx)(t.$,{onClick:()=>{if(!e){x("Please enter an E/ARFCN value"),o(null);return}try{let a=T(e,"auto"===y?null:y);if(!a||"error"in a)a&&"error"in a?x(a.error):x("Could not identify band for this E/ARFCN value"),o(null);else{o(a),x("");let e={...a,timestamp:new Date().toISOString(),id:Date.now().toString()};D(a=>[e,...a.slice(0,9)])}}catch(a){let e=a instanceof Error?a.message:"Unknown error";console.error("Calculation error:",a),x("Calculation error: "+e),o(null)}},children:"Calculate"})})]}),c&&(0,l.jsx)("div",{className:"p-3 mb-6 bg-red-50 border border-red-200 text-red-700 rounded",children:c}),n&&(0,l.jsxs)("div",{className:"p-4 border rounded-md bg-gray-50 dark:bg-gray-800",children:[(0,l.jsx)("h3",{className:"text-lg font-semibold mb-3",children:"Result"}),(0,l.jsxs)("div",{className:"grid grid-cols-2 gap-y-1 gap-x-4 mb-8",children:[(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Network Type"}),(0,l.jsx)("div",{className:"font-medium",children:n.networkType}),(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"LTE"===n.networkType?"EARFCN":"NR-ARFCN"}),(0,l.jsx)("div",{className:"font-medium",children:n.earfcn}),(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Frequency"}),(0,l.jsxs)("div",{className:"font-medium",children:[n.frequency," MHz"]})]}),(0,l.jsx)("h4",{className:"font-semibold mb-2",children:"Possible Operating Bands"}),(0,l.jsx)("div",{className:"space-y-4",children:n.possibleBands.map((e,a)=>(0,l.jsxs)("div",{className:"border-t pt-2 first:border-t-0 first:pt-0",children:[(0,l.jsxs)("div",{className:"font-semibold",children:["NR"===n.networkType?"n".concat(e.band):"Band ".concat(e.band)," ","(",e.name,")"]}),(0,l.jsxs)("div",{className:"grid grid-cols-2 gap-y-1 gap-x-4 mt-1 text-sm",children:[(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Duplex Mode"}),(0,l.jsx)("div",{className:"font-semibold",children:e.duplexType}),(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Downlink Range"}),(0,l.jsxs)("div",{className:"font-semibold",children:[e.dlLow," - ",e.dlHigh," MHz"]}),"FDD"===e.duplexType&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Uplink Range"}),(0,l.jsxs)("div",{className:"font-semibold",children:[e.ulLow," - ",e.ulHigh," MHz"]})]}),(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"LTE"===n.networkType?"EARFCN Range":"NR-ARFCN Range"}),(0,l.jsx)("div",{className:"font-semibold",children:"LTE"===n.networkType?"".concat(e.earfcnRange[0]," - ").concat(e.earfcnRange[1]):"".concat(e.nrarfcnRange[0]," - ").concat(e.nrarfcnRange[1])}),"LTE"===n.networkType&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Downlink Frequency"}),(0,l.jsxs)("div",{className:"font-semibold",children:[e.dlFrequency," MHz"]}),(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Uplink Frequency"}),(0,l.jsxs)("div",{className:"font-semibold",children:[e.ulFrequency," MHz"]}),"FDD"===e.duplexType&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Uplink EARFCN"}),(0,l.jsx)("div",{className:"font-semibold",children:e.ulEarfcn})]})]})]})]},a))}),(0,l.jsxs)("div",{className:"text-xs text-gray-500 mt-4",children:["Calculation method:"," ","NR"===n.networkType?"3GPP TS 38.104 Section 5.4.2.1":"3GPP TS 36.101 Section 5.7"]})]}),(0,l.jsxs)("div",{className:"mt-8",children:[(0,l.jsxs)("div",{className:"flex justify-between items-center mb-2",children:[(0,l.jsx)("h3",{className:"text-lg font-semibold",children:"Calculation History"}),b.length>0&&(0,l.jsxs)(t.$,{variant:"outline",size:"sm",onClick:()=>{D([])},className:"h-8",children:[(0,l.jsx)(m.A,{className:"h-4 w-4 mr-1"}),"Clear All"]})]}),0===b.length?(0,l.jsx)("div",{className:"text-center p-6 border rounded-md text-gray-500 dark:text-gray-400",children:"No calculation history yet. Enter an E/ARFCN value and click Calculate."}):(0,l.jsx)("div",{className:"space-y-2",children:b.map(e=>(0,l.jsxs)("div",{className:"p-3 border rounded-md flex justify-between items-start bg-gray-50 dark:bg-gray-800",children:[(0,l.jsxs)("div",{className:"flex-1",children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("span",{className:"font-semibold text-lg",children:e.earfcn}),(0,l.jsx)("span",{className:"mx-2 text-gray-400",children:"•"}),(0,l.jsxs)("span",{className:"text-sm",children:[e.frequency," MHz"]}),(0,l.jsx)("span",{className:"mx-2 text-gray-400",children:"•"}),(0,l.jsx)("span",{className:"text-sm",children:e.networkType})]}),e.possibleBands&&(0,l.jsxs)("div",{className:"text-sm text-gray-600 dark:text-gray-400 font-medium mt-1",children:["Bands:"," ",e.possibleBands.map(a=>"NR"===e.networkType?"n".concat(a.band):"".concat(a.band)).join(", ")]}),(0,l.jsx)("div",{className:"text-xs text-gray-500 dark:text-gray-500 mt-1",children:e.timestamp?new Date(e.timestamp).toLocaleString():"No timestamp"})]}),(0,l.jsx)(t.$,{variant:"ghost",size:"sm",onClick:()=>R(e.id),className:"text-gray-500 h-8 w-8 p-0",children:(0,l.jsx)(p.A,{className:"h-4 w-4"})})]},e.id))})]})]})]})}},42541:(e,a,n)=>{"use strict";n.d(a,{$:()=>o,r:()=>i});var l=n(20475),r=n(20107),s=n(61837),d=n(29395),t=n(22250);let i=(0,d.F)("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),o=r.forwardRef((e,a)=>{let{className:n,variant:r,size:d,asChild:o=!1,...c}=e,f=o?s.DX:"button";return(0,l.jsx)(f,{className:(0,t.cn)(i({variant:r,size:d,className:n})),ref:a,...c})});o.displayName="Button"},72167:(e,a,n)=>{"use strict";n.d(a,{BT:()=>o,Wu:()=>c,ZB:()=>i,Zp:()=>d,aR:()=>t,wL:()=>f});var l=n(20475),r=n(20107),s=n(22250);let d=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("div",{ref:a,className:(0,s.cn)("rounded-xl border bg-card text-card-foreground shadow",n),...r})});d.displayName="Card";let t=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("div",{ref:a,className:(0,s.cn)("flex flex-col space-y-1.5 p-6",n),...r})});t.displayName="CardHeader";let i=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("h3",{ref:a,className:(0,s.cn)("font-semibold leading-none tracking-tight",n),...r})});i.displayName="CardTitle";let o=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("p",{ref:a,className:(0,s.cn)("text-sm text-muted-foreground",n),...r})});o.displayName="CardDescription";let c=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("div",{ref:a,className:(0,s.cn)("p-6 pt-0",n),...r})});c.displayName="CardContent";let f=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("div",{ref:a,className:(0,s.cn)("flex items-center p-6 pt-0",n),...r})});f.displayName="CardFooter"},64219:(e,a,n)=>{"use strict";n.d(a,{p:()=>d});var l=n(20475),r=n(20107),s=n(22250);let d=r.forwardRef((e,a)=>{let{className:n,type:r,...d}=e;return(0,l.jsx)("input",{type:r,className:(0,s.cn)("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",n),ref:a,...d})});d.displayName="Input"},49153:(e,a,n)=>{"use strict";n.d(a,{J:()=>o});var l=n(20475),r=n(20107),s=n(21840),d=n(29395),t=n(22250);let i=(0,d.F)("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),o=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)(s.b,{ref:a,className:(0,t.cn)(i(),n),...r})});o.displayName=s.b.displayName},22250:(e,a,n)=>{"use strict";n.d(a,{cn:()=>s});var l=n(64901),r=n(868);function s(){for(var e=arguments.length,a=Array(e),n=0;n{var a=a=>e(e.s=a);e.O(0,[7780,9007,191,6035,7358],()=>a(33504)),_N_E=e.O()}]); \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/freq-calculator/page-76fc91defa16e132.js b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/freq-calculator/page-76fc91defa16e132.js new file mode 100644 index 0000000..588c6a5 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/chunks/app/dashboard/experimental/freq-calculator/page-76fc91defa16e132.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[666],{33504:(e,a,n)=>{Promise.resolve().then(n.bind(n,14332))},14332:(e,a,n)=>{"use strict";n.r(a),n.d(a,{default:()=>g});var l=n(20475),r=n(20107),s=n(72167),d=n(64219),t=n(42541),i=n(49153),o=n(37921),c=n(51873),f=n(58212);let u=e=>{if(window.localStorage)try{let a=localStorage.getItem(e);console.log("LocalStorage value for ".concat(e,":"),a?JSON.parse(a):"null")}catch(e){console.error("Error reading from localStorage:",e)}else console.log("localStorage not available")},g=()=>{let[e,a]=(0,r.useState)(""),[n,g]=(0,r.useState)(null),[m,p]=(0,r.useState)(""),[h,x]=(0,r.useState)("auto"),[y,w]=(0,r.useState)([]),b=[{band:1,name:"2100",dlLow:2110,dlHigh:2170,ulLow:1920,ulHigh:1980,earfcnOffset:0,earfcnRange:[0,599],spacing:.1,duplexType:"FDD"},{band:2,name:"1900 PCS",dlLow:1930,dlHigh:1990,ulLow:1850,ulHigh:1910,earfcnOffset:600,earfcnRange:[600,1199],spacing:.1,duplexType:"FDD"},{band:3,name:"1800",dlLow:1805,dlHigh:1880,ulLow:1710,ulHigh:1785,earfcnOffset:1200,earfcnRange:[1200,1949],spacing:.1,duplexType:"FDD"},{band:4,name:"AWS-1",dlLow:2110,dlHigh:2155,ulLow:1710,ulHigh:1755,earfcnOffset:1950,earfcnRange:[1950,2399],spacing:.1,duplexType:"FDD"},{band:5,name:"850",dlLow:869,dlHigh:894,ulLow:824,ulHigh:849,earfcnOffset:2400,earfcnRange:[2400,2649],spacing:.1,duplexType:"FDD"},{band:7,name:"2600",dlLow:2620,dlHigh:2690,ulLow:2500,ulHigh:2570,earfcnOffset:2750,earfcnRange:[2750,3449],spacing:.1,duplexType:"FDD"},{band:8,name:"900",dlLow:925,dlHigh:960,ulLow:880,ulHigh:915,earfcnOffset:3450,earfcnRange:[3450,3799],spacing:.1,duplexType:"FDD"},{band:12,name:"700 a",dlLow:729,dlHigh:746,ulLow:699,ulHigh:716,earfcnOffset:5010,earfcnRange:[5010,5179],spacing:.1,duplexType:"FDD"},{band:13,name:"700 c",dlLow:746,dlHigh:756,ulLow:777,ulHigh:787,earfcnOffset:5180,earfcnRange:[5180,5279],spacing:.1,duplexType:"FDD"},{band:14,name:"700 PS",dlLow:758,dlHigh:768,ulLow:788,ulHigh:798,earfcnOffset:5280,earfcnRange:[5280,5379],spacing:.1,duplexType:"FDD"},{band:17,name:"700 b",dlLow:734,dlHigh:746,ulLow:704,ulHigh:716,earfcnOffset:5730,earfcnRange:[5730,5849],spacing:.1,duplexType:"FDD"},{band:20,name:"800 DD",dlLow:791,dlHigh:821,ulLow:832,ulHigh:862,earfcnOffset:6150,earfcnRange:[6150,6449],spacing:.1,duplexType:"FDD"},{band:25,name:"1900+",dlLow:1930,dlHigh:1995,ulLow:1850,ulHigh:1915,earfcnOffset:8040,earfcnRange:[8040,8689],spacing:.1,duplexType:"FDD"},{band:26,name:"850+",dlLow:859,dlHigh:894,ulLow:814,ulHigh:849,earfcnOffset:8690,earfcnRange:[8690,9039],spacing:.1,duplexType:"FDD"},{band:28,name:"700 APT",dlLow:758,dlHigh:803,ulLow:703,ulHigh:748,earfcnOffset:9210,earfcnRange:[9210,9659],spacing:.1,duplexType:"FDD"},{band:66,name:"AWS-3",dlLow:2110,dlHigh:2200,ulLow:1710,ulHigh:1780,earfcnOffset:66436,earfcnRange:[66436,67335],spacing:.1,duplexType:"FDD"},{band:71,name:"600",dlLow:617,dlHigh:652,ulLow:663,ulHigh:698,earfcnOffset:68586,earfcnRange:[68586,68935],spacing:.1,duplexType:"FDD"},{band:38,name:"TD 2600",dlLow:2570,dlHigh:2620,ulLow:2570,ulHigh:2620,earfcnOffset:37750,earfcnRange:[37750,38249],spacing:.1,duplexType:"TDD"},{band:40,name:"TD 2300",dlLow:2300,dlHigh:2400,ulLow:2300,ulHigh:2400,earfcnOffset:38650,earfcnRange:[38650,39649],spacing:.1,duplexType:"TDD"},{band:41,name:"TD 2500",dlLow:2496,dlHigh:2690,ulLow:2496,ulHigh:2690,earfcnOffset:39650,earfcnRange:[39650,41589],spacing:.1,duplexType:"TDD"},{band:48,name:"CBRS",dlLow:3550,dlHigh:3700,ulLow:3550,ulHigh:3700,earfcnOffset:55240,earfcnRange:[55240,56739],spacing:.1,duplexType:"TDD"}],D=[{band:5,name:"850",dlLow:869,dlHigh:894,ulLow:824,ulHigh:849,nrarfcnOffset:173800,nrarfcnRange:[173800,178800],duplexType:"FDD"},{band:8,name:"900",dlLow:925,dlHigh:960,ulLow:880,ulHigh:915,nrarfcnOffset:185e3,nrarfcnRange:[185e3,192e3],duplexType:"FDD"},{band:12,name:"700 a",dlLow:729,dlHigh:746,ulLow:699,ulHigh:716,nrarfcnOffset:145800,nrarfcnRange:[145800,149200],duplexType:"FDD"},{band:14,name:"700 PS",dlLow:758,dlHigh:768,ulLow:788,ulHigh:798,nrarfcnOffset:151600,nrarfcnRange:[151600,153600],duplexType:"FDD"},{band:20,name:"800 DD",dlLow:791,dlHigh:821,ulLow:832,ulHigh:862,nrarfcnOffset:158200,nrarfcnRange:[158200,164200],duplexType:"FDD"},{band:28,name:"700 APT",dlLow:758,dlHigh:803,ulLow:703,ulHigh:748,nrarfcnOffset:151600,nrarfcnRange:[151600,160600],duplexType:"FDD"},{band:71,name:"600",dlLow:617,dlHigh:652,ulLow:663,ulHigh:698,nrarfcnOffset:123400,nrarfcnRange:[123400,130400],duplexType:"FDD"},{band:1,name:"2100",dlLow:2110,dlHigh:2170,ulLow:1920,ulHigh:1980,nrarfcnOffset:422e3,nrarfcnRange:[422e3,434e3],duplexType:"FDD"},{band:2,name:"1900 PCS",dlLow:1930,dlHigh:1990,ulLow:1850,ulHigh:1910,nrarfcnOffset:386e3,nrarfcnRange:[386e3,398e3],duplexType:"FDD"},{band:3,name:"1800",dlLow:1805,dlHigh:1880,ulLow:1710,ulHigh:1785,nrarfcnOffset:361e3,nrarfcnRange:[361e3,376e3],duplexType:"FDD"},{band:7,name:"2600",dlLow:2620,dlHigh:2690,ulLow:2500,ulHigh:2570,nrarfcnOffset:524e3,nrarfcnRange:[524e3,538e3],duplexType:"FDD"},{band:25,name:"1900+",dlLow:1930,dlHigh:1995,ulLow:1850,ulHigh:1915,nrarfcnOffset:386e3,nrarfcnRange:[386e3,399e3],duplexType:"FDD"},{band:66,name:"AWS-3",dlLow:2110,dlHigh:2200,ulLow:1710,ulHigh:1780,nrarfcnOffset:422e3,nrarfcnRange:[422e3,44e4],duplexType:"FDD"},{band:70,name:"AWS-4",dlLow:1995,dlHigh:2020,ulLow:1695,ulHigh:1710,nrarfcnOffset:399e3,nrarfcnRange:[399e3,404e3],duplexType:"FDD"},{band:34,name:"2000 TDD",dlLow:2010,dlHigh:2025,ulLow:2010,ulHigh:2025,nrarfcnOffset:402e3,nrarfcnRange:[402e3,405e3],duplexType:"TDD"},{band:38,name:"TD 2600",dlLow:2570,dlHigh:2620,ulLow:2570,ulHigh:2620,nrarfcnOffset:514e3,nrarfcnRange:[514e3,524e3],duplexType:"TDD"},{band:39,name:"IMT 1900 TDD",dlLow:1880,dlHigh:1920,ulLow:1880,ulHigh:1920,nrarfcnOffset:376e3,nrarfcnRange:[376e3,384e3],duplexType:"TDD"},{band:40,name:"TD 2300",dlLow:2300,dlHigh:2400,ulLow:2300,ulHigh:2400,nrarfcnOffset:46e4,nrarfcnRange:[46e4,48e4],duplexType:"TDD"},{band:41,name:"TD 2500",dlLow:2496,dlHigh:2690,ulLow:2496,ulHigh:2690,nrarfcnOffset:499200,nrarfcnRange:[499200,537999],duplexType:"TDD"},{band:48,name:"CBRS",dlLow:3550,dlHigh:3700,ulLow:3550,ulHigh:3700,nrarfcnOffset:636667,nrarfcnRange:[636667,646666],duplexType:"TDD"},{band:77,name:"C-Band",dlLow:3300,dlHigh:4200,ulLow:3300,ulHigh:4200,nrarfcnOffset:62e4,nrarfcnRange:[62e4,68e4],duplexType:"TDD"},{band:78,name:"C-Band (3.5GHz)",dlLow:3300,dlHigh:3800,ulLow:3300,ulHigh:3800,nrarfcnOffset:62e4,nrarfcnRange:[62e4,653333],duplexType:"TDD"},{band:79,name:"4.5GHz",dlLow:4400,dlHigh:5e3,ulLow:4400,ulHigh:5e3,nrarfcnOffset:693334,nrarfcnRange:[693334,733333],duplexType:"TDD"},{band:90,name:"TD 2600",dlLow:2496,dlHigh:2690,ulLow:2496,ulHigh:2690,nrarfcnOffset:499200,nrarfcnRange:[499200,538e3],duplexType:"TDD"},{band:257,name:"28 GHz",dlLow:26500,dlHigh:29500,ulLow:26500,ulHigh:29500,nrarfcnOffset:2054166,nrarfcnRange:[2054166,2104165],duplexType:"TDD"},{band:258,name:"26 GHz",dlLow:24250,dlHigh:27500,ulLow:24250,ulHigh:27500,nrarfcnOffset:2016667,nrarfcnRange:[2016667,2070832],duplexType:"TDD"},{band:259,name:"41 GHz",dlLow:39500,dlHigh:43500,ulLow:39500,ulHigh:43500,nrarfcnOffset:2270832,nrarfcnRange:[2270832,2337499],duplexType:"TDD"},{band:260,name:"39 GHz",dlLow:37e3,dlHigh:4e4,ulLow:37e3,ulHigh:4e4,nrarfcnOffset:2229166,nrarfcnRange:[2229166,2279165],duplexType:"TDD"},{band:261,name:"28 GHz",dlLow:27500,dlHigh:28350,ulLow:27500,ulHigh:28350,nrarfcnOffset:2070833,nrarfcnRange:[2070833,2084999],duplexType:"TDD"}],H=e=>{let a=[];for(let n of b)if(e>=n.earfcnRange[0]&&e<=n.earfcnRange[1]){let l,r;let s=n.dlLow+(e-n.earfcnOffset)*n.spacing;if("FDD"===n.duplexType){let a=e-n.earfcnOffset;l=e+18e3,r=n.ulLow+a*n.spacing}else l=e,r=s;a.push({...n,dlFrequency:s.toFixed(2),ulFrequency:r.toFixed(2),ulEarfcn:l})}return 0===a.length?null:{networkType:"LTE",earfcn:e,frequency:a[0].dlFrequency,possibleBands:a}},N=e=>{let a;if(e>=0&&e<=599999)a=0+(e-0)*.005;else if(e>=6e5&&e<=2016666)a=3e3+(e-6e5)*.015;else{if(!(e>=2016667)||!(e<=3279165))return null;a=24250.08+(e-2016667)*.06}let n=[];for(let a of D)e>=a.nrarfcnRange[0]&&e<=a.nrarfcnRange[1]&&n.push(a);return 0===n.length?null:{networkType:"NR",earfcn:e,frequency:a.toFixed(2),possibleBands:n}},L=function(e){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=parseInt(e);return isNaN(n)?{error:"Please enter a valid number"}:"lte"===a||null===a&&n>=0&&n<=68935?H(n):"nr"===a||null===a&&n>=123400?N(n):null};(0,r.useEffect)(()=>{if(window.localStorage)try{let e=localStorage.getItem("earfcnHistory");if(u("earfcnHistory"),e)try{let a=JSON.parse(e);console.log("Parsed history:",a),w(a)}catch(e){console.error("Error parsing history JSON:",e),w([])}}catch(e){console.error("Error accessing localStorage:",e),w([])}},[]),(0,r.useEffect)(()=>{if(console.log("History changed, saving to localStorage:",y),window.localStorage)try{if(y.length>0){let e=JSON.stringify(y);console.log("Serialized history:",e),localStorage.setItem("earfcnHistory",e)}else localStorage.removeItem("earfcnHistory");u("earfcnHistory")}catch(e){console.error("Error saving history to localStorage:",e)}},[y]);let v=e=>{w(a=>a.filter(a=>a.id!==e))};return(0,l.jsxs)(s.Zp,{className:"w-full",children:[(0,l.jsxs)(s.aR,{children:[(0,l.jsx)(s.ZB,{children:"E/ARFCN Calculator"}),(0,l.jsx)(s.BT,{children:"Calculate frequency information from E/ARFCN for LTE and NR-ARFCN for 5G"})]}),(0,l.jsxs)(s.Wu,{children:[(0,l.jsx)(o.tU,{defaultValue:"auto",value:h,onValueChange:e=>x(e),className:"mb-6",children:(0,l.jsxs)(o.j7,{className:"grid w-full grid-cols-3",children:[(0,l.jsx)(o.Xi,{value:"auto",children:"Auto-Detect"}),(0,l.jsx)(o.Xi,{value:"lte",children:"LTE (4G)"}),(0,l.jsx)(o.Xi,{value:"nr",children:"NR (5G)"})]})}),(0,l.jsxs)("div",{className:"flex space-x-4 mb-6",children:[(0,l.jsxs)("div",{className:"flex-1",children:[(0,l.jsx)(i.J,{htmlFor:"earfcn",className:"mb-2 block",children:"lte"===h?"E-ARFCN":"nr"===h?"NR-ARFCN":"E/ARFCN Value"}),(0,l.jsx)(d.p,{id:"earfcn",type:"number",placeholder:"Enter channel number",value:e,onChange:e=>a(e.target.value),className:"w-full"})]}),(0,l.jsx)("div",{className:"flex items-end",children:(0,l.jsx)(t.$,{onClick:()=>{if(!e){p("Please enter an E/ARFCN value"),g(null);return}try{let a=L(e,"auto"===h?null:h);if(!a||"error"in a)a&&"error"in a?p(a.error):p("Could not identify band for this E/ARFCN value"),g(null);else{g(a),p("");let e={...a,timestamp:new Date().toISOString(),id:Date.now().toString()};w(a=>[e,...a.slice(0,9)])}}catch(a){let e=a instanceof Error?a.message:"Unknown error";console.error("Calculation error:",a),p("Calculation error: "+e),g(null)}},children:"Calculate"})})]}),m&&(0,l.jsx)("div",{className:"p-3 mb-6 bg-red-50 border border-red-200 text-red-700 rounded",children:m}),n&&(0,l.jsxs)("div",{className:"p-4 border rounded-md bg-gray-50 dark:bg-gray-800",children:[(0,l.jsx)("h3",{className:"text-lg font-semibold mb-3",children:"Result"}),(0,l.jsxs)("div",{className:"grid grid-cols-2 gap-y-1 gap-x-4 mb-8",children:[(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Network Type"}),(0,l.jsx)("div",{className:"font-medium",children:n.networkType}),(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"LTE"===n.networkType?"EARFCN":"NR-ARFCN"}),(0,l.jsx)("div",{className:"font-medium",children:n.earfcn}),(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Frequency"}),(0,l.jsxs)("div",{className:"font-medium",children:[n.frequency," MHz"]})]}),(0,l.jsx)("h4",{className:"font-semibold mb-2",children:"Possible Operating Bands"}),(0,l.jsx)("div",{className:"space-y-4",children:n.possibleBands.map((e,a)=>(0,l.jsxs)("div",{className:"border-t pt-2 first:border-t-0 first:pt-0",children:[(0,l.jsxs)("div",{className:"font-semibold",children:["NR"===n.networkType?"n".concat(e.band):"Band ".concat(e.band)," ","(",e.name,")"]}),(0,l.jsxs)("div",{className:"grid grid-cols-2 gap-y-1 gap-x-4 mt-1 text-sm",children:[(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Duplex Mode"}),(0,l.jsx)("div",{className:"font-semibold",children:e.duplexType}),(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Downlink Range"}),(0,l.jsxs)("div",{className:"font-semibold",children:[e.dlLow," - ",e.dlHigh," MHz"]}),"FDD"===e.duplexType&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Uplink Range"}),(0,l.jsxs)("div",{className:"font-semibold",children:[e.ulLow," - ",e.ulHigh," MHz"]})]}),(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"LTE"===n.networkType?"EARFCN Range":"NR-ARFCN Range"}),(0,l.jsx)("div",{className:"font-semibold",children:"LTE"===n.networkType?"".concat(e.earfcnRange[0]," - ").concat(e.earfcnRange[1]):"".concat(e.nrarfcnRange[0]," - ").concat(e.nrarfcnRange[1])}),"LTE"===n.networkType&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Downlink Frequency"}),(0,l.jsxs)("div",{className:"font-semibold",children:[e.dlFrequency," MHz"]}),(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Uplink Frequency"}),(0,l.jsxs)("div",{className:"font-semibold",children:[e.ulFrequency," MHz"]}),"FDD"===e.duplexType&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"text-gray-600 dark:text-gray-400 font-medium",children:"Uplink EARFCN"}),(0,l.jsx)("div",{className:"font-semibold",children:e.ulEarfcn})]})]})]})]},a))}),(0,l.jsxs)("div",{className:"text-xs text-gray-500 mt-4",children:["Calculation method:"," ","NR"===n.networkType?"3GPP TS 38.104 Section 5.4.2.1":"3GPP TS 36.101 Section 5.7"]})]}),(0,l.jsxs)("div",{className:"mt-8",children:[(0,l.jsxs)("div",{className:"flex justify-between items-center mb-2",children:[(0,l.jsx)("h3",{className:"text-lg font-semibold",children:"Calculation History"}),y.length>0&&(0,l.jsxs)(t.$,{variant:"outline",size:"sm",onClick:()=>{w([])},className:"h-8",children:[(0,l.jsx)(c.A,{className:"h-4 w-4 mr-1"}),"Clear All"]})]}),0===y.length?(0,l.jsx)("div",{className:"text-center p-6 border rounded-md text-gray-500 dark:text-gray-400",children:"No calculation history yet. Enter an E/ARFCN value and click Calculate."}):(0,l.jsx)("div",{className:"space-y-2",children:y.map(e=>(0,l.jsxs)("div",{className:"p-3 border rounded-md flex justify-between items-start bg-gray-50 dark:bg-gray-800",children:[(0,l.jsxs)("div",{className:"flex-1",children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("span",{className:"font-semibold text-lg",children:e.earfcn}),(0,l.jsx)("span",{className:"mx-2 text-gray-400",children:"•"}),(0,l.jsxs)("span",{className:"text-sm",children:[e.frequency," MHz"]}),(0,l.jsx)("span",{className:"mx-2 text-gray-400",children:"•"}),(0,l.jsx)("span",{className:"text-sm",children:e.networkType})]}),e.possibleBands&&(0,l.jsxs)("div",{className:"text-sm text-gray-600 dark:text-gray-400 font-medium mt-1",children:["Bands:"," ",e.possibleBands.map(a=>"NR"===e.networkType?"n".concat(a.band):"".concat(a.band)).join(", ")]}),(0,l.jsx)("div",{className:"text-xs text-gray-500 dark:text-gray-500 mt-1",children:e.timestamp?new Date(e.timestamp).toLocaleString():"No timestamp"})]}),(0,l.jsx)(t.$,{variant:"ghost",size:"sm",onClick:()=>v(e.id),className:"text-gray-500 h-8 w-8 p-0",children:(0,l.jsx)(f.A,{className:"h-4 w-4"})})]},e.id))})]})]})]})}},42541:(e,a,n)=>{"use strict";n.d(a,{$:()=>o,r:()=>i});var l=n(20475),r=n(20107),s=n(61837),d=n(29395),t=n(22250);let i=(0,d.F)("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),o=r.forwardRef((e,a)=>{let{className:n,variant:r,size:d,asChild:o=!1,...c}=e,f=o?s.DX:"button";return(0,l.jsx)(f,{className:(0,t.cn)(i({variant:r,size:d,className:n})),ref:a,...c})});o.displayName="Button"},72167:(e,a,n)=>{"use strict";n.d(a,{BT:()=>o,Wu:()=>c,ZB:()=>i,Zp:()=>d,aR:()=>t,wL:()=>f});var l=n(20475),r=n(20107),s=n(22250);let d=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("div",{ref:a,className:(0,s.cn)("rounded-xl border bg-card text-card-foreground shadow",n),...r})});d.displayName="Card";let t=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("div",{ref:a,className:(0,s.cn)("flex flex-col space-y-1.5 p-6",n),...r})});t.displayName="CardHeader";let i=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("h3",{ref:a,className:(0,s.cn)("font-semibold leading-none tracking-tight",n),...r})});i.displayName="CardTitle";let o=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("p",{ref:a,className:(0,s.cn)("text-sm text-muted-foreground",n),...r})});o.displayName="CardDescription";let c=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("div",{ref:a,className:(0,s.cn)("p-6 pt-0",n),...r})});c.displayName="CardContent";let f=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)("div",{ref:a,className:(0,s.cn)("flex items-center p-6 pt-0",n),...r})});f.displayName="CardFooter"},64219:(e,a,n)=>{"use strict";n.d(a,{p:()=>d});var l=n(20475),r=n(20107),s=n(22250);let d=r.forwardRef((e,a)=>{let{className:n,type:r,...d}=e;return(0,l.jsx)("input",{type:r,className:(0,s.cn)("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",n),ref:a,...d})});d.displayName="Input"},49153:(e,a,n)=>{"use strict";n.d(a,{J:()=>o});var l=n(20475),r=n(20107),s=n(21840),d=n(29395),t=n(22250);let i=(0,d.F)("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),o=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)(s.b,{ref:a,className:(0,t.cn)(i(),n),...r})});o.displayName=s.b.displayName},37921:(e,a,n)=>{"use strict";n.d(a,{Xi:()=>o,av:()=>c,j7:()=>i,tU:()=>t});var l=n(20475),r=n(20107),s=n(93677),d=n(22250);let t=s.bL,i=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)(s.B8,{ref:a,className:(0,d.cn)("inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",n),...r})});i.displayName=s.B8.displayName;let o=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)(s.l9,{ref:a,className:(0,d.cn)("inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow",n),...r})});o.displayName=s.l9.displayName;let c=r.forwardRef((e,a)=>{let{className:n,...r}=e;return(0,l.jsx)(s.UC,{ref:a,className:(0,d.cn)("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",n),...r})});c.displayName=s.UC.displayName},22250:(e,a,n)=>{"use strict";n.d(a,{cn:()=>s});var l=n(64901),r=n(868);function s(){for(var e=arguments.length,a=Array(e),n=0;n{var a=a=>e(e.s=a);e.O(0,[7780,3453,5755,191,6035,7358],()=>a(33504)),_N_E=e.O()}]); \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/css/2adbd6ec1a3f6224.css b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/css/2adbd6ec1a3f6224.css new file mode 100644 index 0000000..bdae879 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/css/2adbd6ec1a3f6224.css @@ -0,0 +1,3 @@ +*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/* +! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com +*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}:root{--background:0 0% 100%;--foreground:224 71.4% 4.1%;--card:0 0% 100%;--card-foreground:224 71.4% 4.1%;--popover:0 0% 100%;--popover-foreground:224 71.4% 4.1%;--primary:262.1 83.3% 57.8%;--primary-foreground:210 20% 98%;--secondary:220 14.3% 95.9%;--secondary-foreground:220.9 39.3% 11%;--muted:220 14.3% 95.9%;--muted-foreground:220 8.9% 46.1%;--accent:220 14.3% 95.9%;--accent-foreground:220.9 39.3% 11%;--destructive:0 84.2% 60.2%;--destructive-foreground:210 20% 98%;--border:220 13% 91%;--input:220 13% 91%;--ring:262.1 83.3% 57.8%;--radius:0.5rem;--chart-1:12 76% 61%;--chart-2:173 58% 39%;--chart-3:197 37% 24%;--chart-4:43 74% 66%;--chart-5:27 87% 67%}.dark{--background:224 71.4% 4.1%;--foreground:210 20% 98%;--card:224 71.4% 4.1%;--card-foreground:210 20% 98%;--popover:224 71.4% 4.1%;--popover-foreground:210 20% 98%;--primary:263.4 70% 50.4%;--primary-foreground:210 20% 98%;--secondary:215 27.9% 16.9%;--secondary-foreground:210 20% 98%;--muted:215 27.9% 16.9%;--muted-foreground:217.9 10.6% 64.9%;--accent:215 27.9% 16.9%;--accent-foreground:210 20% 98%;--destructive:0 62.8% 30.6%;--destructive-foreground:210 20% 98%;--border:215 27.9% 16.9%;--input:215 27.9% 16.9%;--ring:263.4 70% 50.4%;--chart-1:220 70% 50%;--chart-2:160 60% 45%;--chart-3:30 80% 55%;--chart-4:280 65% 60%;--chart-5:340 75% 55%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.-bottom-12{bottom:-3rem}.-left-12{left:-3rem}.-left-8{left:-2rem}.-right-12{right:-3rem}.-top-12{top:-3rem}.-top-8{top:-2rem}.bottom-0{bottom:0}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:.5rem}.left-\[50\%\]{left:50%}.right-0{right:0}.right-1{right:.25rem}.right-2{right:.5rem}.right-4{right:1rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-2{top:.5rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-50{z-index:50}.z-\[100\]{z-index:100}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-8{grid-column:span 8/span 8}.row-start-2{grid-row-start:2}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.-ml-4{margin-left:-1rem}.-mt-4{margin-top:-1rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-24{margin-top:6rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.size-16{width:4rem;height:4rem}.size-32{width:8rem;height:8rem}.size-4{width:1rem;height:1rem}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-44{height:11rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-\[1\.2rem\]{height:1.2rem}.h-\[140px\]{height:140px}.h-\[1px\]{height:1px}.h-\[200px\]{height:200px}.h-\[250px\]{height:250px}.h-\[400px\]{height:400px}.h-\[50\%\]{height:50%}.h-\[500px\]{height:500px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-96{max-height:24rem}.max-h-\[200px\]{max-height:200px}.max-h-screen{max-height:100vh}.min-h-\[300px\]{min-height:300px}.min-h-\[60px\]{min-height:60px}.min-h-\[calc\(100vh_-_theme\(spacing\.16\)\)\]{min-height:calc(100vh - 4rem)}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:.25rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[1\.2rem\]{width:1.2rem}.w-\[100px\]{width:100px}.w-\[140px\]{width:140px}.w-\[180px\]{width:180px}.w-\[1px\]{width:1px}.w-\[200px\]{width:200px}.w-\[350px\]{width:350px}.w-\[40\%\]{width:40%}.w-\[50px\]{width:50px}.w-\[80px\]{width:80px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-10{max-width:2.5rem}.max-w-2xl{max-width:42rem}.max-w-32{max-width:8rem}.max-w-6{max-width:1.5rem}.max-w-6xl{max-width:72rem}.max-w-\[180px\]{max-width:180px}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.caption-bottom{caption-side:bottom}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.translate-x-\[-50\%\]{--tw-translate-x:-50%}.translate-x-\[-50\%\],.translate-y-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y:-50%}.rotate-0{--tw-rotate:0deg}.rotate-0,.rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate:90deg}.scale-0{--tw-scale-x:0;--tw-scale-y:0}.scale-0,.scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{user-select:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-flow-row{grid-auto-flow:row}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-\[20px_1fr_20px\]{grid-template-rows:20px 1fr 20px}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-evenly{justify-content:space-evenly}.justify-items-center{justify-items:center}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-px{gap:1px}.gap-x-2{column-gap:.5rem}.gap-x-4{column-gap:1rem}.gap-x-8{column-gap:2rem}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.gap-y-5{row-gap:1.25rem}.gap-y-6{row-gap:1.5rem}.gap-y-8{row-gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem * var(--tw-space-x-reverse));margin-left:calc(.375rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:.75rem}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.border{border-width:1px}.border-2{border-width:2px}.border-\[1\.5px\]{border-width:1.5px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-\[--color-border\]{border-color:var(--color-border)}.border-border\/50{border-color:hsl(var(--border)/.5)}.border-destructive{border-color:hsl(var(--destructive))}.border-destructive\/50{border-color:hsl(var(--destructive)/.5)}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-\[--color-bg\]{background-color:var(--color-bg)}.bg-accent{background-color:hsl(var(--accent))}.bg-background{background-color:hsl(var(--background))}.bg-black\/80{background-color:rgba(0,0,0,.8)}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/30{background-color:hsl(var(--muted)/.3)}.bg-muted\/40{background-color:hsl(var(--muted)/.4)}.bg-muted\/50{background-color:hsl(var(--muted)/.5)}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary)/.1)}.bg-primary\/20{background-color:hsl(var(--primary)/.2)}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-\[1px\]{padding:1px}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[0\.8rem\]{font-size:.8rem}.text-\[3rem\]{font-size:3rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-widest{letter-spacing:.1em}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/50{color:hsl(var(--foreground)/.5)}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-muted{color:hsl(var(--muted))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-violet-500{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.fade-in-0{--tw-enter-opacity:0}.zoom-in-95{--tw-enter-scale:.95}.duration-100{animation-duration:.1s}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.running{animation-play-state:running}.text-balance{text-wrap:balance}.\[appearance\:textfield\]{appearance:textfield}.file\:border-0::file-selector-button{border-width:0}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.first\:border-t-0:first-child{border-top-width:0}.first\:pt-0:first-child{padding-top:0}.even\:border-l:nth-child(2n){border-left-width:1px}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-accent\/50:hover{background-color:hsl(var(--accent)/.5)}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive)/.8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive)/.9)}.hover\:bg-emerald-800:hover{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted)/.5)}.hover\:bg-orange-800:hover{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary)/.8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary)/.9)}.hover\:bg-rose-800:hover{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.hover\:bg-secondary:hover{background-color:hsl(var(--secondary))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary)/.8)}.hover\:bg-slate-100:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-muted-foreground:hover{color:hsl(var(--muted-foreground))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-1:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.group.destructive .group-\[\.destructive\]\:border-muted\/40{border-color:hsl(var(--muted)/.4)}.group.destructive .group-\[\.destructive\]\:text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.group.destructive .group-\[\.destructive\]\:hover\:border-destructive\/30:hover{border-color:hsl(var(--destructive)/.3)}.group.destructive .group-\[\.destructive\]\:hover\:bg-destructive:hover{background-color:hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:hover\:text-destructive-foreground:hover{color:hsl(var(--destructive-foreground))}.group.destructive .group-\[\.destructive\]\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.group.destructive .group-\[\.destructive\]\:focus\:ring-destructive:focus{--tw-ring-color:hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(248 113 113/var(--tw-ring-opacity))}.group.destructive .group-\[\.destructive\]\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:0.25rem}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom],.data-\[side\=left\]\:-translate-x-1[data-side=left]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:-0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right],.data-\[side\=top\]\:-translate-y-1[data-side=top]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:-0.25rem}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x:var(--radix-toast-swipe-end-x)}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end],.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x:var(--radix-toast-swipe-move-x)}@keyframes accordion-up{0%{height:var(--radix-accordion-content-height)}to{height:0}}.data-\[state\=closed\]\:animate-accordion-up[data-state=closed]{animation:accordion-up .2s ease-out}@keyframes accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height)}}.data-\[state\=open\]\:animate-accordion-down[data-state=open]{animation:accordion-down .2s ease-out}.data-\[active\=true\]\:bg-muted\/50[data-active=true]{background-color:hsl(var(--muted)/.5)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=on\]\:bg-accent[data-state=on],.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:hsl(var(--primary-foreground))}.data-\[state\=on\]\:text-accent-foreground[data-state=on]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}.data-\[state\=closed\]\:duration-300[data-state=closed]{transition-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{transition-duration:.5s}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.data-\[state\=closed\]\:animate-out[data-state=closed],.data-\[swipe\=end\]\:animate-out[data-swipe=end]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:fade-out-80[data-state=closed]{--tw-exit-opacity:0.8}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-0.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:0.5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-0.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:0.5rem}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x:-50%}.data-\[state\=closed\]\:slide-out-to-right-full[data-state=closed],.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y:-48%}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x:-50%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y:-48%}.data-\[state\=open\]\:slide-in-from-top-full[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=closed\]\:duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}.dark\:-rotate-90:is(.dark *){--tw-rotate:-90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:rotate-0:is(.dark *){--tw-rotate:0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:scale-0:is(.dark *){--tw-scale-x:0;--tw-scale-y:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:scale-100:is(.dark *){--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:border-destructive:is(.dark *){border-color:hsl(var(--destructive))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.dark\:bg-slate-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.dark\:hover\:bg-slate-900:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:bottom-0{bottom:0}.sm\:right-0{right:0}.sm\:top-auto{top:auto}.sm\:mt-0{margin-top:0}.sm\:max-w-sm{max-width:24rem}.sm\:flex-initial{flex:0 1 auto}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-col{flex-direction:column}.sm\:items-start{align-items:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2\.5{gap:.625rem}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:border-l{border-left-width:1px}.sm\:border-t-0{border-top-width:0}.sm\:p-20{padding:5rem}.sm\:p-6{padding:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.sm\:text-left{text-align:left}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open]{--tw-enter-translate-y:100%}}@media (min-width:768px){.md\:ml-auto{margin-left:auto}.md\:mr-8{margin-right:2rem}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:size-12{width:3rem;height:3rem}.md\:max-w-\[420px\]{max-width:420px}.md\:max-w-full{max-width:100%}.md\:max-w-lg{max-width:32rem}.md\:max-w-md{max-width:28rem}.md\:basis-1\/2{flex-basis:50%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-\[180px_1fr\]{grid-template-columns:180px 1fr}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:gap-2{gap:.5rem}.md\:gap-5{gap:1.25rem}.md\:gap-8{gap:2rem}.md\:p-10{padding:2.5rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:text-base{font-size:1rem;line-height:1.5rem}.md\:text-sm{font-size:.875rem;line-height:1.25rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:size-48{width:12rem;height:12rem}.lg\:size-6{width:1.5rem;height:1.5rem}.lg\:h-10{height:2.5rem}.lg\:min-h-\[600px\]{min-height:600px}.lg\:max-w-full{max-width:100%}.lg\:basis-1\/3{flex-basis:33.333333%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-\[250px_1fr\]{grid-template-columns:250px 1fr}.lg\:items-center{align-items:center}.lg\:gap-4{gap:1rem}.lg\:gap-6{gap:1.5rem}.lg\:gap-y-0{row-gap:0}.lg\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.lg\:py-12{padding-top:3rem;padding-bottom:3rem}.lg\:text-\[4rem\]{font-size:4rem}}@media (min-width:1280px){.xl\:size-14{width:3.5rem;height:3.5rem}.xl\:size-6{width:1.5rem;height:1.5rem}.xl\:min-h-\[800px\]{min-height:800px}.xl\:w-\[800px\]{width:800px}.xl\:max-w-xl{max-width:36rem}.xl\:gap-6{gap:1.5rem}.xl\:gap-y-12{row-gap:3rem}.xl\:p-4{padding:1rem}.xl\:text-2xl{font-size:1.5rem;line-height:2rem}.xl\:text-3xl{font-size:1.875rem;line-height:2.25rem}.xl\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1536px){.\32xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&\+div\]\:text-xs+div{font-size:.75rem;line-height:1rem}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button,.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:left-4>svg{left:1rem}.\[\&\>svg\]\:top-4>svg{top:1rem}.\[\&\>svg\]\:size-3\.5>svg{width:.875rem;height:.875rem}.\[\&\>svg\]\:h-2\.5>svg{height:.625rem}.\[\&\>svg\]\:h-3>svg{height:.75rem}.\[\&\>svg\]\:w-2\.5>svg{width:.625rem}.\[\&\>svg\]\:w-3>svg{width:.75rem}.\[\&\>svg\]\:text-destructive>svg{color:hsl(var(--destructive))}.\[\&\>svg\]\:text-foreground>svg{color:hsl(var(--foreground))}.\[\&\>svg\]\:text-muted-foreground>svg{color:hsl(var(--muted-foreground))}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:1.75rem}.\[\&\>tr\]\:last\:border-b-0:last-child>tr{border-bottom-width:0}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text{fill:hsl(var(--muted-foreground))}.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke="#ccc"]{stroke:hsl(var(--border)/.5)}.\[\&_\.recharts-curve\.recharts-tooltip-cursor\]\:stroke-border .recharts-curve.recharts-tooltip-cursor{stroke:hsl(var(--border))}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:transparent}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer{outline:2px solid transparent;outline-offset:2px}.\[\&_\.recharts-polar-grid_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-polar-grid [stroke="#ccc"]{stroke:hsl(var(--border))}.\[\&_\.recharts-radial-bar-background-sector\]\:fill-muted .recharts-radial-bar-background-sector,.\[\&_\.recharts-rectangle\.recharts-tooltip-cursor\]\:fill-muted .recharts-rectangle.recharts-tooltip-cursor{fill:hsl(var(--muted))}.\[\&_\.recharts-reference-line_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-reference-line [stroke="#ccc"]{stroke:hsl(var(--border))}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:transparent}.\[\&_\.recharts-sector\]\:outline-none .recharts-sector,.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{outline:2px solid transparent;outline-offset:2px}.\[\&_p\]\:leading-relaxed p{line-height:1.625}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}@font-face{font-family:euclid;src:url(/_next/static/media/72399823edb708a6-s.p.woff2) format("woff2");font-display:swap;font-weight:300;font-style:normal}@font-face{font-family:euclid;src:url(/_next/static/media/a41b42e1a9703195-s.p.woff2) format("woff2");font-display:swap;font-weight:400;font-style:normal}@font-face{font-family:euclid;src:url(/_next/static/media/243b6dfb2e48e7ed-s.p.woff2) format("woff2");font-display:swap;font-weight:500;font-style:normal}@font-face{font-family:euclid;src:url(/_next/static/media/70a526c127b6fc39-s.p.woff2) format("woff2");font-display:swap;font-weight:600;font-style:normal}@font-face{font-family:euclid;src:url(/_next/static/media/0aa2ebf4cf06f243-s.p.woff2) format("woff2");font-display:swap;font-weight:700;font-style:normal}@font-face{font-family:euclid;src:url(/_next/static/media/cf37f781bdc22339-s.p.woff2) format("woff2");font-display:swap;font-weight:400;font-style:italic}@font-face{font-family:euclid Fallback;src:local("Arial");ascent-override:93.47%;descent-override:25.05%;line-gap-override:0.00%;size-adjust:106.98%}.__className_9dae3d{font-family:euclid,euclid Fallback} \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/css/562f52882551f4eb.css b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/css/562f52882551f4eb.css deleted file mode 100644 index 6ac60a8..0000000 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/css/562f52882551f4eb.css +++ /dev/null @@ -1,3 +0,0 @@ -*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/* -! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com -*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}:root{--background:0 0% 100%;--foreground:224 71.4% 4.1%;--card:0 0% 100%;--card-foreground:224 71.4% 4.1%;--popover:0 0% 100%;--popover-foreground:224 71.4% 4.1%;--primary:262.1 83.3% 57.8%;--primary-foreground:210 20% 98%;--secondary:220 14.3% 95.9%;--secondary-foreground:220.9 39.3% 11%;--muted:220 14.3% 95.9%;--muted-foreground:220 8.9% 46.1%;--accent:220 14.3% 95.9%;--accent-foreground:220.9 39.3% 11%;--destructive:0 84.2% 60.2%;--destructive-foreground:210 20% 98%;--border:220 13% 91%;--input:220 13% 91%;--ring:262.1 83.3% 57.8%;--radius:0.5rem;--chart-1:12 76% 61%;--chart-2:173 58% 39%;--chart-3:197 37% 24%;--chart-4:43 74% 66%;--chart-5:27 87% 67%}.dark{--background:224 71.4% 4.1%;--foreground:210 20% 98%;--card:224 71.4% 4.1%;--card-foreground:210 20% 98%;--popover:224 71.4% 4.1%;--popover-foreground:210 20% 98%;--primary:263.4 70% 50.4%;--primary-foreground:210 20% 98%;--secondary:215 27.9% 16.9%;--secondary-foreground:210 20% 98%;--muted:215 27.9% 16.9%;--muted-foreground:217.9 10.6% 64.9%;--accent:215 27.9% 16.9%;--accent-foreground:210 20% 98%;--destructive:0 62.8% 30.6%;--destructive-foreground:210 20% 98%;--border:215 27.9% 16.9%;--input:215 27.9% 16.9%;--ring:263.4 70% 50.4%;--chart-1:220 70% 50%;--chart-2:160 60% 45%;--chart-3:30 80% 55%;--chart-4:280 65% 60%;--chart-5:340 75% 55%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.-bottom-12{bottom:-3rem}.-left-12{left:-3rem}.-left-8{left:-2rem}.-right-12{right:-3rem}.-top-12{top:-3rem}.-top-8{top:-2rem}.bottom-0{bottom:0}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:.5rem}.left-\[50\%\]{left:50%}.right-0{right:0}.right-1{right:.25rem}.right-2{right:.5rem}.right-4{right:1rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-2{top:.5rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-50{z-index:50}.z-\[100\]{z-index:100}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-8{grid-column:span 8/span 8}.row-start-2{grid-row-start:2}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.-ml-4{margin-left:-1rem}.-mt-4{margin-top:-1rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-24{margin-top:6rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.size-16{width:4rem;height:4rem}.size-32{width:8rem;height:8rem}.size-4{width:1rem;height:1rem}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-44{height:11rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-\[1\.2rem\]{height:1.2rem}.h-\[140px\]{height:140px}.h-\[1px\]{height:1px}.h-\[200px\]{height:200px}.h-\[250px\]{height:250px}.h-\[400px\]{height:400px}.h-\[50\%\]{height:50%}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-96{max-height:24rem}.max-h-\[200px\]{max-height:200px}.max-h-screen{max-height:100vh}.min-h-\[60px\]{min-height:60px}.min-h-\[calc\(100vh_-_theme\(spacing\.16\)\)\]{min-height:calc(100vh - 4rem)}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:.25rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[1\.2rem\]{width:1.2rem}.w-\[100px\]{width:100px}.w-\[140px\]{width:140px}.w-\[180px\]{width:180px}.w-\[1px\]{width:1px}.w-\[200px\]{width:200px}.w-\[350px\]{width:350px}.w-\[40\%\]{width:40%}.w-\[50px\]{width:50px}.w-\[80px\]{width:80px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-10{max-width:2.5rem}.max-w-2xl{max-width:42rem}.max-w-32{max-width:8rem}.max-w-6{max-width:1.5rem}.max-w-6xl{max-width:72rem}.max-w-\[180px\]{max-width:180px}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.caption-bottom{caption-side:bottom}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.translate-x-\[-50\%\]{--tw-translate-x:-50%}.translate-x-\[-50\%\],.translate-y-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y:-50%}.rotate-0{--tw-rotate:0deg}.rotate-0,.rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate:90deg}.scale-0{--tw-scale-x:0;--tw-scale-y:0}.scale-0,.scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{user-select:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-flow-row{grid-auto-flow:row}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-\[20px_1fr_20px\]{grid-template-rows:20px 1fr 20px}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-evenly{justify-content:space-evenly}.justify-items-center{justify-items:center}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-px{gap:1px}.gap-x-2{column-gap:.5rem}.gap-x-4{column-gap:1rem}.gap-x-8{column-gap:2rem}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.gap-y-5{row-gap:1.25rem}.gap-y-6{row-gap:1.5rem}.gap-y-8{row-gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem * var(--tw-space-x-reverse));margin-left:calc(.375rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:.75rem}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.border{border-width:1px}.border-2{border-width:2px}.border-\[1\.5px\]{border-width:1.5px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-\[--color-border\]{border-color:var(--color-border)}.border-border\/50{border-color:hsl(var(--border)/.5)}.border-destructive{border-color:hsl(var(--destructive))}.border-destructive\/50{border-color:hsl(var(--destructive)/.5)}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-\[--color-bg\]{background-color:var(--color-bg)}.bg-accent{background-color:hsl(var(--accent))}.bg-background{background-color:hsl(var(--background))}.bg-black\/80{background-color:rgba(0,0,0,.8)}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/40{background-color:hsl(var(--muted)/.4)}.bg-muted\/50{background-color:hsl(var(--muted)/.5)}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary)/.1)}.bg-primary\/20{background-color:hsl(var(--primary)/.2)}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-\[1px\]{padding:1px}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[0\.8rem\]{font-size:.8rem}.text-\[3rem\]{font-size:3rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-widest{letter-spacing:.1em}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/50{color:hsl(var(--foreground)/.5)}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-muted{color:hsl(var(--muted))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-violet-500{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.fade-in-0{--tw-enter-opacity:0}.zoom-in-95{--tw-enter-scale:.95}.duration-100{animation-duration:.1s}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.running{animation-play-state:running}.text-balance{text-wrap:balance}.\[appearance\:textfield\]{appearance:textfield}.file\:border-0::file-selector-button{border-width:0}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.first\:border-t-0:first-child{border-top-width:0}.first\:pt-0:first-child{padding-top:0}.even\:border-l:nth-child(2n){border-left-width:1px}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-accent\/50:hover{background-color:hsl(var(--accent)/.5)}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive)/.8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive)/.9)}.hover\:bg-emerald-800:hover{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted)/.5)}.hover\:bg-orange-800:hover{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary)/.8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary)/.9)}.hover\:bg-rose-800:hover{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.hover\:bg-secondary:hover{background-color:hsl(var(--secondary))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary)/.8)}.hover\:bg-slate-100:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-muted-foreground:hover{color:hsl(var(--muted-foreground))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-1:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.group.destructive .group-\[\.destructive\]\:border-muted\/40{border-color:hsl(var(--muted)/.4)}.group.destructive .group-\[\.destructive\]\:text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.group.destructive .group-\[\.destructive\]\:hover\:border-destructive\/30:hover{border-color:hsl(var(--destructive)/.3)}.group.destructive .group-\[\.destructive\]\:hover\:bg-destructive:hover{background-color:hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:hover\:text-destructive-foreground:hover{color:hsl(var(--destructive-foreground))}.group.destructive .group-\[\.destructive\]\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.group.destructive .group-\[\.destructive\]\:focus\:ring-destructive:focus{--tw-ring-color:hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(248 113 113/var(--tw-ring-opacity))}.group.destructive .group-\[\.destructive\]\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:0.25rem}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom],.data-\[side\=left\]\:-translate-x-1[data-side=left]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:-0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right],.data-\[side\=top\]\:-translate-y-1[data-side=top]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:-0.25rem}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x:var(--radix-toast-swipe-end-x)}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end],.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x:var(--radix-toast-swipe-move-x)}@keyframes accordion-up{0%{height:var(--radix-accordion-content-height)}to{height:0}}.data-\[state\=closed\]\:animate-accordion-up[data-state=closed]{animation:accordion-up .2s ease-out}@keyframes accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height)}}.data-\[state\=open\]\:animate-accordion-down[data-state=open]{animation:accordion-down .2s ease-out}.data-\[active\=true\]\:bg-muted\/50[data-active=true]{background-color:hsl(var(--muted)/.5)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=on\]\:bg-accent[data-state=on],.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:hsl(var(--primary-foreground))}.data-\[state\=on\]\:text-accent-foreground[data-state=on]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}.data-\[state\=closed\]\:duration-300[data-state=closed]{transition-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{transition-duration:.5s}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.data-\[state\=closed\]\:animate-out[data-state=closed],.data-\[swipe\=end\]\:animate-out[data-swipe=end]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:fade-out-80[data-state=closed]{--tw-exit-opacity:0.8}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-0.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:0.5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-0.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:0.5rem}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x:-50%}.data-\[state\=closed\]\:slide-out-to-right-full[data-state=closed],.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y:-48%}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x:-50%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y:-48%}.data-\[state\=open\]\:slide-in-from-top-full[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=closed\]\:duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}.dark\:-rotate-90:is(.dark *){--tw-rotate:-90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:rotate-0:is(.dark *){--tw-rotate:0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:scale-0:is(.dark *){--tw-scale-x:0;--tw-scale-y:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:scale-100:is(.dark *){--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:border-destructive:is(.dark *){border-color:hsl(var(--destructive))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.dark\:bg-slate-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.dark\:hover\:bg-slate-900:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:bottom-0{bottom:0}.sm\:right-0{right:0}.sm\:top-auto{top:auto}.sm\:mt-0{margin-top:0}.sm\:max-w-sm{max-width:24rem}.sm\:flex-initial{flex:0 1 auto}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-col{flex-direction:column}.sm\:items-start{align-items:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2\.5{gap:.625rem}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:border-l{border-left-width:1px}.sm\:border-t-0{border-top-width:0}.sm\:p-20{padding:5rem}.sm\:p-6{padding:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.sm\:text-left{text-align:left}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open]{--tw-enter-translate-y:100%}}@media (min-width:768px){.md\:ml-auto{margin-left:auto}.md\:mr-8{margin-right:2rem}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:size-12{width:3rem;height:3rem}.md\:max-w-\[420px\]{max-width:420px}.md\:max-w-full{max-width:100%}.md\:max-w-lg{max-width:32rem}.md\:max-w-md{max-width:28rem}.md\:basis-1\/2{flex-basis:50%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-\[180px_1fr\]{grid-template-columns:180px 1fr}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:gap-2{gap:.5rem}.md\:gap-5{gap:1.25rem}.md\:gap-8{gap:2rem}.md\:p-10{padding:2.5rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:text-base{font-size:1rem;line-height:1.5rem}.md\:text-sm{font-size:.875rem;line-height:1.25rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:size-48{width:12rem;height:12rem}.lg\:size-6{width:1.5rem;height:1.5rem}.lg\:h-10{height:2.5rem}.lg\:min-h-\[600px\]{min-height:600px}.lg\:max-w-full{max-width:100%}.lg\:basis-1\/3{flex-basis:33.333333%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-\[250px_1fr\]{grid-template-columns:250px 1fr}.lg\:items-center{align-items:center}.lg\:gap-4{gap:1rem}.lg\:gap-6{gap:1.5rem}.lg\:gap-y-0{row-gap:0}.lg\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.lg\:py-12{padding-top:3rem;padding-bottom:3rem}.lg\:text-\[4rem\]{font-size:4rem}}@media (min-width:1280px){.xl\:size-14{width:3.5rem;height:3.5rem}.xl\:size-6{width:1.5rem;height:1.5rem}.xl\:min-h-\[800px\]{min-height:800px}.xl\:w-\[800px\]{width:800px}.xl\:max-w-xl{max-width:36rem}.xl\:gap-6{gap:1.5rem}.xl\:gap-y-12{row-gap:3rem}.xl\:p-4{padding:1rem}.xl\:text-2xl{font-size:1.5rem;line-height:2rem}.xl\:text-3xl{font-size:1.875rem;line-height:2.25rem}.xl\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1536px){.\32xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&\+div\]\:text-xs+div{font-size:.75rem;line-height:1rem}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button,.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:left-4>svg{left:1rem}.\[\&\>svg\]\:top-4>svg{top:1rem}.\[\&\>svg\]\:size-3\.5>svg{width:.875rem;height:.875rem}.\[\&\>svg\]\:h-2\.5>svg{height:.625rem}.\[\&\>svg\]\:h-3>svg{height:.75rem}.\[\&\>svg\]\:w-2\.5>svg{width:.625rem}.\[\&\>svg\]\:w-3>svg{width:.75rem}.\[\&\>svg\]\:text-destructive>svg{color:hsl(var(--destructive))}.\[\&\>svg\]\:text-foreground>svg{color:hsl(var(--foreground))}.\[\&\>svg\]\:text-muted-foreground>svg{color:hsl(var(--muted-foreground))}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:1.75rem}.\[\&\>tr\]\:last\:border-b-0:last-child>tr{border-bottom-width:0}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text{fill:hsl(var(--muted-foreground))}.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke="#ccc"]{stroke:hsl(var(--border)/.5)}.\[\&_\.recharts-curve\.recharts-tooltip-cursor\]\:stroke-border .recharts-curve.recharts-tooltip-cursor{stroke:hsl(var(--border))}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:transparent}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer{outline:2px solid transparent;outline-offset:2px}.\[\&_\.recharts-polar-grid_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-polar-grid [stroke="#ccc"]{stroke:hsl(var(--border))}.\[\&_\.recharts-radial-bar-background-sector\]\:fill-muted .recharts-radial-bar-background-sector,.\[\&_\.recharts-rectangle\.recharts-tooltip-cursor\]\:fill-muted .recharts-rectangle.recharts-tooltip-cursor{fill:hsl(var(--muted))}.\[\&_\.recharts-reference-line_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-reference-line [stroke="#ccc"]{stroke:hsl(var(--border))}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:transparent}.\[\&_\.recharts-sector\]\:outline-none .recharts-sector,.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{outline:2px solid transparent;outline-offset:2px}.\[\&_p\]\:leading-relaxed p{line-height:1.625}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}@font-face{font-family:euclid;src:url(/_next/static/media/72399823edb708a6-s.p.woff2) format("woff2");font-display:swap;font-weight:300;font-style:normal}@font-face{font-family:euclid;src:url(/_next/static/media/a41b42e1a9703195-s.p.woff2) format("woff2");font-display:swap;font-weight:400;font-style:normal}@font-face{font-family:euclid;src:url(/_next/static/media/243b6dfb2e48e7ed-s.p.woff2) format("woff2");font-display:swap;font-weight:500;font-style:normal}@font-face{font-family:euclid;src:url(/_next/static/media/70a526c127b6fc39-s.p.woff2) format("woff2");font-display:swap;font-weight:600;font-style:normal}@font-face{font-family:euclid;src:url(/_next/static/media/0aa2ebf4cf06f243-s.p.woff2) format("woff2");font-display:swap;font-weight:700;font-style:normal}@font-face{font-family:euclid;src:url(/_next/static/media/cf37f781bdc22339-s.p.woff2) format("woff2");font-display:swap;font-weight:400;font-style:italic}@font-face{font-family:euclid Fallback;src:local("Arial");ascent-override:93.47%;descent-override:25.05%;line-gap-override:0.00%;size-adjust:106.98%}.__className_9dae3d{font-family:euclid,euclid Fallback} \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/Kt0Xe6YYT_RuYVm3o2asX/_buildManifest.js b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/xeZlQ8jLyR2FPwewgDcLc/_buildManifest.js similarity index 100% rename from ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/Kt0Xe6YYT_RuYVm3o2asX/_buildManifest.js rename to ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/xeZlQ8jLyR2FPwewgDcLc/_buildManifest.js diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/Kt0Xe6YYT_RuYVm3o2asX/_ssgManifest.js b/ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/xeZlQ8jLyR2FPwewgDcLc/_ssgManifest.js similarity index 100% rename from ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/Kt0Xe6YYT_RuYVm3o2asX/_ssgManifest.js rename to ipk-source/sdxpinn-quecmanager-beta/root/www/_next/static/xeZlQ8jLyR2FPwewgDcLc/_ssgManifest.js diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/fetch_commands.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/fetch_commands.sh new file mode 100644 index 0000000..7081c71 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/fetch_commands.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +# Set content type for JSON response +echo "Content-Type: application/json" +echo "" + +# Check if the file exists +if [ -f "/etc/config/atcommands.user" ]; then + # Start JSON object + printf "{\n" + awk -F';' ' + BEGIN { first = 1 } + { + gsub(/\r/, "", $0) + if (!first) printf ",\n " + else printf " " + gsub(/"/, "\\\"", $1) + gsub(/"/, "\\\"", $2) + printf "\"%s\": \"%s\"", $1, $2 + first = 0 + } + ' /etc/config/atcommands.user + printf "\n}" +else + echo '{"error": "No Data"}' +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/fetch_macs.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/fetch_macs.sh new file mode 100644 index 0000000..e816718 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/fetch_macs.sh @@ -0,0 +1,49 @@ +#!/bin/sh +echo "Content-type: application/json" +echo "" + +# Create a temporary file to store the processed data +temp_file=$(mktemp) + +# Process ARP entries and store in temporary file +arp -a | while IFS= read -r line; do + if [ -n "$line" ]; then + # Extract hostname (or IP if hostname is "?"), IP, and MAC + hostname=$(echo "$line" | awk '{print $1}') + ip=$(echo "$line" | awk -F '[()]' '{print $2}') + mac=$(echo "$line" | awk '{print $4}') + + # Skip entries without valid MAC addresses + if [ "$mac" = "" ]; then + continue + fi + + # If hostname is "?", use the IP address instead + if [ "$hostname" = "?" ]; then + hostname="$ip" + fi + + # Store each entry in the temp file + echo "$hostname:$ip:$mac" >> "$temp_file" + fi +done + +# Initialize JSON array +echo -n "[" + +# Process the temporary file to create JSON +first=true +while IFS=: read -r hostname ip mac; do + if [ "$first" = true ]; then + first=false + else + echo -n "," + fi + echo -n "{\"hostname\":\"$hostname\",\"ip\":\"$ip\",\"mac\":\"$mac\"}" +done < "$temp_file" + +# Close the JSON array +echo "]" + +# Clean up +rm -f "$temp_file" \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/mtu.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/mtu.sh new file mode 100644 index 0000000..858b654 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/mtu.sh @@ -0,0 +1,90 @@ +#!/bin/sh +echo "Content-type: application/json" +echo "" +mtu_firewall_file="/etc/firewall.user.mtu" +network_interface="rmnet_data0" +lan_utils_script="/etc/data/lanUtils.sh" + +get_current_mtu() { + ip link show "$network_interface" | grep -o "mtu [0-9]*" | cut -d' ' -f2 +} + +update_lanutils_mtu_config() { + local action="$1" + if [ "$action" = "add" ]; then + # Add the MTU firewall file line if not already present + if ! grep -q "local mtu_firewall_file=/etc/firewall.user.mtu" "$lan_utils_script"; then + sed -i '/local ttl_firewall_file=\/etc\/firewall.user.ttl/a local mtu_firewall_file=/etc/firewall.user.mtu' "$lan_utils_script" + fi + elif [ "$action" = "remove" ]; then + # Remove the MTU firewall file line if present + sed -i '/local mtu_firewall_file=\/etc\/firewall.user.mtu/d' "$lan_utils_script" + fi +} + +case "$REQUEST_METHOD" in + GET) + # Fetch current MTU + current_mtu=$(get_current_mtu) + current_mtu=${current_mtu:-1500} + + # Check if custom MTU is configured + if [ -f "$mtu_firewall_file" ]; then + echo "{\"isEnabled\": true, \"currentValue\": $current_mtu}" + else + echo "{\"isEnabled\": false, \"currentValue\": $current_mtu}" + fi + ;; + + POST) + read -r post_data + mtu_value=$(echo "$post_data" | sed 's/mtu=//') + + # Check for disable functionality + if [ "$mtu_value" = "disable" ]; then + # Remove the MTU configuration file + rm -f "$mtu_firewall_file" + + # Remove the MTU configuration line from lanUtils.sh + update_lanutils_mtu_config "remove" + + # Get the default MTU + default_mtu=$(get_current_mtu) + default_mtu=${default_mtu:-1500} + + echo "{\"success\": true, \"message\": \"MTU configuration disabled\", \"currentValue\": $default_mtu}" + exit 0 + fi + + # Validate MTU input + if ! [[ "$mtu_value" =~ ^[0-9]+$ ]]; then + echo "{\"success\": false, \"error\": \"Invalid MTU value\"}" + exit 1 + fi + + # Create firewall MTU configuration file with individual interface commands + > "$mtu_firewall_file" # Clear the file + for iface in $(ls /sys/class/net | grep '^rmnet_data'); do + echo "ip link set $iface mtu $mtu_value" >> "$mtu_firewall_file" + done + + # Immediately apply MTU change + for iface in $(ls /sys/class/net | grep '^rmnet_data'); do + ip link set "$iface" mtu "$mtu_value" + done + + # Add the MTU configuration line to lanUtils.sh + update_lanutils_mtu_config "add" + + # Run lanUtils.sh to update network configuration + if [ -f "$lan_utils_script" ]; then + . "$lan_utils_script" + fi + + echo "{\"success\": true, \"message\": \"MTU configuration updated to $mtu_value\", \"currentValue\": $mtu_value}" + ;; + + *) + echo "{\"success\": false, \"error\": \"Invalid request method\"}" + ;; +esac \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/ttl.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/ttl.sh new file mode 100644 index 0000000..a344ce4 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/advance/ttl.sh @@ -0,0 +1,94 @@ +#!/bin/sh + +echo "Content-type: application/json" +echo "" + +ttl_file="/etc/firewall.user.ttl" +lan_utils_script="/etc/data/lanUtils.sh" + +setup_persistent_config() { + if [ ! -f "$lan_utils_script" ]; then + echo "{\"success\": false, \"error\": \"lanUtils.sh not found\"}" + return 1 + fi + + # Backup the original script if not already done + if [ ! -f "${lan_utils_script}.bak" ]; then + cp "$lan_utils_script" "${lan_utils_script}.bak" + fi + + # Add the local ttl_firewall_file line if it's not already present + if ! grep -q "local ttl_firewall_file" "$lan_utils_script"; then + sed -i '/local tcpmss_firewall_filev6/a \ local ttl_firewall_file=/etc/firewall.user.ttl' "$lan_utils_script" + fi + + # Add the condition to include the ttl_firewall_file if it's not already present + if ! grep -q "if \[ -f \"\$ttl_firewall_file\" \]; then" "$lan_utils_script"; then + sed -i '/if \[ -f "\$tcpmss_firewall_filev6" \]; then/i \ if [ -f "\$ttl_firewall_file" ]; then\n cat \$ttl_firewall_file >> \$firewall_file\n fi' "$lan_utils_script" + fi +} + +clear_existing_rules() { + local current_ttl=$1 + if [ -n "$current_ttl" ]; then + iptables -t mangle -D POSTROUTING -o rmnet+ -j TTL --ttl-set "$current_ttl" 2>/dev/null + ip6tables -t mangle -D POSTROUTING -o rmnet+ -j HL --hl-set "$current_ttl" 2>/dev/null + fi +} + +case "$REQUEST_METHOD" in + GET) + # Ensure consistent JSON format for GET requests + if [ -s "$ttl_file" ]; then + ttl_value=$(grep 'iptables -t mangle -A POSTROUTING' "$ttl_file" | awk '{for(i=1;i<=NF;i++){if($i=="--ttl-set"){print $(i+1)}}}') + # Ensure ttl_value is a number, default to 0 if not + if ! [[ "$ttl_value" =~ ^[0-9]+$ ]]; then + ttl_value=0 + fi + echo "{\"isEnabled\": true, \"currentValue\": $ttl_value}" + else + echo "{\"isEnabled\": false, \"currentValue\": 0}" + fi + ;; + POST) + read -r post_data + ttl_value=$(echo "$post_data" | sed 's/ttl=//') + + # Ensure ttl_file exists + touch "$ttl_file" 2>/dev/null + if [ ! -f "$ttl_file" ]; then + echo "{\"success\": false, \"error\": \"Cannot create TTL file\"}" + exit 1 + fi + + # Setup persistent configuration + setup_persistent_config + + # Get current TTL value for cleanup + current_ttl=$(grep 'iptables -t mangle -A POSTROUTING' "$ttl_file" | awk '{for(i=1;i<=NF;i++){if($i=="--ttl-set"){print $(i+1)}}}') + + if ! [[ "$ttl_value" =~ ^[0-9]+$ ]]; then + echo "{\"success\": false, \"error\": \"Invalid TTL value\"}" + elif [ "$ttl_value" = "0" ]; then + clear_existing_rules "$current_ttl" + > "$ttl_file" + echo "{\"success\": true}" + else + # Clear existing rules + clear_existing_rules "$current_ttl" + + # Set new rules + echo "iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set $ttl_value" > "$ttl_file" + echo "ip6tables -t mangle -A POSTROUTING -o rmnet+ -j HL --hl-set $ttl_value" >> "$ttl_file" + + # Apply the rules + iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set "$ttl_value" + ip6tables -t mangle -A POSTROUTING -o rmnet+ -j HL --hl-set "$ttl_value" + + echo "{\"success\": true}" + fi + ;; + *) + echo "{\"success\": false, \"error\": \"Invalid request method\"}" + ;; +esac \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/at_cmd/at_queue_client.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/at_cmd/at_queue_client.sh new file mode 100644 index 0000000..139190b --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/at_cmd/at_queue_client.sh @@ -0,0 +1,266 @@ +#!/bin/sh +# AT Queue Client for OpenWRT +# Located in /www/cgi-bin/services/at_queue_client + +QUEUE_DIR="/tmp/at_queue" +RESULTS_DIR="$QUEUE_DIR/results" +QUEUE_MANAGER="/www/cgi-bin/services/at_queue_manager.sh" +POLL_INTERVAL=0.01 + +usage() { + echo "Usage: $0 [options] " + echo "Options:" + echo " -w Wait for command completion" + echo " -t Timeout in seconds (default: 240)" + echo " -h Show this help message" + exit 1 +} + +# Output JSON response +output_json() { + local content="$1" + local headers="${2:-1}" # Default to showing headers + echo "$content" +} + +# URL decode function +urldecode() { + local encoded="$1" + logger -t at_queue -p daemon.debug "urldecode: input='$encoded'" + + # Handle %2B -> + and %22 -> " conversions + local decoded="${encoded//%2B/+}" + decoded="${decoded//%22/\"}" + # Then handle other encoded characters + decoded=$(printf '%b' "${decoded//%/\\x}") + + logger -t at_queue -p daemon.debug "urldecode: output='$decoded'" + echo "$decoded" +} + +# Extract command ID from response with improved error handling +get_command_id() { + local response="$1" + echo "DEBUG: Raw response: '$response'" >&2 + + # Strip any headers from response + local json_response=$(echo "$response" | sed -n '/^{/,$p') + echo "DEBUG: JSON portion: '$json_response'" >&2 + + # Try to extract command_id using grep and sed instead of jsonfilter + local cmd_id=$(echo "$json_response" | grep -o '"command_id":"[^"]*"' | sed 's/"command_id":"//;s/"$//') + + if [ -n "$cmd_id" ]; then + echo "$cmd_id" + return 0 + fi + + # Fallback to jsonfilter if available + echo "DEBUG: Trying jsonfilter as fallback" >&2 + local cmd_id_jsonfilter=$(echo "$json_response" | jsonfilter -e '@.command_id' 2>/dev/null) + + if [ -n "$cmd_id_jsonfilter" ]; then + echo "$cmd_id_jsonfilter" + return 0 + fi + + echo "ERROR: Failed to extract command ID from response" >&2 + return 1 +} + +# Normalize AT command +normalize_at_command() { + local cmd="$1" + logger -t at_queue -p daemon.debug "normalize: input='$cmd'" + + # URL decode the command + cmd=$(urldecode "$cmd") + logger -t at_queue -p daemon.debug "normalize: after urldecode='$cmd'" + + # Remove any carriage returns or newlines + cmd=$(echo "$cmd" | tr -d '\r\n') + logger -t at_queue -p daemon.debug "normalize: after cleanup='$cmd'" + + # Trim leading/trailing whitespace while preserving quotes + cmd=$(echo "$cmd" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + logger -t at_queue -p daemon.debug "normalize: final output='$cmd'" + + echo "$cmd" +} + +# Submit command with priority handling +submit_command() { + local cmd="$1" + local priority=10 + + # Set high priority for QSCAN commands for faster processing + if echo "$cmd" | grep -qi "AT+QSCAN"; then + priority=1 + fi + + # Submit using appropriate method + if [ "${SCRIPT_NAME}" != "" ]; then + # CGI mode - direct execution + local escaped_cmd=$(echo "$cmd" | sed 's/"/\\"/g') + QUERY_STRING="action=enqueue&command=${escaped_cmd}&priority=$priority" "$QUEUE_MANAGER" + else + # CLI mode + "$QUEUE_MANAGER" enqueue "$cmd" "$priority" + fi +} + +# Check if result exists with proper error handling +check_result() { + local cmd_id="$1" + local show_headers="${2:-1}" # Add parameter for header control + + if [ -f "$RESULTS_DIR/$cmd_id.json" ]; then + local result_content=$(cat "$RESULTS_DIR/$cmd_id.json") + if [ -z "$result_content" ]; then + logger -t at_queue -p daemon.error "Empty result file for command ID: $cmd_id" + local error_json="{\"error\":\"Empty result file\",\"command_id\":\"$cmd_id\"}" + output_json "$error_json" "$show_headers" + return 1 + fi + output_json "$result_content" "$show_headers" + return 0 + fi + local error_json="{\"error\":\"Result not found\",\"command_id\":\"$cmd_id\"}" + output_json "$error_json" "$show_headers" + return 1 +} + +# Wait for command completion with optimized polling and better error handling +wait_for_completion() { + local cmd_id="$1" + local timeout="$2" + local show_headers="${3:-1}" + local result_file="$RESULTS_DIR/$cmd_id.json" + + if [ -z "$cmd_id" ]; then + local error_json="{\"error\":\"Invalid command ID\"}" + output_json "$error_json" "$show_headers" + return 1 + fi + + # First quick check + if [ -f "$result_file" ]; then + output_json "$(cat "$result_file")" "$show_headers" + return 0 + fi + + # Wait with shorter polling interval + local start_time=$(date +%s) + local current_time + + while true; do + if [ -f "$result_file" ]; then + output_json "$(cat "$result_file")" "$show_headers" + return 0 + fi + + current_time=$(date +%s) + if [ $((current_time - start_time)) -ge "$timeout" ]; then + break + fi + + sleep $POLL_INTERVAL + done + + local error_json=$(cat << EOF +{ + "error": "Timeout waiting for completion", + "command_id": "$cmd_id", + "timeout": $timeout +} +EOF +) + output_json "$error_json" "$show_headers" + return 1 +} + +# CGI request handling +if [ "${SCRIPT_NAME}" != "" ]; then + # Output headers only once at the beginning + echo "Content-Type: application/json" + echo "" + + # Parse query string + eval $(echo "$QUERY_STRING" | sed 's/&/;/g') + + # Handle different actions + if [ -n "$command_id" ]; then + # Get result for specific command ID + check_result "$command_id" "0" # Don't show headers + elif [ -n "$command" ]; then + # URL decode and normalize the command + command=$(urldecode "$command") + command=$(normalize_at_command "$command") + + # Check if it's a valid AT command + if echo "$command" | grep -qi "^AT"; then + # Submit command and get response + response=$(submit_command "$command") + cmd_id=$(get_command_id "$response") + + if [ "$wait" = "1" ]; then + if [ -n "$cmd_id" ]; then + wait_for_completion "$cmd_id" "${timeout:-180}" "0" # Don't show headers + else + output_json "{\"error\":\"Failed to get command ID from response\",\"response\":\"$response\"}" "0" + fi + else + output_json "$response" "0" # Don't show headers + fi + else + output_json "{\"error\":\"Invalid AT command format\"}" "0" + fi + else + output_json "{\"error\":\"No command or command_id specified\"}" "0" + fi + exit 0 +fi + +# CLI processing +wait_mode=0 +timeout=180 + +while getopts "wt:h" opt; do + case $opt in + w) wait_mode=1 ;; + t) timeout="$OPTARG" ;; + h) usage ;; + ?) usage ;; + esac +done + +shift $((OPTIND-1)) + +if [ $# -eq 0 ]; then + usage +fi + +# Combine remaining arguments into AT command +command="$*" + +# Validate AT command format +if ! echo "$command" | grep -qi "^AT"; then + echo "Error: Command must start with 'AT'" + exit 1 +fi + +# Submit command and get response +response=$(submit_command "$command") +cmd_id=$(get_command_id "$response") + +if [ -z "$cmd_id" ]; then + echo "Error: Failed to get command ID" + echo "Response: $response" + exit 1 +fi + +if [ $wait_mode -eq 1 ]; then + wait_for_completion "$cmd_id" "$timeout" +else + echo "$response" +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/at_cmd/fetch_data.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/at_cmd/fetch_data.sh new file mode 100644 index 0000000..48c6551 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/at_cmd/fetch_data.sh @@ -0,0 +1,195 @@ +#!/bin/sh + +# Set content-type for JSON response +echo "Content-type: application/json" +echo "" + +# Define paths and constants to match queue system +QUEUE_DIR="/tmp/at_queue" +QUEUE_MANAGER="/www/cgi-bin/services/at_queue_manager" +LOCK_ID="FETCH_DATA_$(date +%s)_$$" +TOKEN_FILE="$QUEUE_DIR/token" + +# Logging function (minimized) +log_message() { + # Only log errors and critical info + if [ "$1" = "error" ] || [ "$1" = "crit" ]; then + logger -t at_queue -p "daemon.$1" "$2" + fi +} + +# Enhanced JSON string escaping function +escape_json() { + printf '%s' "$1" | awk ' + BEGIN { RS="\n"; ORS="\\n" } + { + gsub(/\\/, "\\\\") + gsub(/"/, "\\\"") + gsub(/\r/, "") + gsub(/\t/, "\\t") + gsub(/\f/, "\\f") + gsub(/\b/, "\\b") + print + } + ' | sed 's/\\n$//' +} + +# Acquire token directly (avoid CGI overhead) +acquire_token() { + local priority="${1:-10}" + local max_attempts=10 + local attempt=0 + + while [ $attempt -lt $max_attempts ]; do + # Check if token file exists + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + local current_priority=$(cat "$TOKEN_FILE" | jsonfilter -e '@.priority' 2>/dev/null) + local timestamp=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp' 2>/dev/null) + local current_time=$(date +%s) + + # Check for expired token (> 30 seconds old) + if [ $((current_time - timestamp)) -gt 30 ] || [ -z "$current_holder" ]; then + # Remove expired token + rm -f "$TOKEN_FILE" 2>/dev/null + elif [ $priority -lt $current_priority ]; then + # Preempt lower priority token + rm -f "$TOKEN_FILE" 2>/dev/null + else + # Try again + sleep 0.1 + attempt=$((attempt + 1)) + continue + fi + fi + + # Try to create token file + echo "{\"id\":\"$LOCK_ID\",\"priority\":$priority,\"timestamp\":$(date +%s)}" > "$TOKEN_FILE" 2>/dev/null + chmod 644 "$TOKEN_FILE" 2>/dev/null + + # Verify we got the token + local holder=$(cat "$TOKEN_FILE" 2>/dev/null | jsonfilter -e '@.id' 2>/dev/null) + if [ "$holder" = "$LOCK_ID" ]; then + return 0 + fi + + sleep 0.1 + attempt=$((attempt + 1)) + done + + return 1 +} + +# Release token directly +release_token() { + # Only remove if it's our token + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + if [ "$current_holder" = "$LOCK_ID" ]; then + rm -f "$TOKEN_FILE" 2>/dev/null + fi + fi +} + +# Direct AT command execution with minimal overhead +execute_at_command() { + local CMD="$1" + sms_tool at "$CMD" -t 3 2>/dev/null +} + +# Batch process all commands with a single token +process_all_commands() { + local commands="$1" + local priority="${2:-10}" + local first=1 + + # Acquire a single token for all commands + if ! acquire_token "$priority"; then + log_message "error" "Failed to acquire token for batch processing" + # Return all failed responses + printf '[' + first=1 + for cmd in $commands; do + [ $first -eq 0 ] && printf ',' + first=0 + ESCAPED_CMD=$(escape_json "$cmd") + printf '{"command":"%s","response":"Failed to acquire token","status":"error"}' "${ESCAPED_CMD}" + done + printf ']\n' + return 1 + fi + + # Process all commands with the single token + printf '[' + for cmd in $commands; do + [ $first -eq 0 ] && printf ',' + first=0 + + OUTPUT=$(execute_at_command "$cmd") + local CMD_STATUS=$? + + ESCAPED_CMD=$(escape_json "$cmd") + ESCAPED_OUTPUT=$(escape_json "$OUTPUT") + + if [ $CMD_STATUS -eq 0 ] && [ -n "$OUTPUT" ]; then + printf '{"command":"%s","response":"%s","status":"success"}' \ + "${ESCAPED_CMD}" \ + "${ESCAPED_OUTPUT}" + else + printf '{"command":"%s","response":"Command failed","status":"error"}' \ + "${ESCAPED_CMD}" + fi + done + printf ']\n' + + # Release token after all commands are done + release_token + return 0 +} + +# Main execution with timeout and proper cleanup +trap 'release_token; exit 1' INT TERM + +# Command sets +COMMAND_SET_1='AT+QUIMSLOT? AT+CNUM AT+COPS? AT+CIMI AT+ICCID AT+CGSN AT+CPIN? AT+CGDCONT? AT+CREG? AT+CFUN? AT+QENG="servingcell" AT+QTEMP AT+CGCONTRDP AT+QCAINFO AT+QRSRP AT+QMAP="WWAN" AT+C5GREG=2;+C5GREG? AT+CGREG=2;+CGREG? AT+QRSRQ AT+QSINR' +COMMAND_SET_2='AT+CGDCONT? AT+CGCONTRDP AT+QNWPREFCFG="mode_pref" AT+QNWPREFCFG="nr5g_disable_mode" AT+QUIMSLOT? AT+CFUN=?' +COMMAND_SET_3='AT+CGMI AT+CGMM AT+QGMR AT+CNUM AT+CIMI AT+ICCID AT+CGSN AT+QMAP="LANIP" AT+QMAP="WWAN" AT+QGETCAPABILITY' +COMMAND_SET_4='AT+QMAP="MPDN_RULE" AT+QMAP="DHCPV4DNS" AT+QCFG="usbnet"' +COMMAND_SET_5='AT+QRSRP AT+QRSRQ AT+QSINR AT+QCAINFO AT+QSPN' +COMMAND_SET_6='AT+CEREG=2;+CEREG? AT+C5GREG=2;+C5GREG? AT+CPIN? AT+CGDCONT? AT+CGCONTRDP AT+QMAP="WWAN" AT+QRSRP AT+QTEMP AT+QNETRC?' +COMMAND_SET_7='AT+QNWPREFCFG="policy_band" AT+QNWPREFCFG="lte_band";+QNWPREFCFG="nsa_nr5g_band";+QNWPREFCFG="nr5g_band"' +COMMAND_SET_8='AT+QNWLOCK="common/4g" AT+QNWLOCK="common/5g" AT+QNWLOCK="save_ctrl"' + +# Get command set from query string with validation +COMMAND_SET=$(echo "$QUERY_STRING" | grep -o 'set=[1-8]' | cut -d'=' -f2 | tr -cd '0-9') +if [ -z "$COMMAND_SET" ] || [ "$COMMAND_SET" -lt 1 ] || [ "$COMMAND_SET" -gt 8 ]; then + COMMAND_SET=1 +fi + +# Select the appropriate command set +case "$COMMAND_SET" in + 1) COMMANDS="$COMMAND_SET_1";; + 2) COMMANDS="$COMMAND_SET_2";; + 3) COMMANDS="$COMMAND_SET_3";; + 4) COMMANDS="$COMMAND_SET_4";; + 5) COMMANDS="$COMMAND_SET_5";; + 6) COMMANDS="$COMMAND_SET_6";; + 7) COMMANDS="$COMMAND_SET_7";; + 8) COMMANDS="$COMMAND_SET_8";; +esac + +# Set priority based on content +PRIORITY=10 +if echo "$COMMANDS" | grep -qi "AT+QSCAN"; then + PRIORITY=1 +fi + +# Process commands with timeout protection +( sleep 60; kill -TERM $$ 2>/dev/null ) & +TIMEOUT_PID=$! + +process_all_commands "$COMMANDS" "$PRIORITY" + +# Clean up +kill $TIMEOUT_PID 2>/dev/null +release_token \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/auth.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/auth.sh new file mode 100644 index 0000000..dc53c38 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/auth.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +# Set Content-Type for CGI script +echo "Content-type: application/json" +echo "" + +# Read POST data +read -r POST_DATA + +# Debug log for generated hash +DEBUG_LOG="/tmp/auth.log" + +# Extract the password from POST data (URL encoded) +USER="root" +INPUT_PASSWORD=$(echo "$POST_DATA" | grep -o 'password=[^&]*' | cut -d= -f2-) + +# URL-decode the password while preserving most special characters +# First decode percent-encoded sequences +urldecode() { + local encoded="${1//+/ }" + printf '%b' "${encoded//%/\\x}" +} + +# Decode the password +INPUT_PASSWORD=$(urldecode "$INPUT_PASSWORD") + +# Basic validation to reject & and $ characters +if echo "$INPUT_PASSWORD" | grep -q '[&$]'; then + echo '{"state":"failed", "message":"Password contains forbidden characters (& or $)"}' + exit 1 +fi + +# Sanitize the password for shell usage +INPUT_PASSWORD=$(printf '%s' "$INPUT_PASSWORD" | sed 's/[\"]/\\&/g') + +# Extract the hashed password from /etc/shadow for the specified user +USER_SHADOW_ENTRY=$(grep "^$USER:" /etc/shadow) + +if [ -z "$USER_SHADOW_ENTRY" ]; then + echo '{"state":"failed", "message":"User not found"}' + exit 1 +fi + +# Extract the password hash (it's the second field, colon-separated) +USER_HASH=$(echo "$USER_SHADOW_ENTRY" | cut -d: -f2) + +# Extract the salt (MD5 uses the $1$ prefix followed by the salt) +SALT=$(echo "$USER_HASH" | cut -d'$' -f3) + +# Generate a hash from the input password using the same salt +# Use printf to avoid issues with special characters in echo +GENERATED_HASH=$(printf '%s' "$INPUT_PASSWORD" | openssl passwd -1 -salt "$SALT" -stdin) + +# Log generated hash for debugging +printf "Generated hash: %s\n" "$GENERATED_HASH" >> "$DEBUG_LOG" + +# Compare the generated hash with the one in the shadow file +if [ "$GENERATED_HASH" = "$USER_HASH" ]; then + echo '{"state":"success"}' +else + echo '{"state":"failed", "message":"Authentication failed"}' +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-locking/get_cell_lock.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-locking/get_cell_lock.sh new file mode 100644 index 0000000..25cb373 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-locking/get_cell_lock.sh @@ -0,0 +1,113 @@ +#!/bin/sh + +# Set headers for JSON response +echo "Content-type: application/json" +echo "" + +# Load UCI functions +. /lib/functions.sh + +# Function to safely get UCI value with default +get_uci_value() { + local value + config_get value cell_lock "$1" "$2" + echo "${value:-$2}" +} + +# Function to check if daemon is running +check_service_status() { + if [ -f "/var/run/cell_lock_scheduler.pid" ]; then + pid=$(cat /var/run/cell_lock_scheduler.pid 2>/dev/null) + if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then + echo "running" + return + fi + fi + echo "stopped" +} + +# Function to get current status with proper JSON handling +get_current_status() { + local STATUS_FILE="/tmp/cell_lock_status.json" + local status="unknown" + local message="Status not available" + local active="0" + local locked="0" + local timestamp=$(date +%s) + + if [ -f "$STATUS_FILE" ]; then + # Try to extract values from status file + if grep -q "status" "$STATUS_FILE"; then + status=$(cat "$STATUS_FILE" | jsonfilter -e '@.status' 2>/dev/null) + # Extract message and remove any surrounding quotes + message=$(cat "$STATUS_FILE" | jsonfilter -e '@.message' 2>/dev/null | sed 's/^"//;s/"$//') + active=$(cat "$STATUS_FILE" | jsonfilter -e '@.active' 2>/dev/null) + locked=$(cat "$STATUS_FILE" | jsonfilter -e '@.locked' 2>/dev/null) + timestamp=$(cat "$STATUS_FILE" | jsonfilter -e '@.timestamp' 2>/dev/null) + fi + fi + + # Escape quotes and special characters in message + message=$(echo "$message" | sed 's/\\/\\\\/g; s/"/\\"/g') + + # Return the status as a JSON object with properly quoted message + echo "{\"status\":\"$status\",\"message\":\"$message\",\"active\":$active,\"locked\":$locked,\"timestamp\":$timestamp}" +} + +# Load configuration +config_load quecmanager + +# Check if cell lock section exists +if ! uci -q get quecmanager.cell_lock >/dev/null; then + echo '{"status":"inactive","message":"Cell lock is not configured","enabled":false,"startTime":"","endTime":"","active":false,"locked":false}' + exit 0 +fi + +# Get service status +service_status=$(check_service_status) + +# Get current status +current_status=$(get_current_status) + +# Get configuration values +enabled=$(get_uci_value "enabled" "0") +start_time=$(get_uci_value "start_time" "") +end_time=$(get_uci_value "end_time" "") +active=$(get_uci_value "active" "0") +lte_params=$(get_uci_value "lte_params" "") +nr5g_params=$(get_uci_value "nr5g_params" "") +lte_persist=$(get_uci_value "lte_persist" "0") +nr5g_persist=$(get_uci_value "nr5g_persist" "0") + +# Convert numeric values to boolean for JSON +enabled_bool="false" +active_bool="false" +locked_bool="false" + +[ "$enabled" = "1" ] && enabled_bool="true" +[ "$active" = "1" ] && active_bool="true" + +# Get locked status from current_status +locked=$(echo "$current_status" | jsonfilter -e '@.locked' 2>/dev/null) +[ "$locked" = "1" ] && locked_bool="true" + +# Extract the message properly from current status +message_value=$(echo "$current_status" | jsonfilter -e '@.message' 2>/dev/null | sed 's/^"//;s/"$//') + +# Prepare JSON response in format expected by the component +cat <> "$LOG_FILE" + + # Debug logging + echo "[$timestamp] [$level] $message" >> "$DEBUG_FILE" + + # Log to system log + logger -t cell_lock -p "daemon.$level" "$message" +} + +# Log request details for debugging +log_request_info() { + echo "==== NEW REQUEST ====" >> "$DEBUG_FILE" + echo "METHOD: $REQUEST_METHOD" >> "$DEBUG_FILE" + echo "QUERY_STRING: $QUERY_STRING" >> "$DEBUG_FILE" + echo "CONTENT_LENGTH: $CONTENT_LENGTH" >> "$DEBUG_FILE" + echo "CONTENT_TYPE: $CONTENT_TYPE" >> "$DEBUG_FILE" +} + +# Function to validate time format (HH:MM) +validate_time_format() { + local time="$1" + local name="$2" + + if ! echo "$time" | grep -q '^[0-2][0-9]:[0-5][0-9]$'; then + echo "{\"status\":\"error\",\"message\":\"$name must be in format HH:MM (24-hour)\"}" + log_message "$name has invalid format: $time" "error" + return 1 + fi + + # Further validate hour (00-23) + local hour=$(echo "$time" | cut -d':' -f1) + if [ "$hour" -gt 23 ]; then + echo "{\"status\":\"error\",\"message\":\"Hour in $name must be between 00-23\"}" + log_message "$name has invalid hour: $hour" "error" + return 1 + fi + + return 0 +} + +# Log request info for debugging +log_request_info + +# Handle GET requests for status +if [ "$REQUEST_METHOD" = "GET" ]; then + log_message "Handling GET request" "debug" + + # Load UCI configuration + if [ -f "/etc/config/quecmanager" ]; then + ENABLED=$(uci -q get "$UCI_CONFIG.cell_lock.enabled" || echo "0") + START_TIME=$(uci -q get "$UCI_CONFIG.cell_lock.start_time" || echo "") + END_TIME=$(uci -q get "$UCI_CONFIG.cell_lock.end_time" || echo "") + ACTIVE=$(uci -q get "$UCI_CONFIG.cell_lock.active" || echo "0") + + # Convert to JSON boolean format + [ "$ENABLED" = "1" ] && ENABLED="true" || ENABLED="false" + [ "$ACTIVE" = "1" ] && ACTIVE="true" || ACTIVE="false" + + # Get current status from status file + STATUS="disabled" + MESSAGE="\"Scheduler is disabled\"" + + if [ -f "$STATUS_FILE" ]; then + STATUS=$(cat "$STATUS_FILE" | jsonfilter -e '@.status' 2>/dev/null) + MESSAGE=$(cat "$STATUS_FILE" | jsonfilter -e '@.message' 2>/dev/null) + if [ -n "$MESSAGE" ]; then + MESSAGE="\"$MESSAGE\"" + else + MESSAGE="\"Status not available\"" + fi + fi + + # Output JSON response + echo "{\"enabled\":$ENABLED,\"start_time\":\"$START_TIME\",\"end_time\":\"$END_TIME\",\"active\":$ACTIVE,\"status\":\"$STATUS\",\"message\":$MESSAGE}" + log_message "Returned status response" "debug" + else + echo "{\"enabled\":false,\"start_time\":\"\",\"end_time\":\"\",\"active\":false,\"status\":\"unknown\",\"message\":\"Configuration not found\"}" + log_message "No configuration found" "warn" + fi + exit 0 +fi + +# Handle POST requests for enabling/disabling scheduling +if [ "$REQUEST_METHOD" = "POST" ]; then + log_message "Handling POST request" "debug" + + # Read POST data + CONTENT_LENGTH=${CONTENT_LENGTH:-0} + if [ $CONTENT_LENGTH -gt 0 ]; then + POST_DATA=$(dd bs=1 count=$CONTENT_LENGTH 2>/dev/null) + echo "POST_DATA: $POST_DATA" >> "$DEBUG_FILE" + else + POST_DATA="" + echo "No POST_DATA (empty)" >> "$DEBUG_FILE" + fi + + # Try to parse JSON data + if [ -n "$POST_DATA" ] && command -v jsonfilter >/dev/null 2>&1; then + log_message "Attempting to parse JSON data" "debug" + + # Try to extract values from JSON - allow for differently named fields + ENABLED=$(echo "$POST_DATA" | jsonfilter -e '@.enabled' 2>/dev/null) + if [ -z "$ENABLED" ]; then + ENABLED=$(echo "$POST_DATA" | jsonfilter -e '@.enable' 2>/dev/null) + fi + + START_TIME=$(echo "$POST_DATA" | jsonfilter -e '@.startTime' 2>/dev/null) + if [ -z "$START_TIME" ]; then + START_TIME=$(echo "$POST_DATA" | jsonfilter -e '@.start_time' 2>/dev/null) + fi + + END_TIME=$(echo "$POST_DATA" | jsonfilter -e '@.endTime' 2>/dev/null) + if [ -z "$END_TIME" ]; then + END_TIME=$(echo "$POST_DATA" | jsonfilter -e '@.end_time' 2>/dev/null) + fi + + echo "Parsed JSON: enabled=$ENABLED, start=$START_TIME, end=$END_TIME" >> "$DEBUG_FILE" + + # Handle enable/disable logic + if [ "$ENABLED" = "true" ] || [ "$ENABLED" = "1" ]; then + # Validate times for enable request + if [ -z "$START_TIME" ] || [ -z "$END_TIME" ]; then + echo "{\"status\":\"error\",\"message\":\"Start time and end time are required\"}" + log_message "Missing start or end time" "error" + exit 1 + fi + + # Validate time formats + validate_time_format "$START_TIME" "Start time" || exit 1 + validate_time_format "$END_TIME" "End time" || exit 1 + + # Update configuration + log_message "Enabling scheduling with start=$START_TIME, end=$END_TIME" "info" + uci -q set "$UCI_CONFIG.cell_lock=scheduler" + uci set "$UCI_CONFIG.cell_lock.enabled=1" + uci set "$UCI_CONFIG.cell_lock.start_time=$START_TIME" + uci set "$UCI_CONFIG.cell_lock.end_time=$END_TIME" + uci commit "$UCI_CONFIG" + + # Ensure service is running + if [ -x "/etc/init.d/quecmanager_cell_locking" ]; then + /etc/init.d/quecmanager_cell_locking enable + /etc/init.d/quecmanager_cell_locking restart + log_message "Started scheduler service" "info" + else + log_message "Service script not found" "error" + echo "{\"status\":\"error\",\"message\":\"Service script not found\"}" + exit 1 + fi + + echo "{\"status\":\"success\",\"message\":\"Scheduling enabled\",\"startTime\":\"$START_TIME\",\"endTime\":\"$END_TIME\"}" + log_message "Successfully enabled scheduling" "info" + else + # Disable scheduling + log_message "Disabling scheduling" "info" + uci -q set "$UCI_CONFIG.cell_lock=scheduler" + uci set "$UCI_CONFIG.cell_lock.enabled=0" + uci commit "$UCI_CONFIG" + + # Stop service + if [ -x "/etc/init.d/quecmanager_cell_locking" ]; then + /etc/init.d/quecmanager_cell_locking stop + /etc/init.d/quecmanager_cell_locking disable + log_message "Stopped scheduler service" "info" + fi + + echo "{\"status\":\"success\",\"message\":\"Scheduling disabled\"}" + log_message "Successfully disabled scheduling" "info" + fi + else + log_message "Failed to parse JSON data or no JSON data received" "error" + echo "{\"status\":\"error\",\"message\":\"Invalid request or missing JSON data\"}" + fi + exit 0 +fi + +# If no valid method was handled +echo "{\"status\":\"error\",\"message\":\"Invalid request method\"}" +log_message "Invalid request method: $REQUEST_METHOD" "error" +exit 1 \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/apn-profiles/delete-apn-profile.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/apn-profiles/delete-apn-profile.sh new file mode 100644 index 0000000..8385338 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/apn-profiles/delete-apn-profile.sh @@ -0,0 +1,127 @@ +#!/bin/sh + +echo "Content-type: application/json" +echo "" + +# Initialize error tracking +has_error=false +error_message="" + +# Function to append to error message +append_error() { + if [ -z "$error_message" ]; then + error_message="$1" + else + error_message="$error_message; $1" + fi + has_error=true +} + +# Function to log cleanup events +log_message() { + local level="$1" + local message="$2" + local LOG_DIR="/tmp/log/apnprofile" + local LOG_FILE="${LOG_DIR}/apnprofile.log" + + # Ensure log directory exists + mkdir -p "${LOG_DIR}" + + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + echo "${timestamp} - [${level}] ${message}" >> "$LOG_FILE" + logger -t apnprofile "${level}: ${message}" +} + +log_message "INFO" "Starting APN Profile cleanup process" + +# Stop and disable the service +if [ -f "/etc/init.d/apnprofile-service" ]; then + if /etc/init.d/apnprofile-service stop; then + log_message "INFO" "APN Profile service stopped" + else + append_error "Failed to stop APN Profile service" + log_message "ERROR" "Failed to stop APN Profile service" + fi + + if /etc/init.d/apnprofile-service disable; then + log_message "INFO" "APN Profile service disabled" + else + append_error "Failed to disable APN Profile service" + log_message "ERROR" "Failed to disable APN Profile service" + fi + + # Remove the init.d script + if rm -f "/etc/init.d/apnprofile-service"; then + log_message "INFO" "Removed init.d script" + else + append_error "Failed to remove init.d script" + log_message "ERROR" "Failed to remove init.d script" + fi +fi + +# Remove service script +if [ -f "/www/cgi-bin/services/apnprofile.sh" ]; then + if rm -f "/www/cgi-bin/services/apnprofile.sh"; then + log_message "INFO" "Removed service script" + else + append_error "Failed to remove service script" + log_message "ERROR" "Failed to remove service script" + fi +fi + +# Remove symlinks in rc.d if they exist +for link in /etc/rc.d/S??apnprofile-service /etc/rc.d/K??apnprofile-service; do + if [ -L "$link" ]; then + if rm -f "$link"; then + log_message "INFO" "Removed rc.d symlink: $link" + else + append_error "Failed to remove rc.d symlink: $link" + log_message "ERROR" "Failed to remove rc.d symlink: $link" + fi + fi +done + +# Remove UCI configuration (only removes apn_profile section, leaves other sections intact) +if uci -q get quecmanager.apn_profile >/dev/null; then + if uci delete quecmanager.apn_profile && uci commit quecmanager; then + log_message "INFO" "Removed UCI configuration" + else + append_error "Failed to remove UCI configuration" + log_message "ERROR" "Failed to remove UCI configuration" + fi +fi + +# Kill any remaining processes +if pkill -f "/www/cgi-bin/services/apnprofile.sh"; then + log_message "INFO" "Killed remaining APN Profile processes" +fi + +# Clean up temporary files +for file in \ + "/tmp/at_pipe.txt" \ + "/var/run/apnprofile.pid" \ + "/tmp/apn_result.txt" \ + "/tmp/debug.log" \ + "/tmp/inputICCID.txt" \ + "/tmp/outputICCID.txt" \ + "/tmp/inputAPN.txt" \ + "/tmp/outputAPN.txt" +do + if [ -f "$file" ]; then + if rm -f "$file"; then + log_message "INFO" "Removed temporary file: $file" + else + append_error "Failed to remove temporary file: $file" + log_message "ERROR" "Failed to remove temporary file: $file" + fi + fi +done + +log_message "INFO" "APN Profile cleanup completed" + +# Return appropriate JSON response +if [ "$has_error" = true ]; then + echo "{\"status\": \"error\", \"message\": \"$error_message\"}" +else + echo "{\"status\": \"success\", \"message\": \"APN Profile service successfully removed\"}" +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/apn-profiles/fetch-apn-profile.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/apn-profiles/fetch-apn-profile.sh new file mode 100644 index 0000000..216bd2f --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/apn-profiles/fetch-apn-profile.sh @@ -0,0 +1,144 @@ +#!/bin/sh + +# Set headers for JSON response +echo "Content-type: application/json" +echo "" + +# Load UCI functions +. /lib/functions.sh + +# Function to safely get UCI value with default +get_uci_value() { + local value + config_get value apn_profile "$1" "$2" + echo "${value:-$2}" +} + +# Function to check if service is running +check_service_status() { + if [ -f "/var/run/apnprofile.pid" ]; then + pid=$(cat /var/run/apnprofile.pid) + if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then + echo "running" + return + fi + fi + + # Double check using process search + if pgrep -f "/www/cgi-bin/services/apnprofile.sh" >/dev/null; then + echo "running" + return + fi + + echo "stopped" +} + +# Function to get last log entry +get_last_log() { + local LOG_FILE="/tmp/log/apnprofile/apnprofile.log" + if [ -f "$LOG_FILE" ]; then + tail -n 1 "$LOG_FILE" + else + echo "No log entries found" + fi +} + +# Function to check if init.d service is enabled +check_service_enabled() { + if [ -f "/etc/init.d/apnprofile-service" ]; then + if /etc/init.d/apnprofile-service enabled; then + echo "true" + return + fi + fi + echo "false" +} + +# Load QuecManager configuration +config_load quecmanager + +# Check if APN Profile section exists +if ! uci -q get quecmanager.apn_profile >/dev/null; then + echo '{"status": "inactive", "message": "APN Profile service is not configured"}' + exit 0 +fi + +# Get enabled status from UCI +enabled=$(get_uci_value "enabled" "0") + +if [ "$enabled" != "1" ]; then + echo '{"status": "inactive", "message": "APN Profile service is disabled"}' + exit 0 +fi + +# Check if service script exists +if [ ! -f "/www/cgi-bin/services/apnprofile.sh" ]; then + echo '{"status": "error", "message": "Service script is missing"}' + exit 0 +fi + +# Get service status information +service_status=$(check_service_status) +service_enabled=$(check_service_enabled) +last_log=$(get_last_log) + +# Fetch all configuration values from UCI +iccid_profile1=$(get_uci_value "iccid_profile1" "") +apn_profile1=$(get_uci_value "apn_profile1" "") +pdp_type1=$(get_uci_value "pdp_type1" "") +iccid_profile2=$(get_uci_value "iccid_profile2" "") +apn_profile2=$(get_uci_value "apn_profile2" "") +pdp_type2=$(get_uci_value "pdp_type2" "") + +# Function to check if profile data exists +validate_profile_data() { + local iccid="$1" + local apn="$2" + local pdp="$3" + + [ -n "$iccid" ] && [ -n "$apn" ] && [ -n "$pdp" ] +} + +# Build JSON response +cat <> "$LOG_FILE" + logger -t apnprofile "${level}: ${message}" +} + +# Create required directories +mkdir -p /www/cgi-bin/services +mkdir -p /etc/init.d + +# Function to create service script +create_service_script() { + cat > /www/cgi-bin/services/apnprofile.sh <<'EOL' +#!/bin/sh + +# Load UCI functions +. /lib/functions.sh + +# Define file paths +QUEUE_FILE="/tmp/at_pipe.txt" +LOG_DIR="/tmp/log/apnprofile" +LOG_FILE="${LOG_DIR}/apnprofile.log" +PID_FILE="/var/run/apnprofile.pid" +STATE_FILE="/tmp/apnprofile_state.json" + +mkdir -p "${LOG_DIR}" +[ ! -f "${QUEUE_FILE}" ] && touch "${QUEUE_FILE}" + +# Save PID +echo $$ > "${PID_FILE}" + +# Enhanced logging function +log_message() { + local level="$1" + local message="$2" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + echo "${timestamp} - [${level}] ${message}" >> "$LOG_FILE" + logger -t apnprofile "${level}: ${message}" +} + +# AT command handling with locking +handle_lock() { + local max_wait=30 + local wait_count=0 + + while [ -f "$QUEUE_FILE" ] && grep -q "AT_COMMAND" "$QUEUE_FILE" && [ $wait_count -lt $max_wait ]; do + sleep 1 + wait_count=$((wait_count + 1)) + done + + printf '{"command":"AT_COMMAND","pid":"%s","timestamp":"%s"}\n' "$$" "$(date '+%H:%M:%S')" >> "$QUEUE_FILE" +} + +# Execute AT command with retries +execute_at_command() { + local command="$1" + local result="" + local retry_count=0 + local max_retries=3 + + while [ $retry_count -lt $max_retries ]; do + handle_lock + result=$(sms_tool at "$command" -t 4 2>&1) + local status=$? + sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE" + + if [ $status -eq 0 ] && [ -n "$result" ]; then + echo "$result" + return 0 + fi + + retry_count=$((retry_count + 1)) + [ $retry_count -lt $max_retries ] && sleep 2 + done + + return 1 +} + +# Get current ICCID +get_current_iccid() { + local result=$(execute_at_command "AT+ICCID") + if [ $? -eq 0 ] && echo "$result" | grep -q "+ICCID:"; then + echo "$result" | grep "+ICCID:" | cut -d' ' -f2 | tr -d '[:space:]' + return 0 + fi + return 1 +} + +# Set APN with error handling +set_apn() { + local pdp_type="$1" + local apn="$2" + + if [ -z "$pdp_type" ] || [ -z "$apn" ]; then + return 1 + fi + + if execute_at_command "AT+CGDCONT=1,\"$pdp_type\",\"$apn\";+COPS=2;+COPS=0"; then + return 0 + fi + return 1 +} + +# Function to get current configuration hash +get_config_hash() { + config_load quecmanager + local hash_input="" + + # Get Profile 1 + config_get ICCID_PROFILE1 apn_profile iccid_profile1 + config_get APN_PROFILE1 apn_profile apn_profile1 + config_get PDP_TYPE1 apn_profile pdp_type1 + + # Get Profile 2 + config_get ICCID_PROFILE2 apn_profile iccid_profile2 + config_get APN_PROFILE2 apn_profile apn_profile2 + config_get PDP_TYPE2 apn_profile pdp_type2 + + hash_input="${ICCID_PROFILE1}${APN_PROFILE1}${PDP_TYPE1}${ICCID_PROFILE2}${APN_PROFILE2}${PDP_TYPE2}" + echo "$hash_input" | md5sum | cut -d' ' -f1 +} + +# Function to read state file +read_state() { + if [ -f "$STATE_FILE" ]; then + cat "$STATE_FILE" + else + echo "{}" + fi +} + +# Function to write state file +write_state() { + local current_iccid="$1" + local config_hash="$2" + local status="$3" + + printf '{"iccid":"%s","config_hash":"%s","status":"%s","timestamp":"%s"}' \ + "$current_iccid" "$config_hash" "$status" "$(date '+%Y-%m-%d %H:%M:%S')" > "$STATE_FILE" +} + +# Main service loop +while true; do + # Get current state + current_state=$(read_state) + current_iccid=$(get_current_iccid) + config_hash=$(get_config_hash) + + # Extract values from current state + state_iccid=$(echo "$current_state" | sed -n 's/.*"iccid":"\([^"]*\)".*/\1/p') + state_hash=$(echo "$current_state" | sed -n 's/.*"config_hash":"\([^"]*\)".*/\1/p') + + needs_update=0 + + # Check if update is needed + if [ ! -f "$STATE_FILE" ]; then + log_message "INFO" "No state file found, will apply profile" + needs_update=1 + elif [ "$current_iccid" != "$state_iccid" ]; then + log_message "INFO" "ICCID changed from $state_iccid to $current_iccid" + needs_update=1 + elif [ "$config_hash" != "$state_hash" ]; then + log_message "INFO" "Configuration changed" + needs_update=1 + fi + + if [ $needs_update -eq 1 ] && [ -n "$current_iccid" ]; then + config_load quecmanager + + # Get Profile 1 + config_get ICCID_PROFILE1 apn_profile iccid_profile1 + config_get APN_PROFILE1 apn_profile apn_profile1 + config_get PDP_TYPE1 apn_profile pdp_type1 + + # Get Profile 2 + config_get ICCID_PROFILE2 apn_profile iccid_profile2 + config_get APN_PROFILE2 apn_profile apn_profile2 + config_get PDP_TYPE2 apn_profile pdp_type2 + + if [ "${current_iccid}" = "${ICCID_PROFILE1}" ]; then + if set_apn "$PDP_TYPE1" "$APN_PROFILE1"; then + log_message "INFO" "Successfully applied Profile 1" + write_state "$current_iccid" "$config_hash" "success" + else + log_message "ERROR" "Failed to apply Profile 1" + write_state "$current_iccid" "$config_hash" "error" + fi + elif [ -n "$ICCID_PROFILE2" ] && [ "${current_iccid}" = "${ICCID_PROFILE2}" ]; then + if set_apn "$PDP_TYPE2" "$APN_PROFILE2"; then + log_message "INFO" "Successfully applied Profile 2" + write_state "$current_iccid" "$config_hash" "success" + else + log_message "ERROR" "Failed to apply Profile 2" + write_state "$current_iccid" "$config_hash" "error" + fi + else + log_message "INFO" "No matching ICCID profile found" + write_state "$current_iccid" "$config_hash" "no_match" + fi + fi + + sleep 10 +done +EOL + + chmod 755 /www/cgi-bin/services/apnprofile.sh +} + +# Function to create init.d script +create_init_script() { + cat > /etc/init.d/apnprofile-service <<'EOL' +#!/bin/sh /etc/rc.common + +START=99 +STOP=10 +USE_PROCD=1 + +start_service() { + local enabled + + # Check if service is enabled in UCI + config_load quecmanager + config_get enabled apn_profile enabled '0' + + [ "$enabled" != "1" ] && return 0 + + procd_open_instance + procd_set_param command /www/cgi-bin/services/apnprofile.sh + procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} + procd_set_param stdout 1 + procd_set_param stderr 1 + procd_set_param nice 19 + procd_close_instance +} + +service_triggers() { + procd_add_reload_trigger "quecmanager" +} + +reload_service() { + stop + start +} +EOL + + chmod 755 /etc/init.d/apnprofile-service +} + +# Initialize UCI configuration +touch /etc/config/quecmanager + +# Remove existing APN profile section if it exists +uci -q delete quecmanager.apn_profile + +# Create new APN profile section +uci set quecmanager.apn_profile=service +uci set quecmanager.apn_profile.enabled=1 + +# Set Profile 1 configuration +uci set quecmanager.apn_profile.iccid_profile1="$iccidProfile1" +uci set quecmanager.apn_profile.apn_profile1="$apnProfile1" +uci set quecmanager.apn_profile.pdp_type1="$pdpType1" + +# Set Profile 2 configuration if provided +if [ -n "$iccidProfile2" ]; then + uci set quecmanager.apn_profile.iccid_profile2="$iccidProfile2" + uci set quecmanager.apn_profile.apn_profile2="$apnProfile2" + uci set quecmanager.apn_profile.pdp_type2="$pdpType2" +fi + +# Commit UCI changes +if ! uci commit quecmanager; then + log_message "ERROR" "Failed to save UCI configuration" + echo '{"status": "error", "message": "Failed to save UCI configuration"}' + exit 1 +fi + +log_message "INFO" "UCI configuration saved successfully" + +# Create service script if it doesn't exist +if [ ! -f "/www/cgi-bin/services/apnprofile.sh" ]; then + create_service_script + log_message "INFO" "Created service script" +fi + +# Create init.d script if it doesn't exist +if [ ! -f "/etc/init.d/apnprofile-service" ]; then + create_init_script + log_message "INFO" "Created init.d script" +fi + +# Enable and start the service +/etc/init.d/apnprofile-service enable +if /etc/init.d/apnprofile-service restart; then + log_message "INFO" "Service started successfully" + echo '{"status": "success", "message": "APN profiles saved and service started"}' +else + log_message "ERROR" "Failed to start service" + echo '{"status": "error", "message": "Failed to start service"}' +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/imei-profiles/delete-imei-profile.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/imei-profiles/delete-imei-profile.sh new file mode 100644 index 0000000..b6f4c76 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/imei-profiles/delete-imei-profile.sh @@ -0,0 +1,127 @@ +#!/bin/sh + +echo "Content-type: application/json" +echo "" + +# Initialize error tracking +has_error=false +error_message="" + +# Function to append to error message +append_error() { + if [ -z "$error_message" ]; then + error_message="$1" + else + error_message="$error_message; $1" + fi + has_error=true +} + +# Function to log cleanup events +log_message() { + local level="$1" + local message="$2" + local LOG_DIR="/tmp/log/imeiprofile" + local LOG_FILE="${LOG_DIR}/imeiprofile.log" + + # Ensure log directory exists + mkdir -p "${LOG_DIR}" + + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + echo "${timestamp} - [${level}] ${message}" >> "$LOG_FILE" + logger -t imeiprofile "${level}: ${message}" +} + +log_message "INFO" "Starting IMEI Profile cleanup process" + +# Stop and disable the service +if [ -f "/etc/init.d/imeiprofile-service" ]; then + if /etc/init.d/imeiprofile-service stop; then + log_message "INFO" "IMEI Profile service stopped" + else + append_error "Failed to stop IMEI Profile service" + log_message "ERROR" "Failed to stop IMEI Profile service" + fi + + if /etc/init.d/imeiprofile-service disable; then + log_message "INFO" "IMEI Profile service disabled" + else + append_error "Failed to disable IMEI Profile service" + log_message "ERROR" "Failed to disable IMEI Profile service" + fi + + # Remove the init.d script + if rm -f "/etc/init.d/imeiprofile-service"; then + log_message "INFO" "Removed init.d script" + else + append_error "Failed to remove init.d script" + log_message "ERROR" "Failed to remove init.d script" + fi +fi + +# Remove service script +if [ -f "/www/cgi-bin/services/imeiprofile.sh" ]; then + if rm -f "/www/cgi-bin/services/imeiprofile.sh"; then + log_message "INFO" "Removed service script" + else + append_error "Failed to remove service script" + log_message "ERROR" "Failed to remove service script" + fi +fi + +# Remove symlinks in rc.d if they exist +for link in /etc/rc.d/S??imeiprofile-service /etc/rc.d/K??imeiprofile-service; do + if [ -L "$link" ]; then + if rm -f "$link"; then + log_message "INFO" "Removed rc.d symlink: $link" + else + append_error "Failed to remove rc.d symlink: $link" + log_message "ERROR" "Failed to remove rc.d symlink: $link" + fi + fi +done + +# Remove UCI configuration +if uci -q get quecmanager.imei_profile >/dev/null; then + if uci delete quecmanager.imei_profile && uci commit quecmanager; then + log_message "INFO" "Removed UCI configuration" + else + append_error "Failed to remove UCI configuration" + log_message "ERROR" "Failed to remove UCI configuration" + fi +fi + +# Kill any remaining processes +if pkill -f "/www/cgi-bin/services/imeiprofile.sh"; then + log_message "INFO" "Killed remaining IMEI Profile processes" +fi + +# Clean up temporary files +for file in \ + "/tmp/at_pipe.txt" \ + "/var/run/imeiprofile.pid" \ + "/tmp/imei_result.txt" \ + "/tmp/debug.log" \ + "/tmp/inputICCID.txt" \ + "/tmp/outputICCID.txt" \ + "/tmp/inputIMEI.txt" \ + "/tmp/outputIMEI.txt" +do + if [ -f "$file" ]; then + if rm -f "$file"; then + log_message "INFO" "Removed temporary file: $file" + else + append_error "Failed to remove temporary file: $file" + log_message "ERROR" "Failed to remove temporary file: $file" + fi + fi +done + +log_message "INFO" "IMEI Profile cleanup completed" + +# Return appropriate JSON response +if [ "$has_error" = true ]; then + echo "{\"status\": \"error\", \"message\": \"$error_message\"}" +else + echo "{\"status\": \"success\", \"message\": \"IMEI Profile service successfully removed\"}" +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/imei-profiles/fetch-imei-profile.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/imei-profiles/fetch-imei-profile.sh new file mode 100644 index 0000000..25ebeb8 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/imei-profiles/fetch-imei-profile.sh @@ -0,0 +1,138 @@ +#!/bin/sh + +# Set headers for JSON response +echo "Content-type: application/json" +echo "" + +# Load UCI functions +. /lib/functions.sh + +# Function to safely get UCI value with default +get_uci_value() { + local value + config_get value imei_profile "$1" "$2" + echo "${value:-$2}" +} + +# Function to check if service is running +check_service_status() { + if [ -f "/var/run/imeiprofile.pid" ]; then + pid=$(cat /var/run/imeiprofile.pid) + if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then + echo "running" + return + fi + fi + + # Double check using process search + if pgrep -f "/www/cgi-bin/services/imeiprofile.sh" >/dev/null; then + echo "running" + return + fi + + echo "stopped" +} + +# Function to get last log entry +get_last_log() { + local LOG_FILE="/tmp/log/imeiprofile/imeiprofile.log" + if [ -f "$LOG_FILE" ]; then + tail -n 1 "$LOG_FILE" + else + echo "No log entries found" + fi +} + +# Function to check if init.d service is enabled +check_service_enabled() { + if [ -f "/etc/init.d/imeiprofile-service" ]; then + if /etc/init.d/imeiprofile-service enabled; then + echo "true" + return + fi + fi + echo "false" +} + +# Load QuecManager configuration +config_load quecmanager + +# Check if IMEI Profile section exists +if ! uci -q get quecmanager.imei_profile >/dev/null; then + echo '{"status": "inactive", "message": "IMEI Profile service is not configured"}' + exit 0 +fi + +# Get enabled status from UCI +enabled=$(get_uci_value "enabled" "0") + +if [ "$enabled" != "1" ]; then + echo '{"status": "inactive", "message": "IMEI Profile service is disabled"}' + exit 0 +fi + +# Check if service script exists +if [ ! -f "/www/cgi-bin/services/imeiprofile.sh" ]; then + echo '{"status": "error", "message": "Service script is missing"}' + exit 0 +fi + +# Get service status information +service_status=$(check_service_status) +service_enabled=$(check_service_enabled) +last_log=$(get_last_log) + +# Fetch configuration values from UCI +iccid_profile1=$(get_uci_value "iccid_profile1" "") +imei_profile1=$(get_uci_value "imei_profile1" "") +iccid_profile2=$(get_uci_value "iccid_profile2" "") +imei_profile2=$(get_uci_value "imei_profile2" "") + +# Function to check if profile data exists +validate_profile_data() { + local iccid="$1" + local imei="$2" + [ -n "$iccid" ] && [ -n "$imei" ] +} + +# Build JSON response +cat <> "$LOG_FILE" + logger -t imeiprofile "${level}: ${message}" +} + +# Create required directories +mkdir -p /www/cgi-bin/services + +# Function to create service script +create_service_script() { + cat > /www/cgi-bin/services/imeiprofile.sh <<'EOL' +#!/bin/sh + +# Load UCI functions +. /lib/functions.sh + +# Define file paths +QUEUE_FILE="/tmp/at_pipe.txt" +LOG_DIR="/tmp/log/imeiprofile" +LOG_FILE="${LOG_DIR}/imeiprofile.log" +PID_FILE="/var/run/imeiprofile.pid" + +mkdir -p "${LOG_DIR}" +[ ! -f "${QUEUE_FILE}" ] && touch "${QUEUE_FILE}" + +# Save PID +echo $$ > "${PID_FILE}" + +# Enhanced logging function +log_message() { + local level="$1" + local message="$2" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + echo "${timestamp} - [${level}] ${message}" >> "$LOG_FILE" + logger -t imeiprofile "${level}: ${message}" +} + +# AT command handling with locking +handle_lock() { + local max_wait=30 + local wait_count=0 + + while [ -f "$QUEUE_FILE" ] && grep -q "AT_COMMAND" "$QUEUE_FILE" && [ $wait_count -lt $max_wait ]; do + sleep 1 + wait_count=$((wait_count + 1)) + done + + printf '{"command":"AT_COMMAND","pid":"%s","timestamp":"%s"}\n' "$$" "$(date '+%H:%M:%S')" >> "$QUEUE_FILE" +} + +# Execute AT command with retries +execute_at_command() { + local command="$1" + local result="" + local retry_count=0 + local max_retries=3 + + while [ $retry_count -lt $max_retries ]; do + handle_lock + result=$(sms_tool at "$command" -t 4 2>&1) + local status=$? + sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE" + + if [ $status -eq 0 ] && [ -n "$result" ]; then + echo "$result" + return 0 + fi + + retry_count=$((retry_count + 1)) + [ $retry_count -lt $max_retries ] && sleep 2 + done + + return 1 +} + +# Get current ICCID +get_current_iccid() { + local result=$(execute_at_command "AT+ICCID") + if [ $? -eq 0 ] && echo "$result" | grep -q "+ICCID:"; then + echo "$result" | grep "+ICCID:" | cut -d' ' -f2 | tr -d '[:space:]' + return 0 + fi + return 1 +} + +# Get current IMEI +get_current_imei() { + local result=$(execute_at_command "AT+CGSN") + if [ $? -eq 0 ]; then + echo "$result" | grep -v "AT+CGSN" | grep -v "OK" | tr -d '\r\n[:space:]' + return 0 + fi + return 1 +} + +# Set IMEI +set_imei() { + local imei="$1" + if execute_at_command "AT+EGMR=1,7,\"$imei\";+QPOWD=1"; then + return 0 + fi + return 1 +} + +# Function to safely get UCI value with default +get_uci_value() { + local value + config_get value imei_profile "$1" "$2" + echo "${value:-$2}" +} + +# Main service loop +while true; do + # Load current configuration + config_load quecmanager + + # Get Profile 1 + iccid_profile1=$(get_uci_value "iccid_profile1") + imei_profile1=$(get_uci_value "imei_profile1") + + # Get Profile 2 + iccid_profile2=$(get_uci_value "iccid_profile2") + imei_profile2=$(get_uci_value "imei_profile2") + + # Get current ICCID and IMEI + current_iccid=$(get_current_iccid) + current_imei=$(get_current_imei) + + if [ $? -eq 0 ] && [ -n "$current_iccid" ] && [ -n "$current_imei" ]; then + if [ "${current_iccid}" = "${iccid_profile1}" ]; then + if [ "${current_imei}" != "${imei_profile1}" ]; then + if set_imei "${imei_profile1}"; then + log_message "INFO" "Successfully applied Profile 1 IMEI" + else + log_message "ERROR" "Failed to apply Profile 1 IMEI" + fi + fi + elif [ -n "$iccid_profile2" ] && [ "${current_iccid}" = "${iccid_profile2}" ]; then + if [ "${current_imei}" != "${imei_profile2}" ]; then + if set_imei "${imei_profile2}"; then + log_message "INFO" "Successfully applied Profile 2 IMEI" + else + log_message "ERROR" "Failed to apply Profile 2 IMEI" + fi + fi + else + log_message "INFO" "No matching ICCID profile found" + fi + else + log_message "ERROR" "Failed to get current ICCID or IMEI" + fi + + sleep 30 +done +EOL + + chmod 755 /www/cgi-bin/services/imeiprofile.sh +} + +# Function to create init.d script +create_init_script() { + cat > /etc/init.d/imeiprofile-service <<'EOL' +#!/bin/sh /etc/rc.common + +START=99 +STOP=10 +USE_PROCD=1 + +start_service() { + local enabled + + # Check if service is enabled in UCI + config_load quecmanager + config_get enabled imei_profile enabled '0' + + [ "$enabled" != "1" ] && return 0 + + procd_open_instance + procd_set_param command /www/cgi-bin/services/imeiprofile.sh + procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} + procd_set_param stdout 1 + procd_set_param stderr 1 + procd_set_param nice 19 + procd_close_instance +} + +service_triggers() { + procd_add_reload_trigger "quecmanager" +} + +reload_service() { + stop + start +} +EOL + + chmod 755 /etc/init.d/imeiprofile-service +} + +# Initialize UCI configuration +touch /etc/config/quecmanager + +# Remove existing IMEI profile section if it exists +uci -q delete quecmanager.imei_profile + +# Create new IMEI profile section +uci set quecmanager.imei_profile=service +uci set quecmanager.imei_profile.enabled=1 + +# Set Profile 1 configuration +uci set quecmanager.imei_profile.iccid_profile1="$iccidProfile1" +uci set quecmanager.imei_profile.imei_profile1="$imeiProfile1" + +# Set Profile 2 configuration if provided +if [ -n "$iccidProfile2" ]; then + uci set quecmanager.imei_profile.iccid_profile2="$iccidProfile2" + uci set quecmanager.imei_profile.imei_profile2="$imeiProfile2" +fi + +# Commit UCI changes +if ! uci commit quecmanager; then + log_message "ERROR" "Failed to save UCI configuration" + echo '{"status": "error", "message": "Failed to save UCI configuration"}' + exit 1 +fi + +log_message "INFO" "UCI configuration saved successfully" + +# Create service script if it doesn't exist +if [ ! -f "/www/cgi-bin/services/imeiprofile.sh" ]; then + create_service_script + log_message "INFO" "Created service script" +fi + +# Create init.d script if it doesn't exist +if [ ! -f "/etc/init.d/imeiprofile-service" ]; then + create_init_script + log_message "INFO" "Created init.d script" +fi + +# Enable and start the service +/etc/init.d/imeiprofile-service enable +if /etc/init.d/imeiprofile-service restart; then + log_message "INFO" "Service started successfully" + echo '{"status": "success", "message": "IMEI profiles saved and service started"}' +else + log_message "ERROR" "Failed to start service" + echo '{"status": "error", "message": "Failed to start service"}' +fi diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/scheduled_cell_locking.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/scheduled_cell_locking.sh new file mode 100644 index 0000000..86ad1b8 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/scheduled_cell_locking.sh @@ -0,0 +1,262 @@ +#!/bin/sh + +# Configuration +CONFIG_FILE="/etc/cell_lock_schedule.conf" +STATUS_FILE="/tmp/cell_lock_status" +CELL_LOCK_SCRIPT="/usr/bin/set_cell_lock.sh" +QUEUE_FILE="/tmp/at_pipe.txt" +LOG_FILE="/tmp/cell_lock.log" + +# Function to log messages +log_message() { + local level="$1" + local message="$2" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + echo "${timestamp} - [${level}] ${message}" >> "$LOG_FILE" + logger -t cell_lock "${level}: ${message}" +} + +# Function to handle AT command queue +handle_lock() { + log_message "DEBUG" "Checking queue file status before lock" + if [ ! -f "$QUEUE_FILE" ]; then + log_message "DEBUG" "Queue file does not exist, creating it" + touch "$QUEUE_FILE" + fi + + # Clean any stale entries + if grep -q "\"command\":\"AT_COMMAND\"" "$QUEUE_FILE"; then + local wait_count=0 + while [ $wait_count -lt 6 ]; do + if ! grep -q "\"command\":\"AT_COMMAND\"" "$QUEUE_FILE"; then + break + fi + sleep 1 + wait_count=$((wait_count + 1)) + done + [ $wait_count -eq 6 ] && sed -i "/\"command\":\"AT_COMMAND\"/d" "$QUEUE_FILE" + fi + + printf '{"command":"AT_COMMAND","pid":"%s","timestamp":"%s"}\n' \ + "$$" \ + "$(date '+%H:%M:%S')" >> "$QUEUE_FILE" +} + +# Function to execute AT command +execute_at_command() { + local command="$1" + local result="" + + log_message "DEBUG" "Executing AT command: ${command}" + handle_lock + + result=$(sms_tool at "$command" -t 4 2>&1) + local status=$? + + sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE" + + if [ $status -ne 0 ]; then + log_message "ERROR" "Command failed with status $status: $command" + log_message "ERROR" "Command output: $result" + return 1 + fi + + log_message "DEBUG" "Command successful. Output: $result" + echo "$result" + return 0 +} + +# Function to create set_cell_lock.sh script +create_cell_lock_script() { + if [ ! -f "$CELL_LOCK_SCRIPT" ]; then + cat >"$CELL_LOCK_SCRIPT" <<'EOL' +#!/bin/sh + +ACTION=$1 +LTE_PARAMS=$2 +NR5G_PARAMS=$3 + +QUEUE_FILE="/tmp/at_pipe.txt" +LOG_FILE="/tmp/cell_lock.log" + +# Import common functions +. /etc/quecmanager/imei_profile/common_functions.sh || { + echo "Failed to import common functions" + exit 1 +} + +case "$ACTION" in + enable) + # Enable LTE lock if parameters exist + if [ -n "$LTE_PARAMS" ]; then + execute_at_command "AT+QNWLOCK=\"common/4g\",$LTE_PARAMS" + fi + + # Enable NR5G lock if parameters exist + if [ -n "$NR5G_PARAMS" ]; then + execute_at_command "AT+QNWLOCK=\"common/5g\",$NR5G_PARAMS" + fi + ;; + + disable) + # Disable LTE lock + execute_at_command "AT+QNWLOCK=\"common/4g\",0" + + # Disable NR5G lock + execute_at_command "AT+QNWLOCK=\"common/5g\",0" + ;; + + *) + log_message "ERROR" "Invalid action: $ACTION" + exit 1 + ;; +esac + +# Restart network registration to apply changes +execute_at_command "AT+COPS=2" +sleep 2 +execute_at_command "AT+COPS=0" +exit 0 +EOL + + chmod +x "$CELL_LOCK_SCRIPT" + log_message "INFO" "Created cell lock script at $CELL_LOCK_SCRIPT" + fi +} + +# Function to remove set_cell_lock.sh script +remove_cell_lock_script() { + if [ -f "$CELL_LOCK_SCRIPT" ]; then + rm "$CELL_LOCK_SCRIPT" + log_message "INFO" "Removed cell lock script" + fi +} + +# Function to urldecode +urldecode() { + echo -e "$(echo "$1" | sed 's/+/ /g;s/%\([0-9A-F][0-9A-F]\)/\\x\1/g')" +} + +# Function to convert HH:MM to cron format +convert_to_cron_time() { + echo "$1" | awk -F: '{print $2, $1}' +} + +# Function to save configuration +save_config() { + echo "START_TIME=$1" >"$CONFIG_FILE" + echo "END_TIME=$2" >>"$CONFIG_FILE" + echo "ENABLED=1" >>"$CONFIG_FILE" + log_message "INFO" "Saved configuration - Start: $1, End: $2" +} + +# Function to disable scheduling +disable_scheduling() { + if [ -f "$CONFIG_FILE" ]; then + sed -i 's/ENABLED=1/ENABLED=0/' "$CONFIG_FILE" + log_message "INFO" "Disabled scheduling" + fi + crontab -l | grep -v "set_cell_lock.sh" | crontab - + remove_cell_lock_script +} + +# Function to get current status +get_status() { + if [ -f "$CONFIG_FILE" ]; then + ENABLED=$(grep "ENABLED=" "$CONFIG_FILE" | cut -d'=' -f2) + START_TIME=$(grep "START_TIME=" "$CONFIG_FILE" | cut -d'=' -f2) + END_TIME=$(grep "END_TIME=" "$CONFIG_FILE" | cut -d'=' -f2) + + echo "Status: 200 OK" + echo "Content-Type: application/json" + echo "" + echo "{\"enabled\":$ENABLED,\"start_time\":\"$START_TIME\",\"end_time\":\"$END_TIME\"}" + else + echo "Status: 200 OK" + echo "Content-Type: application/json" + echo "" + echo "{\"enabled\":0,\"start_time\":\"\",\"end_time\":\"\"}" + fi +} + +# Handle POST requests +if [ "$REQUEST_METHOD" = "POST" ]; then + read -r POST_DATA + + if echo "$POST_DATA" | grep -q "disable=true"; then + disable_scheduling + echo "Status: 200 OK" + echo "Content-Type: application/json" + echo "" + echo "{\"status\":\"success\",\"message\":\"Scheduling disabled\"}" + exit 0 + fi + + START_TIME=$(echo "$POST_DATA" | grep -o 'start_time=[^&]*' | cut -d'=' -f2) + END_TIME=$(echo "$POST_DATA" | grep -o 'end_time=[^&]*' | cut -d'=' -f2) + + START_TIME=$(urldecode "$START_TIME") + END_TIME=$(urldecode "$END_TIME") + + if [ -z "$START_TIME" ] || [ -z "$END_TIME" ]; then + log_message "ERROR" "Missing start or end time" + echo "Status: 400 Bad Request" + echo "Content-Type: application/json" + echo "" + echo "{\"error\":\"Missing start or end time\"}" + exit 1 + fi + + create_cell_lock_script + + CRON_START=$(convert_to_cron_time "$START_TIME") + CRON_END=$(convert_to_cron_time "$END_TIME") + + save_config "$START_TIME" "$END_TIME" + + # Check current cell lock status and get parameters + LTE_STATUS=$(execute_at_command 'AT+QNWLOCK="common/4g"') + NR5G_STATUS=$(execute_at_command 'AT+QNWLOCK="common/5g"') + + LTE_PARAMS=$(echo "$LTE_STATUS" | grep -o '"common/4g",[^[:space:]]*' | cut -d',' -f2-) + NR5G_PARAMS=$(echo "$NR5G_STATUS" | grep -o '"common/5g",[^[:space:]]*' | cut -d',' -f2-) + + TEMP_CRON=$(mktemp) + + crontab -l 2>/dev/null | grep -v "set_cell_lock.sh" >"$TEMP_CRON" + + echo "$CRON_START * * * $CELL_LOCK_SCRIPT enable \"$LTE_PARAMS\" \"$NR5G_PARAMS\"" >>"$TEMP_CRON" + echo "$CRON_END * * * $CELL_LOCK_SCRIPT disable" >>"$TEMP_CRON" + + crontab "$TEMP_CRON" + rm "$TEMP_CRON" + + log_message "INFO" "Scheduling enabled with start time $START_TIME and end time $END_TIME" + + echo "Status: 200 OK" + echo "Content-Type: application/json" + echo "" + echo "{\"status\":\"success\",\"message\":\"Scheduling enabled\"}" + exit 0 +fi + +# Parse query string for GET requests +if [ "$REQUEST_METHOD" = "GET" ]; then + QUERY_STRING=$(echo "$QUERY_STRING" | sed 's/&/\n/g') + for param in $QUERY_STRING; do + case "$param" in + status=*) + get_status + exit 0 + ;; + esac + done +fi + +# If no valid request is made +log_message "ERROR" "Invalid request received" +echo "Status: 400 Bad Request" +echo "Content-Type: application/json" +echo "" +echo "{\"error\":\"Invalid request\"}" +exit 1 \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_delete.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_delete.sh new file mode 100644 index 0000000..d2eb762 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_delete.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +# Set content type +printf "Content-Type: application/json\n\n" + +# URL decode function +urldecode() { + echo "$*" | sed 's/+/ /g;s/%\([0-9A-F][0-9A-F]\)/\\\\x\1/g' | xargs -0 printf '%b' +} + +# Extract indexes from query string +query=$(echo "$QUERY_STRING" | grep -o 'indexes=[^&]*' | cut -d= -f2) +indexes=$(urldecode "$query") + +# Function to output JSON response +send_json() { + printf '{"status":"%s","message":"%s"}\n' "$1" "$2" +} + +# Validate input +if [ -z "$indexes" ]; then + send_json "error" "No indexes provided" + exit 0 +fi + +# Initialize counters +success=0 +failure=0 + +# Process each index +echo "$indexes" | tr ',' '\n' | while read -r index; do + if [ -n "$index" ] && [ "$index" -eq "$index" ] 2>/dev/null; then + if sms_tool delete "$index" 2>/dev/null; then + success=$((success + 1)) + else + failure=$((failure + 1)) + fi + fi +done + +# Send response +if [ $success -gt 0 ]; then + if [ $failure -eq 0 ]; then + send_json "success" "Successfully deleted $success message(s)" + else + send_json "partial" "Deleted $success message(s), failed to delete $failure message(s)" + fi +else + send_json "error" "Failed to delete messages" +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_inbox.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_inbox.sh new file mode 100644 index 0000000..4d3e0ef --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_inbox.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +printf "Content-type: application/json\r\n\r\n" + +# Execute the command and return the JSON response +if command -v sms_tool > /dev/null 2>&1; then + sms_tool -j recv +else + printf '{"error": "sms_tool not found"}\n' +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_send.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_send.sh new file mode 100644 index 0000000..f405e20 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/cell-settings/sms/sms_send.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +echo "Content-Type: application/json" +echo "Cache-Control: no-cache" +echo "" + +# Function to URL decode the string +urldecode() { + local url_encoded="${1//+/ }" + printf '%b' "${url_encoded//%/\\x}" +} + +# Function to escape JSON string +escape_json() { + printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g; s/\r/\\r/g; s/\t/\\t/g' +} + +# Read POST data +read -r QUERY_STRING + +# Extract phone and message from POST data +phone=$(echo "$QUERY_STRING" | grep -o 'phone=[^&]*' | cut -d= -f2) +message=$(echo "$QUERY_STRING" | grep -o 'message=[^&]*' | cut -d= -f2) + +# URL decode the message +decoded_message=$(urldecode "$message") + +# Validate inputs +if [ -z "$phone" ] || [ -z "$message" ]; then + echo '{"success":false,"error":"Phone number and message are required"}' + exit 0 +fi + +# Validate phone number (only numbers allowed) +if ! echo "$phone" | grep -q '^[0-9]\+$'; then + echo '{"success":false,"error":"Invalid phone number format"}' + exit 0 +fi + +# Try to send SMS and capture output +result=$(sms_tool send "$phone" "$decoded_message" 2>&1) +escaped_result=$(escape_json "$result") + +# Check if SMS was sent successfully by looking for "sms sent sucessfully" +if echo "$result" | grep -q "sms sent sucessfully"; then + # Extract the message ID if present + message_id=$(echo "$result" | grep -o '[0-9]*$') + echo "{\"success\":true,\"message\":\"SMS sent successfully\",\"messageId\":\"$message_id\",\"raw\":\"$escaped_result\"}" +elif echo "$result" | grep -q "sms not sent, code 350"; then + # Kill any hanging sms_tool process + pkill -f "sms_tool send" + echo '{"success":false,"error":"No prepaid credit available"}' +else + # Kill any hanging sms_tool process + pkill -f "sms_tool send" + echo "{\"success\":false,\"error\":\"Failed to send SMS\",\"raw\":\"$escaped_result\"}" +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/cell_scan.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/cell_scan.sh new file mode 100644 index 0000000..7606a9f --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/cell_scan.sh @@ -0,0 +1,168 @@ +#!/bin/sh + +# Set content type to JSON +echo "Content-type: application/json" +echo "" + +# Configuration +QUEUE_DIR="/tmp/at_queue" +RESULTS_DIR="$QUEUE_DIR/results" +TOKEN_FILE="$QUEUE_DIR/token" +RESULT_FILE="/tmp/qscan_result.json" +WORKER_SCRIPT="/www/cgi-bin/quecmanager/experimental/cell_scanner/cell_scan_worker.sh" +PID_FILE="/tmp/cell_scan.pid" +SCAN_COMMAND="AT+QSCAN=3,1" +SCAN_TIMEOUT=200 +LOCK_ID="CELL_SCAN_$(date +%s)_$$" + +# Function to log messages +log_message() { + local level="${2:-info}" + logger -t at_queue -p "daemon.$level" "cell_scan: $1" +} + +# Function to output JSON response +output_json() { + local status="$1" + local message="$2" + log_message "Sending response: status=$status, message=$message" + printf '{"status":"%s","message":"%s"}\n' "$status" "$message" + exit 0 +} + +# Function to check if worker is running +check_worker_running() { + if [ -f "$PID_FILE" ]; then + pid=$(cat "$PID_FILE") + if kill -0 "$pid" 2>/dev/null; then + log_message "Worker process $pid is running" + return 0 + fi + log_message "Removing stale PID file for process $pid" + rm -f "$PID_FILE" + fi + return 1 +} + +# Enhanced JSON string escaping function +escape_json() { + printf '%s' "$1" | awk ' + BEGIN { RS="\n"; ORS="\\n" } + { + gsub(/\\/, "\\\\") + gsub(/"/, "\\\"") + gsub(/\r/, "") + gsub(/\t/, "\\t") + gsub(/\f/, "\\f") + gsub(/\b/, "\\b") + print + } + ' | sed 's/\\n$//' +} + +# Acquire token directly with high priority +acquire_token() { + local priority=1 # Highest priority for cell scan + local max_attempts=10 + local attempt=0 + + while [ $attempt -lt $max_attempts ]; do + # Check if token file exists + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + local current_priority=$(cat "$TOKEN_FILE" | jsonfilter -e '@.priority' 2>/dev/null) + local timestamp=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp' 2>/dev/null) + local current_time=$(date +%s) + + # Check for expired token (> 30 seconds old) + if [ $((current_time - timestamp)) -gt 30 ] || [ -z "$current_holder" ]; then + # Remove expired token + rm -f "$TOKEN_FILE" 2>/dev/null + elif [ $priority -lt $current_priority ]; then + # Preempt lower priority token + log_message "Preempting token from $current_holder (priority: $current_priority)" "info" + rm -f "$TOKEN_FILE" 2>/dev/null + else + # Try again - higher priority token exists + log_message "Token held by $current_holder with priority $current_priority, retrying..." "debug" + sleep 0.5 + attempt=$((attempt + 1)) + continue + fi + fi + + # Try to create token file + echo "{\"id\":\"$LOCK_ID\",\"priority\":$priority,\"timestamp\":$(date +%s)}" > "$TOKEN_FILE" 2>/dev/null + chmod 644 "$TOKEN_FILE" 2>/dev/null + + # Verify we got the token + local holder=$(cat "$TOKEN_FILE" 2>/dev/null | jsonfilter -e '@.id' 2>/dev/null) + if [ "$holder" = "$LOCK_ID" ]; then + log_message "Successfully acquired token with priority $priority" "info" + return 0 + fi + + sleep 0.5 + attempt=$((attempt + 1)) + done + + log_message "Failed to acquire token after $max_attempts attempts" "error" + return 1 +} + +# Main execution +{ + # If scan is running, return running status + if check_worker_running; then + output_json "running" "Cell scan is in progress" + fi + + # Start new scan + rm -f "$RESULT_FILE" + log_message "Starting new cell scan" "info" + + # Ensure worker script is executable + chmod +x "$WORKER_SCRIPT" 2>/dev/null + + # Start worker script with proper parameters + log_message "Attempting to start worker script: $WORKER_SCRIPT" "info" + + # Check if worker script exists + if [ ! -f "$WORKER_SCRIPT" ]; then + log_message "Worker script not found: $WORKER_SCRIPT" "error" + output_json "error" "Worker script not found" + fi + + # Ensure QUEUE_DIR exists + mkdir -p "$QUEUE_DIR" "$RESULTS_DIR" + chmod 755 "$QUEUE_DIR" + chmod 755 "$RESULTS_DIR" + + # Start worker with debug logging + WORKER_PID=$ + (sh "$WORKER_SCRIPT" >/tmp/cell_scan_worker.log 2>&1) & + WORKER_PID=$! + log_message "Worker script started with PID $WORKER_PID" "info" + + # The worker process runs in the background and completes quickly + # We don't need to check if it's still running as it might finish before we check + log_message "Worker process $WORKER_PID started in background" "info" + + # Instead of checking if the process is running, check if it created the result file + sleep 2 + if [ -f "$RESULT_FILE" ]; then + log_message "Worker successfully created result file" "info" + else + log_message "Waiting for worker to create result file..." "info" + # If no result file yet, check for errors + if [ -f "/tmp/cell_scan_worker.log" ]; then + WORKER_LOG=$(cat "/tmp/cell_scan_worker.log" | head -20) + log_message "Worker log: $WORKER_LOG" "info" + fi + fi + output_json "running" "Started new cell scan" +} || { + # Error handler + log_message "Script failed with error" "error" + output_json "error" "Internal error occurred" +} \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/cell_scan_worker.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/cell_scan_worker.sh new file mode 100644 index 0000000..56f803a --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/cell_scan_worker.sh @@ -0,0 +1,323 @@ +#!/bin/sh + +# Configuration +QUEUE_DIR="/tmp/at_queue" +RESULTS_DIR="$QUEUE_DIR/results" +TOKEN_FILE="$QUEUE_DIR/token" +RESULT_FILE="/tmp/qscan_result.json" +PID_FILE="/tmp/cell_scan.pid" +SCAN_COMMAND="AT+QSCAN=3,1" +SCAN_TIMEOUT=200 +LOCK_ID="CELL_SCAN_$(date +%s)_$$" + +# Enable shell debugging for better logging +set -x + +# Function to log messages +log_message() { + local level="${2:-info}" + logger -t at_queue -p "daemon.$level" "cell_scan_worker: $1" +} + +# Function to clean up stale temporary files +cleanup_stale_files() { + log_message "Cleaning up stale temporary files" "info" + + # Clean up old start_time files (older than 1 hour) + find "$QUEUE_DIR" -name "start_time.qscan_*" -type f -mmin +60 -delete 2>/dev/null + + # Clean up any start_time files that match our current process just in case + find "$QUEUE_DIR" -name "start_time.qscan_*_$" -type f -delete 2>/dev/null + + log_message "Stale file cleanup completed" "info" +} + +# Function to check directories and permissions +check_environment() { + log_message "Checking environment" "info" + + # Clean up stale files first + cleanup_stale_files + + # Check if directories exist, create if they don't + if [ ! -d "$QUEUE_DIR" ]; then + mkdir -p "$QUEUE_DIR" + log_message "Created queue directory: $QUEUE_DIR" "info" + fi + + if [ ! -d "$RESULTS_DIR" ]; then + mkdir -p "$RESULTS_DIR" + log_message "Created results directory: $RESULTS_DIR" "info" + fi + + # Check permissions + chmod 755 "$QUEUE_DIR" 2>/dev/null + chmod 755 "$RESULTS_DIR" 2>/dev/null + + # Check if sms_tool exists and is executable + if ! which sms_tool >/dev/null 2>&1; then + log_message "sms_tool not found in PATH" "error" + return 1 + fi + + # Test directory write permissions + if ! touch "$QUEUE_DIR/test_$$" 2>/dev/null; then + log_message "Cannot write to $QUEUE_DIR" "error" + return 1 + fi + rm -f "$QUEUE_DIR/test_$$" 2>/dev/null + + if ! touch "$RESULTS_DIR/test_$$" 2>/dev/null; then + log_message "Cannot write to $RESULTS_DIR" "error" + return 1 + fi + rm -f "$RESULTS_DIR/test_$$" 2>/dev/null + + log_message "Environment check passed" "info" + return 0 +} + +# Function to clean AT command output +clean_output() { + while IFS= read -r line; do + case "$line" in + "OK" | "" | *"ERROR"*) + continue + ;; + *) + printf '%s\n' "$line" + ;; + esac + done | sed 's/\r//g' | tr '\n' '\r' | sed 's/\r$//' | tr '\r' '\n' +} + +# Enhanced JSON string escaping function +escape_json() { + printf '%s' "$1" | awk ' + BEGIN { RS="\n"; ORS="\\n" } + { + gsub(/\\/, "\\\\") + gsub(/"/, "\\\"") + gsub(/\r/, "") + gsub(/\t/, "\\t") + gsub(/\f/, "\\f") + gsub(/\b/, "\\b") + print + } + ' | sed 's/\\n$//' +} + +# Function to check if scan is already running +check_running() { + if [ -f "$PID_FILE" ]; then + pid=$(cat "$PID_FILE") + if kill -0 "$pid" 2>/dev/null; then + log_message "Cell scan already running (PID: $pid)" "warn" + return 0 + fi + rm -f "$PID_FILE" + fi + return 1 +} + +# Acquire token directly with high priority +acquire_token() { + local priority=1 # Highest priority for cell scan + local max_attempts=10 + local attempt=0 + + while [ $attempt -lt $max_attempts ]; do + # Check if token file exists + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + local current_priority=$(cat "$TOKEN_FILE" | jsonfilter -e '@.priority' 2>/dev/null) + local timestamp=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp' 2>/dev/null) + local current_time=$(date +%s) + + # Check for expired token (> 30 seconds old) + if [ $((current_time - timestamp)) -gt 30 ] || [ -z "$current_holder" ]; then + # Remove expired token + rm -f "$TOKEN_FILE" 2>/dev/null + elif [ $priority -lt $current_priority ]; then + # Preempt lower priority token + log_message "Preempting token from $current_holder (priority: $current_priority)" "info" + rm -f "$TOKEN_FILE" 2>/dev/null + else + # Try again + sleep 0.5 + attempt=$((attempt + 1)) + continue + fi + fi + + # Try to create token file + echo "{\"id\":\"$LOCK_ID\",\"priority\":$priority,\"timestamp\":$(date +%s)}" > "$TOKEN_FILE" 2>/dev/null + chmod 644 "$TOKEN_FILE" 2>/dev/null + + # Verify we got the token + local holder=$(cat "$TOKEN_FILE" 2>/dev/null | jsonfilter -e '@.id' 2>/dev/null) + if [ "$holder" = "$LOCK_ID" ]; then + log_message "Successfully acquired token with priority $priority" "info" + return 0 + fi + + sleep 0.5 + attempt=$((attempt + 1)) + done + + log_message "Failed to acquire token after $max_attempts attempts" "error" + return 1 +} + +# Release token directly +release_token() { + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + if [ "$current_holder" = "$LOCK_ID" ]; then + rm -f "$TOKEN_FILE" 2>/dev/null + log_message "Released token" "info" + return 0 + fi + log_message "Token held by $current_holder, not by us ($LOCK_ID)" "warn" + fi + return 1 +} + +# Main execution +main() { + # Start logging + log_message "Worker script started" "info" + + # Check if already running + if check_running; then + log_message "Cell scan already running, exiting" "warn" + exit 1 + fi + + # Create PID file + echo "$$" > "$PID_FILE" + chmod 644 "$PID_FILE" 2>/dev/null + log_message "Created PID file: $$" "info" + + # Set up cleanup on exit + trap 'log_message "Cleaning up and exiting" "info"; release_token; rm -f "$PID_FILE"; exit' INT TERM EXIT + + # Acquire token for AT command execution + if ! acquire_token; then + log_message "Failed to acquire token, exiting" "error" + rm -f "$PID_FILE" + exit 1 + fi + + log_message "Token acquired, executing scan command: $SCAN_COMMAND" "info" + + # Execute scan with native timeout option (without relying on timeout command) + # Use the -t option of sms_tool instead of the timeout command + log_message "Executing command with timeout: $SCAN_TIMEOUT seconds" "info" + SCAN_OUTPUT=$(sms_tool at "$SCAN_COMMAND" -t $SCAN_TIMEOUT 2>&1 | clean_output) + SCAN_STATUS=$? + log_message "Command execution completed with status: $SCAN_STATUS" "info" + + # Process and store result + if [ $SCAN_STATUS -eq 0 ]; then + # Check if output contains valid scan data or error + if echo "$SCAN_OUTPUT" | grep -q "+QSCAN"; then + # Set timestamp + TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') + + # Valid scan data found - don't add the "Scan completed but no valid data" prefix + log_message "Scan completed with valid data" "info" + + # Create the result file with proper JSON formatting + printf '{"status":"success","timestamp":"%s","output":%s}\n' \ + "$TIMESTAMP" \ + "$(printf '%s' "$SCAN_OUTPUT" | sed 's/"/\\"/g' | jq -R -s '.')" > "$RESULT_FILE" + chmod 644 "$RESULT_FILE" 2>/dev/null + else + # No valid scan data, but command completed + log_message "Command completed but no valid scan data found: $SCAN_OUTPUT" "warn" + SCAN_OUTPUT="Scan completed but no valid data returned: $SCAN_OUTPUT" + + # Create a result file indicating partial success + printf '{"status":"partial","timestamp":"%s","output":%s}\n' \ + "$(date '+%Y-%m-%d %H:%M:%S')" \ + "$(printf '%s' "$SCAN_OUTPUT" | sed 's/"/\\"/g' | jq -R -s '.')" > "$RESULT_FILE" + chmod 644 "$RESULT_FILE" 2>/dev/null + fi + + # Generate a command ID for the AT queue results format - use actual PID instead of $ + local my_pid="$$" + local cmd_id="qscan_$(date +%s)_${my_pid}" + local end_time=$(date +%s) + local start_time=$end_time + local duration=0 + + # Store start time for future reference + echo "$start_time" > "$QUEUE_DIR/start_time.$cmd_id" + + log_message "Creating AT queue result with ID: $cmd_id" "info" + + # Create JSON response in the AT queue format + local response=$(cat << EOF +{ + "command": { + "id": "$cmd_id", + "text": "$SCAN_COMMAND", + "timestamp": "$(date -Iseconds)" + }, + "response": { + "status": "success", + "raw_output": "$(escape_json "$SCAN_OUTPUT")", + "completion_time": "$end_time", + "duration_ms": $duration + } +} +EOF +) + + # Save the response to the AT queue results directory + printf "%s" "$response" > "$RESULTS_DIR/$cmd_id.json" + chmod 644 "$RESULTS_DIR/$cmd_id.json" + + # Clean up temporary files + rm -f "$QUEUE_DIR/start_time.$cmd_id" + log_message "Cleaned up temporary files" "info" + + # Release the token + release_token + return 0 + else + log_message "Scan failed with status: $SCAN_STATUS" "error" + printf '{"status":"error","timestamp":"%s","message":"Scan failed"}\n' \ + "$(date '+%Y-%m-%d %H:%M:%S')" > "$RESULT_FILE" + chmod 644 "$RESULT_FILE" 2>/dev/null + + # Release the token + release_token + return 1 + fi +} + +# Execute main function with proper error handling +{ + log_message "Worker script started with PID $$" "info" + + # Check environment before proceeding + check_environment || { + log_message "Environment check failed, aborting" "error" + exit 1 + } + + # Execute main function + main || { + log_message "Main function failed with error $?" "error" + release_token + rm -f "$PID_FILE" + exit 1 + } +} 2>/tmp/cell_scan_worker_debug.log || { + log_message "Script failed with error" "error" + release_token + rm -f "$PID_FILE" + exit 1 +} \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/check_scan.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/check_scan.sh new file mode 100644 index 0000000..6a95b66 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/check_scan.sh @@ -0,0 +1,104 @@ +#!/bin/sh + +# Set content type to JSON +echo "Content-type: application/json" +echo "" + +# Configuration +QUEUE_DIR="/tmp/at_queue" +RESULTS_DIR="$QUEUE_DIR/results" +RESULT_FILE="/tmp/qscan_result.json" +PID_FILE="/tmp/cell_scan.pid" +TOKEN_FILE="$QUEUE_DIR/token" + +# Function to log messages +log_message() { + local level="${2:-info}" + logger -t at_queue -p "daemon.$level" "check_scan: $1" +} + +# Function to output JSON response +output_json() { + local status="$1" + local message="$2" + + if [ "$status" = "success" ] && [ -f "$RESULT_FILE" ]; then + # Return the contents of the result file + cat "$RESULT_FILE" + else + printf '{"status":"%s","message":"%s","timestamp":"","output":""}\n' "$status" "$message" + fi +} + +# Check for scan token holder +check_token_holder() { + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + if [ -n "$current_holder" ] && echo "$current_holder" | grep -q "CELL_SCAN"; then + log_message "Cell scan token is active: $current_holder" "debug" + return 0 + fi + fi + return 1 +} + +# Check if a scan is already in progress +check_scan_progress() { + # First check PID file + if [ -f "$PID_FILE" ]; then + pid=$(cat "$PID_FILE") + if kill -0 "$pid" 2>/dev/null; then + log_message "Scan in progress (PID: $pid)" "info" + output_json "running" "Scan in progress" + exit 0 + else + log_message "Removing stale PID file" "warn" + rm -f "$PID_FILE" + fi + fi + + # Also check token holder + if check_token_holder; then + log_message "Scan in progress (Token active)" "info" + output_json "running" "Scan in progress (Token active)" + exit 0 + fi +} + +# Check for existing results +check_results() { + if [ -f "$RESULT_FILE" ]; then + # Check if the result file contains valid JSON data + local result_content=$(cat "$RESULT_FILE" 2>/dev/null) + if [ -n "$result_content" ] && echo "$result_content" | grep -q "status"; then + # REMOVED AGE CHECK - Always return the file contents regardless of age + log_message "Found valid result file, returning contents" "info" + output_json "success" "Scan results available" + exit 0 + else + log_message "Result file exists but contains invalid data" "warn" + rm -f "$RESULT_FILE" # Remove invalid result file + output_json "idle" "Invalid previous scan results" + exit 0 + fi + fi +} + +# Main execution +{ + # First check if a scan is in progress + check_scan_progress + + # Then check for existing results + check_results + + # If no results and no running scan, indicate idle state + log_message "No active scan or recent results" "info" + output_json "idle" "No active scan" + exit 0 +} || { + # Error handler + log_message "Failed to check scan status" "error" + output_json "error" "Failed to check scan status" + exit 1 +} \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/fetch_mccmnc.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/fetch_mccmnc.sh new file mode 100644 index 0000000..60ccd53 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/fetch_mccmnc.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +# Set content type to JSON +echo "Content-type: application/json" +echo "" + +# Configuration +JSON_FILE="/www/cgi-bin/quecmanager/mcc-mnc-list.json" + +# Function to log messages +log_message() { + logger -t fetch_mccmnc "$1" +} + +# Function to output JSON response +output_json() { + local status="$1" + local message="$2" + printf '{"status":"%s","message":"%s"}\n' "$status" "$message" + exit 1 +} + +# Main execution +{ + # Check if file exists + if [ ! -f "$JSON_FILE" ]; then + log_message "MCC-MNC list file not found" + output_json "error" "MCC-MNC list file not found" + fi + + # Read and output the file + cat "$JSON_FILE" 2>/dev/null || { + log_message "Failed to read MCC-MNC list file" + output_json "error" "Failed to read MCC-MNC list file" + } +} || { + # Error handler + log_message "Script failed with error" + output_json "error" "Internal error occurred" +} \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/network_info.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/network_info.sh new file mode 100644 index 0000000..21e74b3 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/cell_scanner/network_info.sh @@ -0,0 +1,311 @@ +#!/bin/sh + +# Set content-type for JSON response +echo "Content-type: application/json" +echo "" + +# Define paths and constants to match queue system +QUEUE_DIR="/tmp/at_queue" +RESULTS_DIR="$QUEUE_DIR/results" +TOKEN_FILE="$QUEUE_DIR/token" +TEMP_FILE="/tmp/network_info_output.txt" +LOCK_ID="NETWORK_INFO_$(date +%s)_$$" +COMMAND_TIMEOUT=8 # Increased timeout +MAX_TOKEN_WAIT=10 +PRIORITY=5 # Medium-high priority (between cell scan and normal commands) + +# Function to log messages +log_message() { + local level="${2:-info}" + logger -t at_queue -p "daemon.$level" "network_info: $1" +} + +# Function to output JSON error +output_error() { + printf '{"status":"error","message":"%s","timestamp":"%s"}\n' "$1" "$(date '+%H:%M:%S')" + exit 1 +} + +# Enhanced JSON string escaping function +escape_json() { + printf '%s' "$1" | awk ' + BEGIN { RS="\n"; ORS="\\n" } + { + gsub(/\\/, "\\\\") + gsub(/"/, "\\\"") + gsub(/\r/, "") + gsub(/\t/, "\\t") + gsub(/\f/, "\\f") + gsub(/\b/, "\\b") + print + } + ' | sed 's/\\n$//' +} + +# Acquire token directly with medium-high priority +acquire_token() { + local priority="$PRIORITY" # Medium-high priority for network info + local max_attempts=$MAX_TOKEN_WAIT + local attempt=0 + + while [ $attempt -lt $max_attempts ]; do + # Check if token file exists + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + local current_priority=$(cat "$TOKEN_FILE" | jsonfilter -e '@.priority' 2>/dev/null) + local timestamp=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp' 2>/dev/null) + local current_time=$(date +%s) + + # Check for expired token (> 30 seconds old) + if [ $((current_time - timestamp)) -gt 30 ] || [ -z "$current_holder" ]; then + # Remove expired token + rm -f "$TOKEN_FILE" 2>/dev/null + elif [ $priority -lt $current_priority ]; then + # Preempt lower priority token + log_message "Preempting token from $current_holder (priority: $current_priority)" "info" + rm -f "$TOKEN_FILE" 2>/dev/null + else + # Try again - higher priority token exists + log_message "Token held by $current_holder with priority $current_priority, retrying..." "debug" + sleep 0.5 + attempt=$((attempt + 1)) + continue + fi + fi + + # Try to create token file + echo "{\"id\":\"$LOCK_ID\",\"priority\":$priority,\"timestamp\":$(date +%s)}" > "$TOKEN_FILE" 2>/dev/null + chmod 644 "$TOKEN_FILE" 2>/dev/null + + # Verify we got the token + local holder=$(cat "$TOKEN_FILE" 2>/dev/null | jsonfilter -e '@.id' 2>/dev/null) + if [ "$holder" = "$LOCK_ID" ]; then + log_message "Successfully acquired token with priority $priority" "info" + return 0 + fi + + sleep 0.5 + attempt=$((attempt + 1)) + done + + log_message "Failed to acquire token after $max_attempts attempts" "error" + return 1 +} + +# Release token directly +release_token() { + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + if [ "$current_holder" = "$LOCK_ID" ]; then + rm -f "$TOKEN_FILE" 2>/dev/null + log_message "Released token" "info" + return 0 + fi + log_message "Token held by $current_holder, not by us ($LOCK_ID)" "warn" + fi + return 1 +} + +# Function to execute AT command with direct output capture +execute_at_command() { + local CMD="$1" + local OUTPUT_FILE="$TEMP_FILE.cmd.$$" + + log_message "Executing command: $CMD" "debug" + + # Execute command and redirect output to file for reliable capture + sms_tool at "$CMD" -t $COMMAND_TIMEOUT > "$OUTPUT_FILE" 2>&1 + local EXIT_CODE=$? + + # Read the output regardless of exit code + if [ -f "$OUTPUT_FILE" ]; then + local OUTPUT=$(cat "$OUTPUT_FILE") + rm -f "$OUTPUT_FILE" + + if [ -n "$OUTPUT" ]; then + # We have some output + if echo "$OUTPUT" | grep -q "CME ERROR"; then + log_message "Command returned CME ERROR: $OUTPUT" "warn" + return 1 + elif echo "$OUTPUT" | grep -q "ERROR"; then + log_message "Command returned ERROR: $OUTPUT" "warn" + return 1 + else + # Command produced output that doesn't contain ERROR + log_message "Command executed successfully with output" "debug" + echo "$OUTPUT" + return 0 + fi + elif [ $EXIT_CODE -eq 0 ]; then + log_message "Command succeeded but returned empty output" "warn" + echo "Command returned empty output" + return 0 + else + log_message "Command failed with exit code $EXIT_CODE and no output" "error" + return 1 + fi + else + log_message "Failed to create output file" "error" + return 1 + fi +} + +# Function to check network mode from serving cell info +check_network_mode() { + local OUTPUT="$1" + + # Check for both LTE and NR5G-NSA (NSA mode) + if echo "$OUTPUT" | grep -q "\"LTE\"" && echo "$OUTPUT" | grep -q "\"NR5G-NSA\""; then + log_message "Detected network mode: NRLTE (NSA)" "info" + echo "NRLTE" + # Check for LTE only + elif echo "$OUTPUT" | grep -q "\"LTE\""; then + log_message "Detected network mode: LTE" "info" + echo "LTE" + # Check for NR5G-SA + elif echo "$OUTPUT" | grep -q "\"NR5G-SA\""; then + log_message "Detected network mode: NR5G (SA)" "info" + echo "NR5G" + else + log_message "Detected network mode: UNKNOWN from output: $OUTPUT" "warn" + echo "UNKNOWN" + fi +} + +# Function to check NR5G measurement info setting +check_nr5g_meas_info() { + local OUTPUT=$(execute_at_command "AT+QNWCFG=\"nr5g_meas_info\"") + local EXIT_CODE=$? + + if [ $EXIT_CODE -eq 0 ] && echo "$OUTPUT" | grep -q "\"nr5g_meas_info\",1"; then + log_message "NR5G measurement info is enabled" "debug" + return 0 + else + log_message "NR5G measurement info is disabled or check failed" "debug" + return 1 + fi +} + +# Function to create JSON output safely +format_output_json() { + local MODE="$1" + local SERVING_OUTPUT="$2" + local NEIGHBOR_OUTPUT="$3" + local MEAS_OUTPUT="$4" + + # Basic JSON structure - start + printf '{"status":"success","timestamp":"%s","mode":"%s"' "$(date '+%H:%M:%S')" "$MODE" + + # Add raw data section + printf ',"raw_data":{' + + # Add serving cell output (always present) + printf '"servingCell":%s' "$(printf '%s' "$SERVING_OUTPUT" | jq -R -s '.')" + + # Add neighbor cells output if available + if [ -n "$NEIGHBOR_OUTPUT" ]; then + printf ',"neighborCells":%s' "$(printf '%s' "$NEIGHBOR_OUTPUT" | jq -R -s '.')" + fi + + # Add measurement info output if available + if [ -n "$MEAS_OUTPUT" ]; then + printf ',"meas":%s' "$(printf '%s' "$MEAS_OUTPUT" | jq -R -s '.')" + fi + + # Close raw data section + printf '}' + + # Close the whole JSON object + printf '}\n' +} + +# Set up trap for cleanup +trap 'log_message "Script interrupted, cleaning up" "warn"; release_token; rm -f "$TEMP_FILE" "$TEMP_FILE.cmd."*; exit 1' INT TERM EXIT + +# Main execution +{ + # Ensure directories exist + mkdir -p "$QUEUE_DIR" "$RESULTS_DIR" + + log_message "Starting network info collection" "info" + + # Acquire token for AT command execution before any output + if ! acquire_token; then + output_error "Failed to acquire token for command processing" + fi + + # Get the serving cell information first + log_message "Getting serving cell information" "info" + SERVING_OUTPUT=$(execute_at_command "AT+QENG=\"servingcell\"") + EXIT_CODE=$? + + # Check if we got valid serving cell info + if [ $EXIT_CODE -ne 0 ] || [ -z "$SERVING_OUTPUT" ]; then + log_message "Failed to get serving cell information, output: $SERVING_OUTPUT" "error" + release_token + output_error "Failed to get serving cell information" + fi + + log_message "Successfully got serving cell information" "info" + + # Determine network mode from serving cell output + NETWORK_MODE=$(check_network_mode "$SERVING_OUTPUT") + + NEIGHBOR_OUTPUT="" + MEAS_OUTPUT="" + + case "$NETWORK_MODE" in + "NRLTE") + log_message "Processing NRLTE mode commands" "info" + NEIGHBOR_OUTPUT=$(execute_at_command "AT+QENG=\"neighbourcell\"") + + # Try to get measurement info + if ! check_nr5g_meas_info; then + log_message "Enabling NR5G measurement info" "info" + execute_at_command "AT+QNWCFG=\"nr5g_meas_info\",1" > /dev/null + sleep 1 # Give it time to take effect + fi + + log_message "Fetching NR5G measurement info" "info" + MEAS_OUTPUT=$(execute_at_command "AT+QNWCFG=\"nr5g_meas_info\"") + ;; + "LTE") + log_message "Processing LTE mode commands" "info" + NEIGHBOR_OUTPUT=$(execute_at_command "AT+QENG=\"neighbourcell\"") + ;; + "NR5G") + log_message "Processing NR5G mode commands" "info" + + # Try to get measurement info + if ! check_nr5g_meas_info; then + log_message "Enabling NR5G measurement info" "info" + execute_at_command "AT+QNWCFG=\"nr5g_meas_info\",1" > /dev/null + sleep 1 # Give it time to take effect + fi + + log_message "Fetching NR5G measurement info" "info" + MEAS_OUTPUT=$(execute_at_command "AT+QNWCFG=\"nr5g_meas_info\"") + ;; + *) + # Even if we don't recognize the mode, we'll still return the serving cell info + log_message "Unknown network mode, only returning serving cell info" "warn" + ;; + esac + + # Format and output JSON response + log_message "Formatting JSON response" "info" + format_output_json "$NETWORK_MODE" "$SERVING_OUTPUT" "$NEIGHBOR_OUTPUT" "$MEAS_OUTPUT" + + # Release token and clean up + release_token + rm -f "$TEMP_FILE" "$TEMP_FILE.cmd."* + + log_message "Network info collection completed" "info" + +} || { + # Error handler + log_message "Script failed with error" "error" + release_token + rm -f "$TEMP_FILE" "$TEMP_FILE.cmd."* + output_error "Internal error occurred" +} \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/keep_alive.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/keep_alive.sh new file mode 100644 index 0000000..e6af15b --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/keep_alive.sh @@ -0,0 +1,195 @@ +#!/bin/sh + +# Configuration +CONFIG_FILE="/etc/keep_alive_schedule.conf" +STATUS_FILE="/tmp/keep_alive_status" +SPEEDTEST_SCRIPT="/www/cgi-bin/home/speedtest/speedtest.sh" + +# Function to convert HH:MM to minutes since midnight +time_to_minutes() { + echo "$1" | awk -F: '{print $1 * 60 + $2}' +} + +# Function to validate time interval +validate_interval() { + START_TIME=$1 + END_TIME=$2 + INTERVAL_MINUTES=$3 + + # Convert times to minutes + START_MINUTES=$(time_to_minutes "$START_TIME") + END_MINUTES=$(time_to_minutes "$END_TIME") + + # Calculate duration between start and end time + if [ $END_MINUTES -lt $START_MINUTES ]; then + # Handle case where end time is on the next day + DURATION=$((1440 - START_MINUTES + END_MINUTES)) + else + DURATION=$((END_MINUTES - START_MINUTES)) + fi + + # Check if interval is longer than duration + if [ $INTERVAL_MINUTES -gt $DURATION ]; then + return 1 + fi + return 0 +} + +# Function to generate cron time expression +generate_cron_time() { + START_TIME=$1 + END_TIME=$2 + INTERVAL=$3 + + START_HOUR=$(echo "$START_TIME" | cut -d: -f1 | sed 's/^0//') + START_MIN=$(echo "$START_TIME" | cut -d: -f2) + END_HOUR=$(echo "$END_TIME" | cut -d: -f1 | sed 's/^0//') + END_MIN=$(echo "$END_TIME" | cut -d: -f2) + + # If end time is less than start time, it means we cross midnight + if [ $(time_to_minutes "$END_TIME") -lt $(time_to_minutes "$START_TIME") ]; then + # Create two cron entries for before and after midnight + echo "*/$INTERVAL $START_HOUR-23 * * * $SPEEDTEST_SCRIPT" + echo "*/$INTERVAL 0-$((END_HOUR - 1)) * * * $SPEEDTEST_SCRIPT" + else + echo "*/$INTERVAL $START_HOUR-$((END_HOUR - 1)) * * * $SPEEDTEST_SCRIPT" + fi +} + +# Function to urldecode +urldecode() { + echo -e "$(echo "$1" | sed 's/+/ /g;s/%\([0-9A-F][0-9A-F]\)/\\x\1/g')" +} + +# Function to save configuration +save_config() { + echo "START_TIME=$1" >"$CONFIG_FILE" + echo "END_TIME=$2" >>"$CONFIG_FILE" + echo "INTERVAL=$3" >>"$CONFIG_FILE" + echo "ENABLED=1" >>"$CONFIG_FILE" +} + +# Function to disable scheduling +disable_scheduling() { + if [ -f "$CONFIG_FILE" ]; then + sed -i 's/ENABLED=1/ENABLED=0/' "$CONFIG_FILE" + fi + # Remove any existing cron jobs + crontab -l | grep -v "$SPEEDTEST_SCRIPT" | crontab - +} + +# Function to get current status +get_status() { + if [ -f "$CONFIG_FILE" ]; then + ENABLED=$(grep "ENABLED=" "$CONFIG_FILE" | cut -d'=' -f2) + START_TIME=$(grep "START_TIME=" "$CONFIG_FILE" | cut -d'=' -f2) + END_TIME=$(grep "END_TIME=" "$CONFIG_FILE" | cut -d'=' -f2) + INTERVAL=$(grep "INTERVAL=" "$CONFIG_FILE" | cut -d'=' -f2) + + echo "Status: 200 OK" + echo "Content-Type: application/json" + echo "" + echo "{\"enabled\":$ENABLED,\"start_time\":\"$START_TIME\",\"end_time\":\"$END_TIME\",\"interval\":$INTERVAL}" + else + echo "Status: 200 OK" + echo "Content-Type: application/json" + echo "" + echo "{\"enabled\":0,\"start_time\":\"\",\"end_time\":\"\",\"interval\":0}" + fi +} + +# Handle POST requests +if [ "$REQUEST_METHOD" = "POST" ]; then + # Read POST data + read -r POST_DATA + + # Check if disabling is requested + echo "$POST_DATA" | grep -q "disable=true" + if [ $? -eq 0 ]; then + disable_scheduling + echo "Status: 200 OK" + echo "Content-Type: application/json" + echo "" + echo "{\"status\":\"success\",\"message\":\"Scheduling disabled\"}" + exit 0 + fi + + # Extract times and interval + START_TIME=$(echo "$POST_DATA" | grep -o 'start_time=[^&]*' | cut -d'=' -f2) + END_TIME=$(echo "$POST_DATA" | grep -o 'end_time=[^&]*' | cut -d'=' -f2) + INTERVAL=$(echo "$POST_DATA" | grep -o 'interval=[^&]*' | cut -d'=' -f2) + + # Decode times + START_TIME=$(urldecode "$START_TIME") + END_TIME=$(urldecode "$END_TIME") + INTERVAL=$(urldecode "$INTERVAL") + + # Validate times + if [ -z "$START_TIME" ] || [ -z "$END_TIME" ] || [ -z "$INTERVAL" ]; then + echo "Status: 400 Bad Request" + echo "Content-Type: application/json" + echo "" + echo "{\"error\":\"Missing start time, end time, or interval\"}" + exit 1 + fi + + # Validate interval is a number + if ! echo "$INTERVAL" | grep -q '^[0-9]\+$'; then + echo "Status: 400 Bad Request" + echo "Content-Type: application/json" + echo "" + echo "{\"error\":\"Interval must be a number in minutes\"}" + exit 1 + fi + + # Validate interval + if ! validate_interval "$START_TIME" "$END_TIME" "$INTERVAL"; then + echo "Status: 400 Bad Request" + echo "Content-Type: application/json" + echo "" + echo "{\"error\":\"Interval is longer than the time between start and end time\"}" + exit 1 + fi + + # Create temporary file for new crontab + TEMP_CRON=$(mktemp) + + # Get existing crontab entries (excluding our script) + crontab -l 2>/dev/null | grep -v "$SPEEDTEST_SCRIPT" >"$TEMP_CRON" + + # Generate and add cron entries + generate_cron_time "$START_TIME" "$END_TIME" "$INTERVAL" >>"$TEMP_CRON" + + # Install new crontab + crontab "$TEMP_CRON" + rm "$TEMP_CRON" + + # Save configuration + save_config "$START_TIME" "$END_TIME" "$INTERVAL" + + echo "Status: 200 OK" + echo "Content-Type: application/json" + echo "" + echo "{\"status\":\"success\",\"message\":\"Keep-alive scheduling enabled\"}" + exit 0 +fi + +# Parse query string for GET requests +if [ "$REQUEST_METHOD" = "GET" ]; then + QUERY_STRING=$(echo "$QUERY_STRING" | sed 's/&/\n/g') + for param in $QUERY_STRING; do + case "$param" in + status=*) + get_status + exit 0 + ;; + esac + done +fi + +# If no valid request is made +echo "Status: 400 Bad Request" +echo "Content-Type: application/json" +echo "" +echo "{\"error\":\"Invalid request\"}" +exit 1 \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/disable-quecwatch.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/disable-quecwatch.sh new file mode 100644 index 0000000..4180814 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/disable-quecwatch.sh @@ -0,0 +1,63 @@ +#!/bin/sh + +# Set headers for JSON response +echo "Content-type: application/json" +echo "" + +# Disable the service in UCI +uci set quecmanager.quecwatch.enabled='0' + +if ! uci commit quecmanager; then + echo '{"status":"error","message":"Failed to update configuration"}' + exit 1 +fi + +# Function to log cleanup events +log_message() { + local level="$1" + local message="$2" + local LOG_DIR="/tmp/log/quecwatch" + local LOG_FILE="${LOG_DIR}/quecwatch.log" + + # Ensure log directory exists + mkdir -p "${LOG_DIR}" + + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + echo "${timestamp} - [${level}] ${message}" >> "$LOG_FILE" + logger -t quecwatch "${level}: ${message}" +} + +# Stop the service +if [ -x "/etc/init.d/quecwatch" ]; then + if ! /etc/init.d/quecwatch stop; then + log_message "ERROR" "Failed to stop service cleanly" + + # Force kill any remaining processes + if pkill -f "/www/cgi-bin/services/quecwatch.sh"; then + log_message "INFO" "Forced termination of QuecWatch processes" + fi + else + log_message "INFO" "Service stopped successfully" + fi + + # Disable the service + if ! /etc/init.d/quecwatch disable; then + log_message "WARN" "Failed to disable service" + else + log_message "INFO" "Service disabled successfully" + fi +fi + +# Clean up temporary files +for file in "/tmp/quecwatch_status.json" "/tmp/quecwatch_retry_count" "/var/run/quecwatch.pid"; do + if [ -f "$file" ]; then + if rm -f "$file"; then + log_message "INFO" "Removed temporary file: $file" + else + log_message "WARN" "Failed to remove temporary file: $file" + fi + fi +done + +# Return success +echo '{"status":"success","message":"QuecWatch disabled successfully"}' \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/enable-quecwatch.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/enable-quecwatch.sh new file mode 100644 index 0000000..13a7a10 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/enable-quecwatch.sh @@ -0,0 +1,137 @@ +#!/bin/sh + +# Set content type to JSON +echo "Content-type: application/json" +echo "" + +# Read POST data +read -r POST_DATA + +# Function to extract value from JSON post data +extract_json_value() { + local key="$1" + local default="$2" + + # Try with jsonfilter + if command -v jsonfilter >/dev/null 2>&1; then + local value=$(echo "$POST_DATA" | jsonfilter -e "@.$key" 2>/dev/null) + [ -n "$value" ] && echo "$value" && return 0 + fi + + # Fallback to grep + local value=$(echo "$POST_DATA" | grep -o "\"$key\"[[:space:]]*:[[:space:]]*\"[^\"]*\"" | cut -d'"' -f4) + [ -n "$value" ] && echo "$value" && return 0 + + # Fallback to grep for numbers and booleans + local value=$(echo "$POST_DATA" | grep -o "\"$key\"[[:space:]]*:[[:space:]]*[0-9a-zA-Z]*" | cut -d':' -f2 | tr -d '[:space:]') + [ -n "$value" ] && echo "$value" && return 0 + + # Return default value + echo "$default" + return 0 +} + +# Extract parameters from POST data +ping_target=$(extract_json_value "pingTarget" "8.8.8.8") +ping_interval=$(extract_json_value "pingInterval" "60") +ping_failures=$(extract_json_value "pingFailures" "3") +max_retries=$(extract_json_value "maxRetries" "5") +connection_refresh=$(extract_json_value "connectionRefresh" "false") +auto_sim_failover=$(extract_json_value "autoSimFailover" "false") +sim_failover_schedule=$(extract_json_value "simFailoverSchedule" "0") + +# Validate numeric values +validate_number() { + local value="$1" + local min="$2" + local max="$3" + local name="$4" + + if ! echo "$value" | grep -q '^[0-9]\+$'; then + echo '{"status":"error","message":"'"$name must be a number"'"}' + exit 1 + fi + + if [ "$value" -lt "$min" ] || [ "$value" -gt "$max" ]; then + echo '{"status":"error","message":"'"$name must be between $min and $max"'"}' + exit 1 + fi +} + +# Validate boolean values +validate_boolean() { + local value="$1" + local name="$2" + + if [ "$value" != "true" ] && [ "$value" != "false" ]; then + echo '{"status":"error","message":"'"$name must be true or false"'"}' + exit 1 + fi +} + +# Validate parameters +validate_number "$ping_interval" 5 3600 "Ping interval" +validate_number "$ping_failures" 1 10 "Ping failures" +validate_number "$max_retries" 1 20 "Max retries" +validate_number "$sim_failover_schedule" 0 1440 "SIM failover schedule" +validate_boolean "$connection_refresh" "Connection refresh" +validate_boolean "$auto_sim_failover" "Auto SIM failover" + +# Function to setup UCI configuration +setup_uci_config() { + # Create section if it doesn't exist + touch /etc/config/quecmanager + + if ! uci -q get quecmanager.quecwatch >/dev/null; then + uci set quecmanager.quecwatch=service + fi + + # Set UCI values + uci set quecmanager.quecwatch.enabled='1' + uci set quecmanager.quecwatch.ping_target="$ping_target" + uci set quecmanager.quecwatch.ping_interval="$ping_interval" + uci set quecmanager.quecwatch.ping_failures="$ping_failures" + uci set quecmanager.quecwatch.max_retries="$max_retries" + uci set quecmanager.quecwatch.current_retries='0' + uci set quecmanager.quecwatch.connection_refresh="$connection_refresh" + uci set quecmanager.quecwatch.refresh_count='3' + uci set quecmanager.quecwatch.auto_sim_failover="$auto_sim_failover" + uci set quecmanager.quecwatch.sim_failover_schedule="$sim_failover_schedule" + + # Commit changes + if ! uci commit quecmanager; then + echo '{"status":"error","message":"Failed to save configuration"}' + exit 1 + fi + + return 0 +} + +# Setup configuration +if ! setup_uci_config; then + exit 1 +fi + +# Enable and start the service +if [ ! -f "/etc/init.d/quecwatch" ]; then + echo '{"status":"error","message":"QuecWatch service script not found"}' + exit 1 +fi + +# Make sure the service script is executable +chmod +x /etc/init.d/quecwatch + +# Enable the service +if ! /etc/init.d/quecwatch enable; then + echo '{"status":"error","message":"Failed to enable QuecWatch service"}' + exit 1 +fi + +# Start the service +if ! /etc/init.d/quecwatch start; then + echo '{"status":"error","message":"Failed to start QuecWatch service"}' + exit 1 +fi + +# Return success response +echo '{"status":"success","message":"QuecWatch enabled successfully"}' \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/fetch-quecwatch.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/fetch-quecwatch.sh new file mode 100644 index 0000000..fa3e828 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/experimental/quecwatch/fetch-quecwatch.sh @@ -0,0 +1,139 @@ +#!/bin/sh + +# Set headers for JSON response +echo "Content-type: application/json" +echo "" + +# Load UCI functions +. /lib/functions.sh + +# Function to safely get UCI value with default +get_uci_value() { + local value + config_get value quecwatch "$1" "$2" + echo "${value:-$2}" +} + +# Function to format boolean for JSON +format_boolean() { + if [ "$1" = "1" ] || [ "$1" = "true" ]; then + echo "true" + else + echo "false" + fi +} + +# Function to check if service is running +check_service_status() { + if [ -f "/var/run/quecwatch.pid" ]; then + pid=$(cat /var/run/quecwatch.pid 2>/dev/null) + if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then + echo "running" + return + fi + fi + echo "stopped" +} + +# Function to get last log entry +get_last_log() { + local LOG_FILE="/tmp/log/quecwatch/quecwatch.log" + if [ -f "$LOG_FILE" ]; then + tail -n 1 "$LOG_FILE" | sed 's/"/\\"/g' + else + echo "No log entries found" + fi +} + +# Function to get current status +get_current_status() { + local STATUS_FILE="/tmp/quecwatch_status.json" + local status="unknown" + local message="Status not available" + local retry="0" + local maxRetries="0" + local timestamp=$(date +%s) + + if [ -f "$STATUS_FILE" ]; then + # Try to extract values from status file + if grep -q "status" "$STATUS_FILE"; then + status=$(cat "$STATUS_FILE" | jsonfilter -e '@.status' 2>/dev/null) + message=$(cat "$STATUS_FILE" | jsonfilter -e '@.message' 2>/dev/null) + retry=$(cat "$STATUS_FILE" | jsonfilter -e '@.retry' 2>/dev/null) + maxRetries=$(cat "$STATUS_FILE" | jsonfilter -e '@.maxRetries' 2>/dev/null) + timestamp=$(cat "$STATUS_FILE" | jsonfilter -e '@.timestamp' 2>/dev/null) + fi + fi + + # Use defaults if extraction failed + [ -z "$status" ] && status="unknown" + [ -z "$message" ] && message="Status not available" + [ -z "$retry" ] && retry="0" + [ -z "$maxRetries" ] && maxRetries="0" + [ -z "$timestamp" ] && timestamp=$(date +%s) + + echo "{\"status\":\"$status\",\"message\":\"$message\",\"retry\":$retry,\"maxRetries\":$maxRetries,\"timestamp\":$timestamp}" +} + +# Load QuecManager configuration +config_load quecmanager + +# Check if QuecWatch section exists +if ! uci -q get quecmanager.quecwatch >/dev/null; then + echo '{"status":"inactive","message":"QuecWatch is not configured"}' + exit 0 +fi + +# Get enabled status +enabled=$(get_uci_value "enabled" "0") + +# Get service status +service_status=$(check_service_status) + +# Get current status +current_status=$(get_current_status) + +# Get last log entry +last_log=$(get_last_log) + +# Fetch all configuration values +ping_target=$(get_uci_value "ping_target" "8.8.8.8") +ping_interval=$(get_uci_value "ping_interval" "60") +ping_failures=$(get_uci_value "ping_failures" "3") +max_retries=$(get_uci_value "max_retries" "5") +current_retries=$(get_uci_value "current_retries" "0") +connection_refresh=$(format_boolean $(get_uci_value "connection_refresh" "false")) +refresh_count=$(get_uci_value "refresh_count" "3") +auto_sim_failover=$(format_boolean $(get_uci_value "auto_sim_failover" "false")) +sim_failover_schedule=$(get_uci_value "sim_failover_schedule" "0") + +# Determine the overall status +status="inactive" +if [ "$enabled" = "1" ]; then + if [ "$service_status" = "running" ]; then + status="active" + else + status="error" + fi +fi + +# Prepare JSON response +cat <> "$LOG_FILE" + logger -t quecwatch "${level}: ${message}" +} + +# Reset retry counter +if uci -q get quecmanager.quecwatch >/dev/null; then + # Reset retry counter in UCI + uci set quecmanager.quecwatch.current_retries='0' + + # Make sure service is enabled + uci set quecmanager.quecwatch.enabled='1' + + # Commit changes + if uci commit quecmanager; then + log_message "INFO" "Retry counter reset to 0 and service enabled" + + # Also update the retry count file for immediate effect + echo "0" > "/tmp/quecwatch_retry_count" + chmod 644 "/tmp/quecwatch_retry_count" + + # Restart the service if it exists + if [ -x "/etc/init.d/quecwatch" ]; then + if /etc/init.d/quecwatch restart; then + log_message "INFO" "Service restarted successfully" + echo '{"status":"success","message":"Retry counter reset and service restarted successfully"}' + else + log_message "ERROR" "Failed to restart service" + echo '{"status":"warning","message":"Retry counter reset but failed to restart service"}' + fi + else + log_message "ERROR" "Service init script not found" + echo '{"status":"warning","message":"Retry counter reset but service init script not found"}' + fi + else + log_message "ERROR" "Failed to update configuration" + echo '{"status":"error","message":"Failed to update configuration"}' + fi +else + echo '{"status":"error","message":"QuecWatch configuration not found"}' +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/heartbeat.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/heartbeat.sh new file mode 100644 index 0000000..3ee85ef --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/heartbeat.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +echo "Content-Type: application/json" +echo "Cache-Control: no-cache, no-store, must-revalidate" +echo "Pragma: no-cache" +echo "Expires: 0" +echo "" + +# Basic response indicating the server is up +echo '{"alive": true}' \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/check_net.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/check_net.sh new file mode 100644 index 0000000..3197a58 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/check_net.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +# Set the content type to JSON +echo "Content-Type: application/json" +echo "" + +# Ping 8.8.8.8 with 2 packets and capture the result +if ping -c 2 8.8.8.8 > /dev/null 2>&1; then + # Ping was successful + echo '{"connection": "ACTIVE"}' +else + # Ping failed + echo '{"connection": "INACTIVE"}' +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_data_usage.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_data_usage.sh new file mode 100644 index 0000000..18f92f8 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_data_usage.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +# Set content type to JSON +echo "Content-Type: application/json" +echo + +# Read the JSON file and get only the last entry using jq +jq 'last' /www/signal_graphs/data_usage.json \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_hw_details.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_hw_details.sh new file mode 100644 index 0000000..103cade --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_hw_details.sh @@ -0,0 +1,119 @@ +#!/bin/sh + +# Set common headers +echo "Content-Type: application/json" +echo "Access-Control-Allow-Origin: *" +echo "Cache-Control: no-cache, no-store, must-revalidate" +echo "" + +# Lock file path +LOCK_FILE="/tmp/hw_details.lock" +LOCK_TIMEOUT=10 # Maximum wait time in seconds + +# Function to acquire lock +acquire_lock() { + local start_time=$(date +%s) + while [ -e "$LOCK_FILE" ]; do + # Check if lock is stale (older than LOCK_TIMEOUT seconds) + if [ -f "$LOCK_FILE" ]; then + local lock_time=$(stat -c %Y "$LOCK_FILE" 2>/dev/null) + local current_time=$(date +%s) + if [ $((current_time - lock_time)) -gt $LOCK_TIMEOUT ]; then + rm -f "$LOCK_FILE" + break + fi + fi + + # Check if we've waited too long + if [ $(($(date +%s) - start_time)) -gt $LOCK_TIMEOUT ]; then + error_response "Timeout waiting for lock" + exit 1 + fi + + sleep 0.1 + done + + # Create lock file with current PID + echo $$ > "$LOCK_FILE" +} + +# Function to release lock +release_lock() { + rm -f "$LOCK_FILE" +} + +# Function to handle errors and return JSON +error_response() { + echo "{\"error\": \"$1\"}" + exit 1 +} + +# Function to cleanup on exit +cleanup() { + release_lock + exit $? +} + +# Set trap for cleanup +trap cleanup EXIT INT TERM + +# Function to get memory information +get_memory_info() { + free_output=$(free -b) + memory_info=$(echo "$free_output" | awk '/Mem:/ {print "{\"total\": " $2 ", \"used\": " $3 ", \"available\": " $7 "}"}') + echo "$memory_info" +} + +# Function to get ethernet information +get_ethernet_info() { + interface=${1:-eth0} + # Check if ethtool is installed + if ! which ethtool >/dev/null 2>&1; then + error_response "ethtool not found" + fi + + # Check if interface exists + if ! ip link show "$interface" >/dev/null 2>&1; then + error_response "Interface $interface not found" + fi + + # Run ethtool and capture output + ethtool_output=$(ethtool "$interface" 2>/dev/null) || error_response "Failed to get ethernet information" + + # Extract values using sed instead of grep -P + speed=$(echo "$ethtool_output" | sed -n 's/.*Speed: \([^[:space:]]*\).*/\1/p' || echo "Unknown") + link_status=$(echo "$ethtool_output" | sed -n 's/.*Link detected: \(yes\|no\).*/\1/p' || echo "unknown") + auto_negotiation=$(echo "$ethtool_output" | sed -n 's/.*Auto-negotiation: \(on\|off\).*/\1/p' || echo "unknown") + + # Output JSON + echo "{\"link_speed\":\"$speed\",\"link_status\":\"$link_status\",\"auto_negotiation\":\"$auto_negotiation\"}" +} + +# Main execution +# Acquire lock before proceeding +acquire_lock + +# Parse query string for type and interface +type=$(echo "$QUERY_STRING" | sed -n 's/.*type=\([^&]*\).*/\1/p') +interface=$(echo "$QUERY_STRING" | sed -n 's/.*interface=\([^&]*\).*/\1/p') + +# Default interface if not specified +[ -z "$interface" ] && interface="eth0" + +# Convert type to lowercase using tr +type=$(echo "$type" | tr '[:upper:]' '[:lower:]') + +# Check type parameter and call appropriate function +case "$type" in + "memory") + get_memory_info + ;; + "eth") + get_ethernet_info "$interface" + ;; + *) + error_response "Invalid type. Use 'memory' or 'eth'" + ;; +esac + +# Lock will be automatically released by the cleanup trap \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_signal_metrics.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_signal_metrics.sh new file mode 100644 index 0000000..17ac893 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/fetch_signal_metrics.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +# Ensure the script outputs proper CGI headers +echo "Content-Type: application/json" +echo "" + +# Directory where JSON files are stored (adjust as needed) +JSON_DIR="/www/signal_graphs/" + +# Function to safely read JSON file +read_json_file() { + local file="$1" + if [ -f "$file" ]; then + cat "$file" + else + echo "[]" # Return empty array if file doesn't exist + fi +} + +# Collect signal metrics from JSON files +RSRP=$(read_json_file "${JSON_DIR}/rsrp.json") +RSRQ=$(read_json_file "${JSON_DIR}/rsrq.json") +SINR=$(read_json_file "${JSON_DIR}/sinr.json") + +# Combine metrics into a single JSON object +printf '{ + "rsrp": %s, + "rsrq": %s, + "sinr": %s +}' "$RSRP" "$RSRQ" "$SINR" \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/ping_latency.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/ping_latency.sh new file mode 100644 index 0000000..0d07203 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/home/ping_latency.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +# Set the content type to JSON +echo "Content-Type: application/json" +echo "" + +# Ping 8.8.8.8 with 5 packets and capture the full output +ping_result=$(ping -c 5 8.8.8.8) + +# Check if ping was successful +if [ $? -eq 0 ]; then + # Extract the average latency using awk + avg_latency=$(echo "$ping_result" | awk '/avg/ {split($4, a, "/"); print int(a[2])}') + + # If average latency was extracted, return it + if [ ! -z "$avg_latency" ]; then + echo "{\"connection\": \"ACTIVE\", \"latency\": $avg_latency}" + else + echo '{"connection": "ACTIVE", "latency": 0}' + fi +else + # Ping failed + echo '{"connection": "INACTIVE", "latency": 0}' +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/mcc-mnc-list.json b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/mcc-mnc-list.json new file mode 100644 index 0000000..fa20e53 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/mcc-mnc-list.json @@ -0,0 +1,37130 @@ +[ + { + "type": "National", + "countryName": "Abkhazia", + "countryCode": "GE-AB", + "mcc": "289", + "mnc": "67", + "brand": "Aquafon", + "operator": "Aquafon JSC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800", + "notes": "MCC is not listed by ITU; LTE band 20" + }, + { + "type": "National", + "countryName": "Abkhazia", + "countryCode": "GE-AB", + "mcc": "289", + "mnc": "88", + "brand": "A-Mobile", + "operator": "A-Mobile LLSC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": "MCC is not listed by ITU" + }, + { + "type": "National", + "countryName": "Albania", + "countryCode": "AL", + "mcc": "276", + "mnc": "01", + "brand": "ONE", + "operator": "One Telecommunications", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600", + "notes": "Former Telekom Albania" + }, + { + "type": "National", + "countryName": "Albania", + "countryCode": "AL", + "mcc": "276", + "mnc": "02", + "brand": "Vodafone", + "operator": "Vodafone Albania", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Albania", + "countryCode": "AL", + "mcc": "276", + "mnc": "03", + "brand": "ALBtelecom", + "operator": "Albtelecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Eagle Mobile" + }, + { + "type": "National", + "countryName": "Albania", + "countryCode": "AL", + "mcc": "276", + "mnc": "04", + "brand": "Plus Communication", + "operator": "Plus Communication", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Shut down Jan 2018; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Andorra", + "countryCode": "AD", + "mcc": "213", + "mnc": "03", + "brand": "Som, Mobiland", + "operator": "Andorra Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G", + "notes": "LTE band 20; former Servei de Telecommunicacions d'Andorra" + }, + { + "type": "National", + "countryName": "Armenia", + "countryCode": "AM", + "mcc": "283", + "mnc": "01", + "brand": "Beeline", + "operator": "Veon Armenia CJSC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 450 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Armenia", + "countryCode": "AM", + "mcc": "283", + "mnc": "04", + "brand": "Karabakh Telecom", + "operator": "Karabakh Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS 900", + "notes": null + }, + { + "type": "National", + "countryName": "Armenia", + "countryCode": "AM", + "mcc": "283", + "mnc": "05", + "brand": "VivaCell-MTS", + "operator": "K Telecom CJSC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Armenia", + "countryCode": "AM", + "mcc": "283", + "mnc": "10", + "brand": "Ucom", + "operator": "Ucom LLC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Former Orange" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "01", + "brand": "A1.net", + "operator": "A1 Telekom Austria", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500", + "notes": "former A1 / Mobilkom / PTA" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "02", + "brand": null, + "operator": "A1 Telekom Austria", + "status": "Reserved", + "bands": null, + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "03", + "brand": "Magenta", + "operator": "T-Mobile Austria GmbH", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 2100 / 5G 3500", + "notes": "former Max.Mobil, T-Mobile; national roaming agreement with 232-10: uses Hutchison Drei UMTS where no own coverage" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "04", + "brand": "Magenta", + "operator": "T-Mobile Austria GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": "former T-Mobile" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "05", + "brand": "3", + "operator": "Hutchison Drei Austria", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "owned by Hutchison Drei Austria / former Orange Austria / One / Connect; GSM 900 / LTE 900 rarely used" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "06", + "brand": "Orange AT", + "operator": "Orange Austria GmbH", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "07", + "brand": "Hofer Telekom", + "operator": "T-Mobile Austria", + "status": "Operational", + "bands": "MVNO", + "notes": "former tele.ring" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "08", + "brand": "Lycamobile", + "operator": "Lycamobile Austria", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "09", + "brand": "Tele2Mobil", + "operator": "A1 Telekom Austria", + "status": "Operational", + "bands": "MVNO", + "notes": "division bought from Tele2 by A1 Telekom Austria; customers \"moved\" to bob (232-11)" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "10", + "brand": "3", + "operator": "Hutchison Drei Austria", + "status": "Operational", + "bands": "UMTS 2100 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500", + "notes": "national roaming agreement with 232-03: uses T-Mobile GSM where no own coverage" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "11", + "brand": "bob", + "operator": "A1 Telekom Austria", + "status": "Operational", + "bands": "MVNO", + "notes": "brand of A1 Telekom Austria" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "12", + "brand": "yesss!", + "operator": "A1 Telekom Austria", + "status": "Operational", + "bands": "MVNO", + "notes": "owned by A1 Telekom Austria / one-way national roaming agreement with 232-05" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "13", + "brand": "Magenta", + "operator": "T-Mobile Austria GmbH", + "status": "Operational", + "bands": "MVNO", + "notes": "Former UPC Austria" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "14", + "brand": null, + "operator": "Hutchison Drei Austria", + "status": "Reserved", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "15", + "brand": "Vectone Mobile", + "operator": "Mundio Mobile Austria", + "status": "Operational", + "bands": "MVNO", + "notes": "former Barablu Mobile Austria, uses A1" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "16", + "brand": null, + "operator": "Hutchison Drei Austria", + "status": "Reserved", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "17", + "brand": "spusu", + "operator": "MASS Response Service GmbH", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "18", + "brand": null, + "operator": "smartspace GmbH", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "19", + "brand": null, + "operator": "Hutchison Drei Austria", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Tele2 Telecommunication GmbH" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "20", + "brand": "m:tel", + "operator": "MTEL Austrija GmbH", + "status": "Operational", + "bands": "MVNO", + "notes": "By Serbian Telecom" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "21", + "brand": null, + "operator": "Salzburg AG für Energie, Verkehr und Telekommunikation", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "22", + "brand": null, + "operator": "Plintron Austria Limited", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "23", + "brand": "Magenta", + "operator": "T-Mobile Austria GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "24", + "brand": null, + "operator": "Smartel Services GmbH", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "25", + "brand": null, + "operator": "Holding Graz Kommunale Dienstleistungen GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "26", + "brand": null, + "operator": "LIWEST Kabelmedien GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "27", + "brand": null, + "operator": "TISMI B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "91", + "brand": "GSM-R A", + "operator": "ÖBB", + "status": "Operational", + "bands": "GSM-R", + "notes": "railways communication" + }, + { + "type": "National", + "countryName": "Austria", + "countryCode": "AT", + "mcc": "232", + "mnc": "92", + "brand": "ArgoNET", + "operator": "ArgoNET GmbH", + "status": "Operational", + "bands": "CDMA450 / LTE450", + "notes": "machine to machine communication for critical infrastructure" + }, + { + "type": "National", + "countryName": "Belarus", + "countryCode": "BY", + "mcc": "257", + "mnc": "01", + "brand": "A1", + "operator": "A1 Belarus", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100", + "notes": "Former velcom; LTE via beCloud" + }, + { + "type": "National", + "countryName": "Belarus", + "countryCode": "BY", + "mcc": "257", + "mnc": "02", + "brand": "MTS", + "operator": "Mobile TeleSystems", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100", + "notes": "LTE via beCloud" + }, + { + "type": "National", + "countryName": "Belarus", + "countryCode": "BY", + "mcc": "257", + "mnc": "03", + "brand": "DIALLOG", + "operator": "BelCel", + "status": "Not operational", + "bands": "CDMA 450", + "notes": "Closed on 21 January 2014" + }, + { + "type": "National", + "countryName": "Belarus", + "countryCode": "BY", + "mcc": "257", + "mnc": "04", + "brand": "life:)", + "operator": "Belarusian Telecommunications Network", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Former BeST; LTE via beCloud" + }, + { + "type": "National", + "countryName": "Belarus", + "countryCode": "BY", + "mcc": "257", + "mnc": "05", + "brand": "byfly", + "operator": "Beltelecom", + "status": "Not operational", + "bands": "WiMAX 3500", + "notes": "Closed on 1 May 2017" + }, + { + "type": "National", + "countryName": "Belarus", + "countryCode": "BY", + "mcc": "257", + "mnc": "06", + "brand": "beCloud", + "operator": "Belorussian Cloud Technologies", + "status": "Operational", + "bands": "LTE 800 / LTE 1800 / LTE 2600", + "notes": "Former Yota Bel; wholesale network used by MTS, life:), and A1" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "00", + "brand": "Proximus", + "operator": "Proximus SA", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Belgacom Mobile" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "01", + "brand": "Proximus", + "operator": "Proximus SA", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "Former Belgacom Mobile" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "02", + "brand": null, + "operator": "Infrabel", + "status": "Operational", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "03", + "brand": "Citymesh Connect", + "operator": "Citymesh NV", + "status": "Operational", + "bands": "LTE 2600 / LTE 3500", + "notes": "MVNO and private network" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "04", + "brand": "MWingz", + "operator": "Proximus SA", + "status": "Planned", + "bands": "Unknown", + "notes": "Shared Proximus / Orange Belgium" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "05", + "brand": "Telenet", + "operator": "Telenet", + "status": "Operational", + "bands": "MVNO", + "notes": "Using Base's Network" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "06", + "brand": "Lycamobile", + "operator": "Lycamobile sprl", + "status": "Operational", + "bands": "MVNO", + "notes": "Using Telenet" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "07", + "brand": "Vectone Mobile", + "operator": "Mundio Mobile Belgium nv", + "status": "Reserved", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "08", + "brand": "VOO", + "operator": "Nethys", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "09", + "brand": null, + "operator": "Proximus SA", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Voxbone" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "10", + "brand": "Orange Belgium", + "operator": "Orange S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "Former Mobistar" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "11", + "brand": "L-mobi", + "operator": "L-Mobi Mobile", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "15", + "brand": null, + "operator": "Elephant Talk Communications Schweiz GmbH", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "16", + "brand": null, + "operator": "NextGen Mobile Ltd.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "20", + "brand": "Base", + "operator": "Telenet", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "22", + "brand": "Febo.mobi", + "operator": "FEBO Telecom", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "23", + "brand": null, + "operator": "Dust Mobile", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "25", + "brand": null, + "operator": "Dense Air Belgium SPRL", + "status": "Unknown", + "bands": "TD-LTE 2600", + "notes": "Former Voyacom" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "28", + "brand": null, + "operator": "BICS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "29", + "brand": null, + "operator": "TISMI", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "30", + "brand": "Mobile Vikings", + "operator": "Unleashed NV", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Proximus network" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "33", + "brand": null, + "operator": "Ericsson NV", + "status": "Not operational", + "bands": "Unknown", + "notes": "Test network" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "34", + "brand": null, + "operator": "ONOFFAPP OÜ", + "status": "Unknown", + "bands": "MVNO", + "notes": "Former Dense Air Belgium SPRL" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "40", + "brand": "JOIN", + "operator": "JOIN Experience (Belgium)", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "48", + "brand": null, + "operator": "Network Research Belgium", + "status": "Unknown", + "bands": "5G 3500", + "notes": "Test network" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "50", + "brand": null, + "operator": "IP Nexia", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "71", + "brand": null, + "operator": "test", + "status": "Not operational", + "bands": "Unknown", + "notes": "Test network; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "72", + "brand": null, + "operator": "test", + "status": "Not operational", + "bands": "Unknown", + "notes": "Test network; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "73", + "brand": null, + "operator": "test", + "status": "Not operational", + "bands": "Unknown", + "notes": "Test network; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "74", + "brand": null, + "operator": "test", + "status": "Not operational", + "bands": "Unknown", + "notes": "Test network; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "206", + "mnc": "99", + "brand": null, + "operator": "e-BO Enterprises", + "status": "Not operational", + "bands": "LTE?", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "270", + "mnc": "77", + "brand": null, + "operator": "Proximus Luxembourg S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Uses Luxembourg MCC" + }, + { + "type": "National", + "countryName": "Belgium", + "countryCode": "BE", + "mcc": "270", + "mnc": "99", + "brand": null, + "operator": "Orange Communications Luxembourg S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Uses Luxembourg MCC" + }, + { + "type": "National", + "countryName": "Bosnia and Herzegovina", + "countryCode": "BA", + "mcc": "218", + "mnc": "03", + "brand": "HT-ERONET", + "operator": "Public Enterprise Croatian Telecom Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Bosnia and Herzegovina", + "countryCode": "BA", + "mcc": "218", + "mnc": "05", + "brand": "m:tel", + "operator": "RS Telecommunications JSC Banja Luka", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE", + "notes": "GSM-MS1, Mobilna Srpske, Mobi's" + }, + { + "type": "National", + "countryName": "Bosnia and Herzegovina", + "countryCode": "BA", + "mcc": "218", + "mnc": "90", + "brand": "BH Mobile", + "operator": "BH Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE", + "notes": "GSMBiH" + }, + { + "type": "National", + "countryName": "Bulgaria", + "countryCode": "BG", + "mcc": "284", + "mnc": "01", + "brand": "A1 BG", + "operator": "A1 Bulgaria", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / 5G 3500", + "notes": "Former Citron, Mobiltel, M-Tel" + }, + { + "type": "National", + "countryName": "Bulgaria", + "countryCode": "BG", + "mcc": "284", + "mnc": "03", + "brand": "Vivacom", + "operator": "BTC", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / 5G 1800 / 5G 2100", + "notes": "Former Vivatel" + }, + { + "type": "National", + "countryName": "Bulgaria", + "countryCode": "BG", + "mcc": "284", + "mnc": "05", + "brand": "Yettel", + "operator": "Yettel Bulgaria", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / 5G 3500", + "notes": "Former Globul, Telenor" + }, + { + "type": "National", + "countryName": "Bulgaria", + "countryCode": "BG", + "mcc": "284", + "mnc": "07", + "brand": "НКЖИ", + "operator": "НАЦИОНАЛНА КОМПАНИЯ ЖЕЛЕЗОПЪТНА ИНФРАСТРУКТУРА", + "status": "Operational", + "bands": "GSM-R", + "notes": "(The Bulgarian) National Railway Infrastructure Company" + }, + { + "type": "National", + "countryName": "Bulgaria", + "countryCode": "BG", + "mcc": "284", + "mnc": "09", + "brand": null, + "operator": "COMPATEL LIMITED", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Bulgaria", + "countryCode": "BG", + "mcc": "284", + "mnc": "11", + "brand": null, + "operator": "Bulsatcom", + "status": "Operational", + "bands": "LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Bulgaria", + "countryCode": "BG", + "mcc": "284", + "mnc": "13", + "brand": "Ти.ком", + "operator": "Ti.com JSC", + "status": "Operational", + "bands": "LTE 1800", + "notes": "Former Max Telecom" + }, + { + "type": "National", + "countryName": "Croatia", + "countryCode": "HR", + "mcc": "219", + "mnc": "01", + "brand": "HT HR", + "operator": "T-Hrvatski Telekom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 2100 / 5G 3500 / 5G 26000", + "notes": "Former CRONET,\nHTmobile" + }, + { + "type": "National", + "countryName": "Croatia", + "countryCode": "HR", + "mcc": "219", + "mnc": "02", + "brand": null, + "operator": "Telemach", + "status": "Operational", + "bands": "GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "Former Tele2" + }, + { + "type": "National", + "countryName": "Croatia", + "countryCode": "HR", + "mcc": "219", + "mnc": "03", + "brand": null, + "operator": "ALTAVOX d.o.o.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Croatia", + "countryCode": "HR", + "mcc": "219", + "mnc": "04", + "brand": null, + "operator": "NTH Mobile d.o.o.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Croatia", + "countryCode": "HR", + "mcc": "219", + "mnc": "10", + "brand": "A1 HR", + "operator": "A1 Hrvatska", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 700 / 5G 3500", + "notes": "Former Vipnet" + }, + { + "type": "National", + "countryName": "Croatia", + "countryCode": "HR", + "mcc": "219", + "mnc": "12", + "brand": null, + "operator": "TELE FOCUS d.o.o.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Croatia", + "countryCode": "HR", + "mcc": "219", + "mnc": "20", + "brand": "T-Mobile HR", + "operator": "T-Hrvatski Telekom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Croatia", + "countryCode": "HR", + "mcc": "219", + "mnc": "22", + "brand": "Mobile One", + "operator": "Mobile One Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Croatia", + "countryCode": "HR", + "mcc": "219", + "mnc": "30", + "brand": null, + "operator": "INNOVACOM OÜ", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Cyprus", + "countryCode": "CY", + "mcc": "280", + "mnc": "01", + "brand": "Cytamobile-Vodafone", + "operator": "Cyprus Telecommunications Authority", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 700 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Cyprus", + "countryCode": "CY", + "mcc": "280", + "mnc": "02", + "brand": "Cytamobile-Vodafone", + "operator": "Cyprus Telecommunications Authority", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Cyprus", + "countryCode": "CY", + "mcc": "280", + "mnc": "10", + "brand": "Epic", + "operator": "Monaco Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Former MTN" + }, + { + "type": "National", + "countryName": "Cyprus", + "countryCode": "CY", + "mcc": "280", + "mnc": "20", + "brand": "PrimeTel", + "operator": "PrimeTel PLC", + "status": "Operational", + "bands": "UMTS 2100 / LTE 900 / LTE 1800", + "notes": "Originally MVNO, MNO since 2015. Uses Epic for 2G/3G roaming." + }, + { + "type": "National", + "countryName": "Cyprus", + "countryCode": "CY", + "mcc": "280", + "mnc": "22", + "brand": "lemontel", + "operator": "Lemontel Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Cyprus", + "countryCode": "CY", + "mcc": "280", + "mnc": "23", + "brand": "Vectone Mobile", + "operator": "Mundio Mobile Cyprus Ltd.", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "01", + "brand": "T-Mobile", + "operator": "T-Mobile Czech Republic", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2100", + "notes": "Former Paegas; UMTS shut down Nov 2021" + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "02", + "brand": "O2", + "operator": "O2 Czech Republic", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2600 / TD-LTE 2600 / 5G 3500", + "notes": "Former Eurotel; CDMA 450 shut down June 2019; UMTS shut down Nov 2021" + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "03", + "brand": "Vodafone", + "operator": "Vodafone Czech Republic", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 1800 / 5G 2100", + "notes": "Former Oskar; UMTS shut down Mar 2021" + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "04", + "brand": null, + "operator": "Nordic Telecom Regional s.r.o.", + "status": "Operational", + "bands": "MVNO / LTE 410", + "notes": "Former U:fon, Air Telecom; CDMA 410 MHz shut down Dec 2017; LTE 410 for public safety services" + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "05", + "brand": null, + "operator": "PODA a.s.", + "status": "Operational", + "bands": "TD-LTE 3700", + "notes": "Former TRAVEL TELEKOMMUNIKATION; fixed wireless" + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "06", + "brand": null, + "operator": "Nordic Telecom 5G a.s.", + "status": "Operational", + "bands": "TD-LTE 3700", + "notes": "Former OSNO TELECOMUNICATION" + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "07", + "brand": "T-Mobile", + "operator": "T-Mobile Czech Republic", + "status": "Operational", + "bands": "LTE 800", + "notes": "Former ASTELNET" + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "08", + "brand": null, + "operator": "Compatel s.r.o.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "09", + "brand": "Unimobile", + "operator": "Uniphone, s.r.o.", + "status": "Unknown", + "bands": "MVNO", + "notes": "Former Vectone/Mundio" + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "11", + "brand": null, + "operator": "incrate s.r.o.", + "status": "Unknown", + "bands": "5G 700 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "98", + "brand": null, + "operator": "Správa železniční dopravní cesty, s.o.", + "status": "Operational", + "bands": "GSM-R 900", + "notes": "railways communication" + }, + { + "type": "National", + "countryName": "Czech Republic", + "countryCode": "CZ", + "mcc": "230", + "mnc": "99", + "brand": "Vodafone", + "operator": "Vodafone Czech Republic", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "R&D Centre at FEE, CTU (educational, experimental); licence expired Jul 2012" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "01", + "brand": "TDC", + "operator": "TDC A/S", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "02", + "brand": "Telenor", + "operator": "Telenor Denmark", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "Former Sonofon; UMTS 2100 shutdown 2021, UMTS 900 to shut down 2022" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "03", + "brand": null, + "operator": "Syniverse Technologies", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former End2End / MIGway A/S / MACH Connectivity" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "04", + "brand": null, + "operator": "Nexcon.io ApS", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former NextGen Mobile Ltd T/A CardBoardFish" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "05", + "brand": "TetraNet", + "operator": "Dansk Beredskabskommunikation A/S", + "status": "Operational", + "bands": "TETRA", + "notes": "Former ApS KBUS 38 nr. 4418; owned by Motorola Solutions" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "06", + "brand": "3", + "operator": "Hi3G Denmark ApS", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 700 / 5G 2100 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "07", + "brand": "Vectone Mobile", + "operator": "Mundio Mobile (Denmark) Limited", + "status": "Not operational", + "bands": "MVNO", + "notes": "Former Barablu; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "08", + "brand": "Voxbone", + "operator": "Voxbone mobile", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Nordisk Mobiltelefon" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "09", + "brand": "SINE", + "operator": "Dansk Beredskabskommunikation A/S", + "status": "Operational", + "bands": "TETRA", + "notes": "Owned by Motorola Solutions" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "10", + "brand": "TDC", + "operator": "TDC A/S", + "status": "Operational", + "bands": "Unknown", + "notes": "Test network" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "11", + "brand": "SINE", + "operator": "Dansk Beredskabskommunikation A/S", + "status": "Operational", + "bands": "TETRA", + "notes": "Test network" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "12", + "brand": "Lycamobile", + "operator": "Lycamobile Denmark Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "13", + "brand": null, + "operator": "Compatel Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "14", + "brand": null, + "operator": "Monty UK Global Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "15", + "brand": "Net 1", + "operator": "Cibicom", + "status": "Operational", + "bands": "LTE 450", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "16", + "brand": null, + "operator": "Tismi B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "17", + "brand": null, + "operator": "Gotanet AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Naka AG" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "18", + "brand": null, + "operator": "Cubic Telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "20", + "brand": "Telia", + "operator": "Telia", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "23", + "brand": "GSM-R DK", + "operator": "Banedanmark", + "status": "Operational", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "25", + "brand": "Viahub", + "operator": "SMS Provider Corp.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "28", + "brand": null, + "operator": "LINK Mobile A/S", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former CoolTEL ApS" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "30", + "brand": null, + "operator": "Interactive digital media GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Telia" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "40", + "brand": null, + "operator": "Ericsson Danmark A/S", + "status": "Not operational", + "bands": "Unknown", + "notes": "Test network; former Sense Communications Denmark A/S; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "42", + "brand": "Wavely", + "operator": "Greenwave Mobile IoT ApS", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Brandtel ApS, Tel42 ApS" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "43", + "brand": null, + "operator": "MobiWeb Limited", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "66", + "brand": null, + "operator": "TT-Netværket P/S", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 1800 / 5G 1800 / 5G 3500", + "notes": "Former Telia, now shared network Telia/Telenor" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "73", + "brand": "Onomondo", + "operator": "Onomondo ApS", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "77", + "brand": "Telenor", + "operator": "Telenor Denmark", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Former Tele2; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "88", + "brand": null, + "operator": "Cobira ApS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Denmark (Kingdom of Denmark)", + "countryCode": "DK", + "mcc": "238", + "mnc": "96", + "brand": "Telia", + "operator": "Telia Danmark", + "status": "Unknown", + "bands": "Unknown", + "notes": "Test network" + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "01", + "brand": "Telia", + "operator": "Telia Eesti", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G", + "notes": "Former EMT" + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "02", + "brand": "Elisa", + "operator": "Elisa Eesti", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 700 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "03", + "brand": "Tele2", + "operator": "Tele2 Eesti", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "04", + "brand": "Top Connect", + "operator": "OY Top Connect", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "05", + "brand": "CSC Telecom", + "operator": "CSC Telecom Estonia OÜ", + "status": "Operational", + "bands": "MVNO", + "notes": "Former AS Bravocom Mobiil" + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "06", + "brand": null, + "operator": "Progroup Holding", + "status": "Not operational", + "bands": "UMTS 2100", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "07", + "brand": "Kou", + "operator": "Televõrgu AS", + "status": "Not operational", + "bands": "CDMA2000 450", + "notes": "Acquired by Tele 2 in 2012; shut down in January 2016" + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "08", + "brand": "VIVEX", + "operator": "VIVEX OU", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "09", + "brand": null, + "operator": "Bravo Telecom", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "10", + "brand": null, + "operator": "Telcotrade OÜ", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "11", + "brand": null, + "operator": "UAB Raystorm Eesti filiaal", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "12", + "brand": null, + "operator": "Ntel Solutions OÜ", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "13", + "brand": null, + "operator": "Telia Eesti AS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "14", + "brand": null, + "operator": "Estonian Crafts OÜ", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "15", + "brand": null, + "operator": "Premium Net International S.R.L. Eesti filiaal", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "16", + "brand": "dzinga", + "operator": "SmartTel Plus OÜ", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "17", + "brand": null, + "operator": "Baltergo OÜ", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "18", + "brand": null, + "operator": "Cloud Communications OÜ", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "19", + "brand": null, + "operator": "OkTelecom OÜ", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "20", + "brand": null, + "operator": "DOTT Telecom OÜ", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "21", + "brand": null, + "operator": "Tismi B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "22", + "brand": null, + "operator": "M2MConnect OÜ", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "24", + "brand": null, + "operator": "Novametro OÜ", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "25", + "brand": null, + "operator": "Eurofed OÜ", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "26", + "brand": null, + "operator": "IT-Decision Telecom OÜ", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "28", + "brand": null, + "operator": "Nord Connect OÜ", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "29", + "brand": null, + "operator": "SkyTel OÜ", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Estonia", + "countryCode": "EE", + "mcc": "248", + "mnc": "71", + "brand": null, + "operator": "Siseministeerium (Ministry of Interior)", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Faroe Islands (Kingdom of Denmark)", + "countryCode": "FO", + "mcc": "288", + "mnc": "01", + "brand": "Føroya Tele", + "operator": "Føroya Tele", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Faroe Islands (Kingdom of Denmark)", + "countryCode": "FO", + "mcc": "288", + "mnc": "02", + "brand": "Nema", + "operator": "Nema", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": "Former Kall, Vodafone, Hey; also uses MCC 274 MNC 02 (Iceland)" + }, + { + "type": "National", + "countryName": "Faroe Islands (Kingdom of Denmark)", + "countryCode": "FO", + "mcc": "288", + "mnc": "03", + "brand": "TOSA", + "operator": "Tosa Sp/F", + "status": "Not operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": "Former Edge Mobile; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "03", + "brand": "DNA", + "operator": "DNA Oy", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Former Telia" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "04", + "brand": "DNA", + "operator": "DNA Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Aina Oyj" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "05", + "brand": "Elisa", + "operator": "Elisa Oyj", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 3500", + "notes": "Former Radiolinja" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "06", + "brand": "Elisa", + "operator": "Elisa Oyj", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "07", + "brand": "Nokia", + "operator": "Nokia Solutions and Networks Oy", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600 / TD-LTE 2600", + "notes": "Test network in Espoo Leppävaara and Nokia HQ" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "08", + "brand": "Nokia", + "operator": "Nokia Solutions and Networks Oy", + "status": "Unknown", + "bands": "GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "09", + "brand": null, + "operator": "Nokia Solutions and Networks Oy", + "status": "Unknown", + "bands": "GSM 900", + "notes": "Former Finnet Group" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "10", + "brand": null, + "operator": "Traficom", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former TDC Oy Finland" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "11", + "brand": null, + "operator": "Traficom", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Vectone Mobile" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "12", + "brand": "DNA", + "operator": "DNA Oy", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "13", + "brand": "DNA", + "operator": "DNA Oy", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "14", + "brand": "Ålcom", + "operator": "Ålands Telekommunikation Ab", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": "Former Ålands Mobiltelefon (ÅMT); coverage only in Åland" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "15", + "brand": null, + "operator": "Telit Wireless Solutions GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former educational network of Satakunta University of Applied Sciences" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "16", + "brand": null, + "operator": "Digita Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Tele2" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "17", + "brand": null, + "operator": "Liikennevirasto", + "status": "Operational", + "bands": "GSM-R", + "notes": "Finnish Transport Agency" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "19", + "brand": null, + "operator": "Nettia Oy", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "20", + "brand": null, + "operator": "Elisa Oyj", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Telia" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "21", + "brand": "Elisa- Saunalahti", + "operator": "Elisa Oyj", + "status": "Operational", + "bands": "MVNO", + "notes": "Internal MVNO-code of Elisa Oyj. Former Saunalahti Group Oyj" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "22", + "brand": null, + "operator": "EXFO Oy", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former NetHawk Oyj; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "23", + "brand": null, + "operator": "EXFO Oy", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former NetHawk Oyj; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "24", + "brand": null, + "operator": "Nord Connect UAB", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former Tampere University of Technology foundation; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "25", + "brand": null, + "operator": "Fortum Power and Heat Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Datame Oy CDMA" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "26", + "brand": "Compatel", + "operator": "Compatel Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "27", + "brand": null, + "operator": "Teknologian tutkimuskeskus VTT Oy", + "status": "Unknown", + "bands": "LTE 450 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500 / 5G mmWave", + "notes": "VTT Technical Research Centre of Finland" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "28", + "brand": null, + "operator": "Teknologian tutkimuskeskus VTT Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": "VTT Technical Research Centre of Finland" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "29", + "brand": null, + "operator": "Teknologian tutkimuskeskus VTT Oy", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former SCNL Truphone, VTT Technical Research Centre of Finland; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "30", + "brand": null, + "operator": "Teknologian tutkimuskeskus VTT Oy", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former Mundio Mobile Oy, VTT Technical Research Centre of Finland; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "31", + "brand": null, + "operator": "Teknologian tutkimuskeskus VTT Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Ukko Mobile Oy, VTT Technical Research Centre of Finland" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "32", + "brand": "Voxbone", + "operator": "Voxbone SA", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "33", + "brand": "VIRVE", + "operator": "Suomen Turvallisuusverkko Oy", + "status": "Operational", + "bands": "TETRA", + "notes": "Finnish authorities radio network" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "34", + "brand": "Bittium Wireless", + "operator": "Bittium Wireless Oy", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "35", + "brand": null, + "operator": "Edzcom Oy", + "status": "Operational", + "bands": "LTE 450 / TD-LTE 2600", + "notes": "Former Ukkoverkot; data-only network" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "36", + "brand": "Telia / DNA", + "operator": "Telia Finland Oyj / Suomen Yhteisverkko Oy", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "Joint mobile network in Northern and Eastern Finland areas" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "37", + "brand": "Tismi", + "operator": "Tismi BV", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "38", + "brand": null, + "operator": "Nokia Solutions and Networks Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": "Test network" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "39", + "brand": null, + "operator": "Nokia Solutions and Networks Oy", + "status": "Not operational", + "bands": "Unknown", + "notes": "Test network; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "40", + "brand": null, + "operator": "Nokia Solutions and Networks Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": "Test network;" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "41", + "brand": null, + "operator": "Nokia Solutions and Networks Oy", + "status": "Not operational", + "bands": "Unknown", + "notes": "Test network MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "42", + "brand": null, + "operator": "SMS Provider Corp.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "43", + "brand": null, + "operator": "Telavox AB / Telavox Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "44", + "brand": null, + "operator": "Turun ammattikorkeakoulu Oy", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "45", + "brand": null, + "operator": "Suomen Turvallisuusverkko Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": "Public safety network" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "46", + "brand": null, + "operator": "Suomen Turvallisuusverkko Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": "Public safety network" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "47", + "brand": null, + "operator": "Suomen Turvallisuusverkko Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": "Public safety network" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "50", + "brand": null, + "operator": "Aalto-korkeakoulusäätiö sr", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "51", + "brand": null, + "operator": "Aalto-korkeakoulusäätiö sr", + "status": "Unknown", + "bands": "NB-IoT 700", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "52", + "brand": null, + "operator": "Aalto-korkeakoulusäätiö sr", + "status": "Unknown", + "bands": "5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "53", + "brand": null, + "operator": "Aalto-korkeakoulusäätiö sr", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "54", + "brand": null, + "operator": "Aalto-korkeakoulusäätiö sr", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "55", + "brand": null, + "operator": "Aalto-korkeakoulusäätiö sr", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "56", + "brand": null, + "operator": "Aalto-korkeakoulusäätiö sr", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "57", + "brand": null, + "operator": "Aalto-korkeakoulusäätiö sr", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "58", + "brand": null, + "operator": "Aalto-korkeakoulusäätiö sr", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "59", + "brand": null, + "operator": "Aalto-korkeakoulusäätiö sr", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "91", + "brand": "Telia", + "operator": "Telia Finland Oyj", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500", + "notes": "Former Sonera" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "92", + "brand": "Sonera", + "operator": "TeliaSonera Finland Oyj", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "95", + "brand": null, + "operator": "Säteilyturvakeskus", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Finland", + "countryCode": "FI", + "mcc": "244", + "mnc": "99", + "brand": null, + "operator": "Oy L M Ericsson Ab", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "01", + "brand": "Orange", + "operator": "Orange S.A.", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "02", + "brand": "Orange", + "operator": "Orange S.A.", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "Zones Blanches" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "03", + "brand": "MobiquiThings", + "operator": "MobiquiThings", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "04", + "brand": "Sisteer", + "operator": "Societe d'ingenierie systeme telecom et reseaux", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "05", + "brand": null, + "operator": "Globalstar Europe", + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "06", + "brand": null, + "operator": "Globalstar Europe", + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "07", + "brand": null, + "operator": "Globalstar Europe", + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "08", + "brand": "SFR", + "operator": "Altice", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Completel" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "09", + "brand": "SFR", + "operator": "Altice", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "is launched for SFR outbound roaming services" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "10", + "brand": "SFR", + "operator": "Altice", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "MNC also used in Monaco" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "11", + "brand": "SFR", + "operator": "Altice", + "status": "Operational", + "bands": "UMTS 2100", + "notes": "Femtocells" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "12", + "brand": "Truphone", + "operator": "Truphone France", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Hewlett-Packard France" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "13", + "brand": "SFR", + "operator": "Altice", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500", + "notes": "Zones Blanches" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "14", + "brand": "SNCF Réseau", + "operator": "SNCF Réseau", + "status": "Operational", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "15", + "brand": "Free", + "operator": "Free Mobile", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600 / 5G 700 / 5G 3500", + "notes": "Principal Network" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "16", + "brand": "Free", + "operator": "Free Mobile", + "status": "Operational", + "bands": "LTE 700 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "17", + "brand": "LEGOS", + "operator": "Local Exchange Global Operation Services", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "18", + "brand": "Voxbone", + "operator": "Voxbone mobile", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "19", + "brand": null, + "operator": "Haute-Garonne numérique", + "status": "Operational", + "bands": "LTE", + "notes": "Former Altitude Infrastructure; fixed wireless" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "20", + "brand": "Bouygues", + "operator": "Bouygues Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "MNC also used in Monaco" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "21", + "brand": "Bouygues", + "operator": "Bouygues Telecom", + "status": "Unknown", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / UMTS 900", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "22", + "brand": "Transatel Mobile", + "operator": "Transatel", + "status": "Unknown", + "bands": "MVNO", + "notes": "MVNE Uses Orange" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "23", + "brand": null, + "operator": "Syndicat mixte ouvert Charente Numérique", + "status": "Operational", + "bands": "TD-LTE", + "notes": "Former Omea Telecom (bought by SFR in 2014); fixed wireless" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "24", + "brand": "Sierra Wireless", + "operator": "Sierra Wireless", + "status": "Operational", + "bands": "MVNO", + "notes": "Former MobiquiThings" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "25", + "brand": "LycaMobile", + "operator": "LycaMobile", + "status": "Operational", + "bands": "MVNO", + "notes": "Using Bouygues Telecom" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "26", + "brand": "NRJ Mobile", + "operator": "Bouygues Telecom - Distribution", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Euro-Information Telecom" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "27", + "brand": null, + "operator": "Coriolis Telecom", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Afone Using Altice SFR" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "28", + "brand": "AIF", + "operator": "Airmob Infra Full", + "status": "Operational", + "bands": "FULL MVNO", + "notes": "Using Orange Network" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "29", + "brand": null, + "operator": "Cubic télécom France", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Société International Mobile Communication" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "30", + "brand": null, + "operator": "Syma Mobile", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "31", + "brand": "Vectone Mobile", + "operator": "Mundio Mobile", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses SFR or RED" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "32", + "brand": "Orange", + "operator": "Orange S.A.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "33", + "brand": "Fibre64", + "operator": "Département des Pyrénées-Atlantiques", + "status": "Unknown", + "bands": "WiMAX", + "notes": "fixed wireless" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "34", + "brand": null, + "operator": "Cellhire France", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "35", + "brand": "Free", + "operator": "Free Mobile", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "36", + "brand": "Free", + "operator": "Free Mobile", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "37", + "brand": null, + "operator": "IP Directions", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "38", + "brand": null, + "operator": "Lebara France Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "39", + "brand": null, + "operator": "Netwo", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "500", + "brand": null, + "operator": "EDF", + "status": "Unknown", + "bands": "Unknown", + "notes": "MNC 50 formerly assigned to EDF" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "50144", + "brand": null, + "operator": "TotalEnergies Global Information Technology services", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "50164", + "brand": null, + "operator": "TotalEnergies Global Information Technology services", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "50168", + "brand": null, + "operator": "Butachimie", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "50169", + "brand": null, + "operator": "SNEF telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "50176", + "brand": null, + "operator": "Grand port fluvio-maritime de l'axe Seine", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "50194", + "brand": null, + "operator": "Société du Grand Paris", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "502", + "brand": null, + "operator": "EDF", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former General Electric Digital Services Europe" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "504", + "brand": null, + "operator": "Centre à l'énergie atomique et aux énergies alternatives", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "700", + "brand": null, + "operator": "Weaccess group", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "701", + "brand": null, + "operator": "GIP Vendée numérique", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "702", + "brand": null, + "operator": "17-Numerique", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "703", + "brand": null, + "operator": "Nivertel", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "704", + "brand": null, + "operator": "Axione Limousin", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "705", + "brand": null, + "operator": "Hautes-Pyrénées Numérique", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "706", + "brand": null, + "operator": "Tours Métropole Numérique", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "707", + "brand": null, + "operator": "Sartel THD", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "708", + "brand": null, + "operator": "Melis@ territoires ruraux", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "709", + "brand": null, + "operator": "Quimper communauté télécom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "710", + "brand": null, + "operator": "Losange", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "711", + "brand": null, + "operator": "Nomotech", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "712", + "brand": null, + "operator": "Syndicat Audois d'énergies et du Numérique", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "713", + "brand": null, + "operator": "SD NUM SAS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "714", + "brand": null, + "operator": "Département de l'Isère", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "86", + "brand": null, + "operator": "SEM@FOR77", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Nomotech" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "87", + "brand": null, + "operator": "Airbus defence and space SAS", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former RATP" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "88", + "brand": "Bouygues", + "operator": "Bouygues Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "Zones Blanches" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "89", + "brand": null, + "operator": "Hub One", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Omer Telecom Ltd, Fondation b-com" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "90", + "brand": null, + "operator": "Images & Réseaux", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "91", + "brand": null, + "operator": "Orange S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "92", + "brand": "Com4Innov", + "operator": "Association Plate-forme Télécom", + "status": "Not operational", + "bands": "TD-LTE 2300 / LTE 2600", + "notes": "Test network; MNC withdrawn" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "93", + "brand": null, + "operator": "Thales Communications & Security SAS", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former TDF; MNC withdrawn" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "94", + "brand": null, + "operator": "Halys", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "95", + "brand": null, + "operator": "Orange S.A.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "96", + "brand": null, + "operator": "Région Bourgogne-Franche-Comté", + "status": "Operational", + "bands": "LTE", + "notes": "Former Axione; fixed wireless" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "97", + "brand": null, + "operator": "Thales Communications & Security SAS", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "France", + "countryCode": "FR", + "mcc": "208", + "mnc": "98", + "brand": null, + "operator": "Société Air France", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "01", + "brand": "Geocell", + "operator": "Silknet", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "02", + "brand": "Magti", + "operator": "MagtiCom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "03", + "brand": "MagtiFix", + "operator": "MagtiCom", + "status": "Operational", + "bands": "CDMA 450", + "notes": "License until 2029" + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "04", + "brand": "Beeline", + "operator": "Mobitel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800", + "notes": null + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "05", + "brand": "S1", + "operator": "Silknet", + "status": "Operational", + "bands": "CDMA 800", + "notes": "former UTG" + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "06", + "brand": null, + "operator": "JSC Compatel", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "07", + "brand": "GlobalCell", + "operator": "GlobalCell", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "08", + "brand": "Silk LTE", + "operator": "Silknet", + "status": "Operational", + "bands": "LTE 2300", + "notes": "CDMA 850 shut down Nov 2019" + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "09", + "brand": null, + "operator": "Gmobile", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "10", + "brand": null, + "operator": "Premium Net International SRL", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "11", + "brand": null, + "operator": "Mobilive", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "12", + "brand": null, + "operator": "Telecom1 Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Datacomm" + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "13", + "brand": null, + "operator": "Asanet Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "14", + "brand": "DataCell", + "operator": "DataHouse Global", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "15", + "brand": null, + "operator": "Servicebox Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Georgia", + "countryCode": "GE", + "mcc": "282", + "mnc": "22", + "brand": "Myphone", + "operator": "Myphone Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "01", + "brand": "Telekom", + "operator": "Telekom Deutschland GmbH", + "status": "Operational", + "bands": "GSM 900 / LTE 700 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 2100 / 5G 3500", + "notes": "Formerly D1 - DeTeMobil, D1-Telekom, T-D1, T-Mobile; UMTS shut down Jun 2021" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "02", + "brand": "Vodafone", + "operator": "Vodafone D2 GmbH", + "status": "Operational", + "bands": "GSM 900 / LTE 700 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 3500", + "notes": "Former D2 Mannesmann; UMTS shut down Jun 2021" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "03", + "brand": "O2", + "operator": "Telefónica Germany GmbH & Co. oHG", + "status": "Operational", + "bands": "GSM 900 / LTE 700 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500", + "notes": "Former E-Plus until 2014; UMTS shut down Dec 2021" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "04", + "brand": "Vodafone", + "operator": "Vodafone D2 GmbH", + "status": "Reserved", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "05", + "brand": "O2", + "operator": "Telefónica Germany GmbH & Co. oHG", + "status": "Reserved", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100", + "notes": "Former E-Plus" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "06", + "brand": "Telekom", + "operator": "Telekom Deutschland GmbH", + "status": "Reserved", + "bands": "GSM 900 / LTE 800 / LTE 900 / LTE 1500 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "07", + "brand": "O2", + "operator": "Telefónica Germany GmbH & Co. oHG", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Merged with E-Plus Mobilfunk in 2014 and uses MNC 262-03 since 2016" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "08", + "brand": "O2", + "operator": "Telefónica Germany GmbH & Co. oHG", + "status": "Reserved", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "09", + "brand": "Vodafone", + "operator": "Vodafone D2 GmbH", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 2600", + "notes": "Internal testing IOT" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "10", + "brand": null, + "operator": "DB Netz AG", + "status": "Operational", + "bands": "GSM-R", + "notes": "Former Arcor, Vodafone" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "11", + "brand": "O2", + "operator": "Telefónica Germany GmbH & Co. oHG", + "status": "Reserved", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "12", + "brand": "Simquadrat", + "operator": "sipgate GmbH", + "status": "Operational", + "bands": "MVNO", + "notes": "National roaming with O2 (former E-Plus)" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "13", + "brand": "BAAINBw", + "operator": "Bundesamt für Ausrüstung, Informationstechnik und Nutzung der Bundeswehr", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Mobilcom" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "14", + "brand": null, + "operator": "Lebara Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Group 3G UMTS" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "15", + "brand": "Airdata", + "operator": null, + "status": "Operational", + "bands": "TD-SCDMA", + "notes": "data only" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "16", + "brand": null, + "operator": "Telogic Germany GmbH", + "status": "Not operational", + "bands": "MVNO", + "notes": "formerly Vistream; bankruptcy in 2012; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "17", + "brand": "O2", + "operator": "Telefónica Germany GmbH & Co. oHG", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former E-Plus; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "18", + "brand": null, + "operator": "NetCologne", + "status": "Operational", + "bands": "MVNO", + "notes": "CDMA 450 shut down" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "19", + "brand": "450connect", + "operator": "Alliander AG", + "status": "Operational", + "bands": "LTE 450", + "notes": "Former Inquam" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "20", + "brand": "Enreach", + "operator": "Enreach Germany GmbH", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses O2 (262-03)" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "21", + "brand": null, + "operator": "Multiconnect GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "22", + "brand": null, + "operator": "sipgate Wireless GmbH", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "23", + "brand": "1&1", + "operator": "Drillisch Online AG", + "status": "Operational", + "bands": "5G 3500 / MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "24", + "brand": null, + "operator": "TelcoVillage GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "25", + "brand": null, + "operator": "MTEL Deutschland GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "33", + "brand": "simquadrat", + "operator": "sipgate GmbH", + "status": "Not operational", + "bands": "MVNO", + "notes": "Uses O2 (former E-Plus) (262-03); MNC withdrawn" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "41", + "brand": null, + "operator": "First Telecom GmbH", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "42", + "brand": "CCC Event", + "operator": "Chaos Computer Club", + "status": "Temporary operational", + "bands": "GSM 1800", + "notes": "Used on events like Chaos Communication Congress" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "43", + "brand": "Lycamobile", + "operator": "Lycamobile", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Vodafone" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "60", + "brand": null, + "operator": "DB Telematik", + "status": "Operational", + "bands": "GSM-R 900", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "70", + "brand": null, + "operator": "BDBOS", + "status": "Operational", + "bands": "Tetra", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "71", + "brand": null, + "operator": "GSMK", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "72", + "brand": null, + "operator": "Ericsson GmbH", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "73", + "brand": null, + "operator": "Nokia", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Xantaro Deutschland GmbH" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "74", + "brand": null, + "operator": "Ericsson GmbH", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former Qualcomm MNC withdrawn" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "75", + "brand": null, + "operator": "Core Network Dynamics GmbH", + "status": "Not operational", + "bands": "Unknown", + "notes": "Test network; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "76", + "brand": null, + "operator": "BDBOS", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Siemens" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "77", + "brand": "O2", + "operator": "Telefónica Germany GmbH & Co. oHG", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Former E-Plus; test network; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "78", + "brand": "Telekom", + "operator": "Telekom Deutschland GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "79", + "brand": null, + "operator": "ng4T GmbH", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "92", + "brand": null, + "operator": "Nash Technologies", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100", + "notes": "Test network; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Germany", + "countryCode": "DE", + "mcc": "262", + "mnc": "98", + "brand": null, + "operator": "private networks", + "status": "Operational", + "bands": "5G 3500", + "notes": "non-public networks" + }, + { + "type": "National", + "countryName": "Gibraltar (United Kingdom)", + "countryCode": "GI", + "mcc": "266", + "mnc": "01", + "brand": "GibTel", + "operator": "Gibtelecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Gibraltar (United Kingdom)", + "countryCode": "GI", + "mcc": "266", + "mnc": "03", + "brand": "Gibfibrespeed", + "operator": "GibFibre Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Gibraltar (United Kingdom)", + "countryCode": "GI", + "mcc": "266", + "mnc": "06", + "brand": "CTS Mobile", + "operator": "CTS Gibraltar", + "status": "Not operational", + "bands": "UMTS 2100", + "notes": "licence withdrawn in February 2013" + }, + { + "type": "National", + "countryName": "Gibraltar (United Kingdom)", + "countryCode": "GI", + "mcc": "266", + "mnc": "09", + "brand": "Shine", + "operator": "Eazitelecom", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100", + "notes": "shut down May 2016" + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "01", + "brand": "Cosmote", + "operator": "COSMOTE - Mobile Telecommunications S.A.", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2600 / 5G 1800 / 5G 2100 / 5G 3500", + "notes": "UMTS shut down Dec 2021" + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "02", + "brand": "Cosmote", + "operator": "COSMOTE - Mobile Telecommunications S.A.", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2600 / 5G 1800 / 5G 2100 / 5G 3500", + "notes": "UMTS shut down Dec 2021" + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "03", + "brand": null, + "operator": "OTE", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "04", + "brand": null, + "operator": "OSE", + "status": "Unknown", + "bands": "GSM-R", + "notes": "Former EDISY" + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "05", + "brand": "Vodafone", + "operator": "Vodafone Greece", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "former PanaFon" + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "06", + "brand": null, + "operator": "Cosmoline", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "07", + "brand": null, + "operator": "AMD Telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "09", + "brand": "NOVA", + "operator": "NOVA", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "former Q-Telecom, WIND Hellas; UMTS shut down Mar 2023" + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "10", + "brand": "NOVA", + "operator": "NOVA", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "former Telestet, TIM, WIND Hellas; UMTS shut down Mar 2023" + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "11", + "brand": null, + "operator": "interConnect", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "12", + "brand": null, + "operator": "Yuboto", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "13", + "brand": null, + "operator": "Compatel Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "14", + "brand": "Cyta Hellas", + "operator": "CYTA", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO on Vodafone's network" + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "15", + "brand": null, + "operator": "BWS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Greece", + "countryCode": "GR", + "mcc": "202", + "mnc": "16", + "brand": null, + "operator": "Inter Telecom", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Greenland (Kingdom of Denmark)", + "countryCode": "GL", + "mcc": "290", + "mnc": "01", + "brand": "tusass", + "operator": "Tusass A/S", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 800 / 5G", + "notes": "Former TELE Greenland; 5G for fixed wireless; UMTS to be shut down in 2023" + }, + { + "type": "National", + "countryName": "Greenland (Kingdom of Denmark)", + "countryCode": "GL", + "mcc": "290", + "mnc": "02", + "brand": "Nanoq Media", + "operator": "inu:it a/s", + "status": "Operational", + "bands": "TD-LTE 2500", + "notes": "Former Nuuk TV" + }, + { + "type": "National", + "countryName": "Greenland (Kingdom of Denmark)", + "countryCode": "GL", + "mcc": "290", + "mnc": "03", + "brand": null, + "operator": "GTV Greenland", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Guernsey (United Kingdom)", + "countryCode": "GG", + "mcc": "234", + "mnc": "03", + "brand": "Airtel-Vodafone", + "operator": "Guernsey Airtel Ltd", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Guernsey (United Kingdom)", + "countryCode": "GG", + "mcc": "234", + "mnc": "50", + "brand": "JT", + "operator": "JT Group Limited", + "status": "Operational", + "bands": "GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "former Wave Telecom" + }, + { + "type": "National", + "countryName": "Guernsey (United Kingdom)", + "countryCode": "GG", + "mcc": "234", + "mnc": "55", + "brand": "Sure Mobile", + "operator": "Sure (Guernsey) Limited", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "former Cable & Wireless" + }, + { + "type": "National", + "countryName": "Hungary", + "countryCode": "HU", + "mcc": "216", + "mnc": "01", + "brand": "Yettel Hungary", + "operator": "Telenor Magyarország Zrt.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "Former Pannon; MNC has not the same numerical value as the area code; UMTS shut down Mar 2023" + }, + { + "type": "National", + "countryName": "Hungary", + "countryCode": "HU", + "mcc": "216", + "mnc": "02", + "brand": null, + "operator": "MVM Net Ltd.", + "status": "Operational", + "bands": "LTE 450", + "notes": "For government use" + }, + { + "type": "National", + "countryName": "Hungary", + "countryCode": "HU", + "mcc": "216", + "mnc": "03", + "brand": "DIGI", + "operator": "DIGI Telecommunication Ltd.", + "status": "Operational", + "bands": "LTE 1800 / TD-LTE 3700", + "notes": null + }, + { + "type": "National", + "countryName": "Hungary", + "countryCode": "HU", + "mcc": "216", + "mnc": "04", + "brand": null, + "operator": "Invitech ICT Services Ltd.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Hungary", + "countryCode": "HU", + "mcc": "216", + "mnc": "20", + "brand": "Yettel Hungary", + "operator": "Telenor Magyarország Zrt.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Hungary", + "countryCode": "HU", + "mcc": "216", + "mnc": "30", + "brand": "Telekom", + "operator": "Magyar Telekom Plc", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "Former Westel; MNC has the same numerical value as the area code; UMTS shut down June 2022" + }, + { + "type": "National", + "countryName": "Hungary", + "countryCode": "HU", + "mcc": "216", + "mnc": "70", + "brand": "Vodafone", + "operator": "Vodafone Magyarország Zrt.", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "MNC has the same numerical value as the area code; UMTS shut down Mar 2023" + }, + { + "type": "National", + "countryName": "Hungary", + "countryCode": "HU", + "mcc": "216", + "mnc": "71", + "brand": "upc", + "operator": "Vodafone Magyarország Zrt.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Hungary", + "countryCode": "HU", + "mcc": "216", + "mnc": "99", + "brand": "MAV GSM-R", + "operator": "Magyar Államvasutak", + "status": "Operational", + "bands": "GSM-R 900", + "notes": null + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "01", + "brand": "Síminn", + "operator": "Iceland Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600", + "notes": "Former Landssimi hf" + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "02", + "brand": "Vodafone", + "operator": "Sýn", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100", + "notes": "Former Islandssimi ehf" + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "03", + "brand": "Vodafone", + "operator": "Sýn", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former Islandssimi ehf; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "04", + "brand": "Viking", + "operator": "IMC Island ehf", + "status": "Operational", + "bands": "GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "05", + "brand": null, + "operator": "Halló Frjáls fjarskipti hf.", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "06", + "brand": null, + "operator": "Núll níu ehf", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "07", + "brand": "IceCell", + "operator": "IceCell ehf", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Network only partially built; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "08", + "brand": "On-waves", + "operator": "Iceland Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": "On ferries and cruise ships" + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "11", + "brand": "Nova", + "operator": "Nova ehf", + "status": "Operational", + "bands": "UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "12", + "brand": "Tal", + "operator": "IP fjarskipti", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "16", + "brand": null, + "operator": "Tismi BV", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "22", + "brand": null, + "operator": "Landhelgisgæslan (Icelandic Coast Guard)", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "31", + "brand": "Síminn", + "operator": "Iceland Telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Iceland", + "countryCode": "IS", + "mcc": "274", + "mnc": "91", + "brand": null, + "operator": "Neyðarlínan", + "status": "Operational", + "bands": "Tetra", + "notes": null + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "01", + "brand": "Vodafone", + "operator": "Vodafone Ireland", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "02", + "brand": "3", + "operator": "Hutchison 3G Ireland limited", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": "Former Telefónica O2" + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "03", + "brand": "Eir", + "operator": "Eir Group plc", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / 5G 3500", + "notes": "Former Meteor" + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "04", + "brand": null, + "operator": "Access Telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "05", + "brand": "3", + "operator": "Hutchison 3G Ireland limited", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "07", + "brand": "Eir", + "operator": "Eir Group plc", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": "Former eMobile" + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "08", + "brand": "Eir", + "operator": "Eir Group plc", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "09", + "brand": null, + "operator": "Clever Communications Ltd.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "11", + "brand": "Tesco Mobile", + "operator": "Liffey Telecom", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses 3" + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "13", + "brand": "Lycamobile", + "operator": "Lycamobile", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses 3" + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "15", + "brand": "Virgin Mobile", + "operator": "UPC", + "status": "Operational", + "bands": "MVNO", + "notes": "Former upc" + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "16", + "brand": "Carphone Warehouse", + "operator": "Carphone Warehouse", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "17", + "brand": "3", + "operator": "Hutchison 3G Ireland limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "18", + "brand": null, + "operator": "Cubic Telecom Limited", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "21", + "brand": null, + "operator": "Net Feasa Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "Internet of things" + }, + { + "type": "National", + "countryName": "Ireland", + "countryCode": "IE", + "mcc": "272", + "mnc": "68", + "brand": null, + "operator": "Office of the Government Chief Information Officer", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Isle of Man (United Kingdom)", + "countryCode": "IM", + "mcc": "234", + "mnc": "18", + "brand": "Cloud 9 Mobile", + "operator": "Cloud 9 Mobile Communications PLC", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100", + "notes": "Retired" + }, + { + "type": "National", + "countryName": "Isle of Man (United Kingdom)", + "countryCode": "IM", + "mcc": "234", + "mnc": "36", + "brand": "Sure Mobile", + "operator": "Sure Isle of Man Ltd.", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100", + "notes": "Former Cable & Wireless" + }, + { + "type": "National", + "countryName": "Isle of Man (United Kingdom)", + "countryCode": "IM", + "mcc": "234", + "mnc": "58", + "brand": "Pronto GSM", + "operator": "Manx Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Isle of Man (United Kingdom)", + "countryCode": "IM", + "mcc": "234", + "mnc": "73", + "brand": null, + "operator": "Bluewave Communications Ltd.", + "status": "Operational", + "bands": "TD-LTE 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "01", + "brand": "TIM", + "operator": "Telecom Italia S.p.A.", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 1500 / LTE 1800 / LTE 2600", + "notes": "UMTS shut down in 2022" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "02", + "brand": "Elsacom", + "operator": null, + "status": "Not operational", + "bands": "Satellite (Globalstar)", + "notes": "Retired" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "04", + "brand": "Intermatica", + "operator": null, + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "05", + "brand": "Telespazio", + "operator": null, + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "06", + "brand": "Vodafone", + "operator": "Vodafone Italia S.p.A.", + "status": "Operational", + "bands": "Unknown", + "notes": "Unknown" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "07", + "brand": "Kena Mobile", + "operator": "Noverca", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses TIM Network" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "08", + "brand": "Fastweb", + "operator": "Fastweb S.p.A.", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses TIM and WindTre Networks" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "10", + "brand": "Vodafone", + "operator": "Vodafone Italia S.p.A.", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 1500 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "30", + "brand": "RFI", + "operator": "Rete Ferroviaria Italiana", + "status": "Operational", + "bands": "GSM-R 900", + "notes": "Railways communication" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "33", + "brand": "Poste Mobile", + "operator": "Poste Mobile S.p.A.", + "status": "Operational", + "bands": "MVNO", + "notes": "uses Wind Tre Network" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "34", + "brand": "BT Italia", + "operator": "BT Italia", + "status": "Operational", + "bands": "MVNO", + "notes": "uses TIM Network" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "35", + "brand": "Lycamobile", + "operator": "Lycamobile", + "status": "Operational", + "bands": "MVNO", + "notes": "uses Vodafone Network" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "36", + "brand": "Digi Mobil", + "operator": "Digi Italy S.r.l.", + "status": "Operational", + "bands": "MVNO", + "notes": "uses TIM Network" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "37", + "brand": "WINDTRE", + "operator": "Wind Tre", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former 3 Italia" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "38", + "brand": "LINKEM", + "operator": "OpNet S.p.A.", + "status": "Operational", + "bands": "TD-LTE 3500 / 5G 3500 / 5G 26000", + "notes": "spectrum shared with GO Internet" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "39", + "brand": "SMS Italia", + "operator": "SMS Italia S.r.l.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "41", + "brand": "GO internet", + "operator": "GO internet S.p.A.", + "status": "Operational", + "bands": "TD-LTE 3500 / 5G 3500", + "notes": "spectrum available only in Marche and Emilia-Romagna, roams on Linkem otherwise" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "43", + "brand": "TIM", + "operator": "Telecom Italia S.p.A.", + "status": "Operational", + "bands": "5G 700 / 5G 3500 / 5G 26000", + "notes": null + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "47", + "brand": "Fastweb", + "operator": "Fastweb S.p.A.", + "status": "Operational", + "bands": "TD-LTE 3500 / 5G 3500 / 5G 26000", + "notes": "Former Tiscali, acquired by Fastweb in 2018" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "48", + "brand": "TIM", + "operator": "Telecom Italia S.p.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "49", + "brand": "Vianova", + "operator": "Welcome Italia S.p.A.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "50", + "brand": "Iliad", + "operator": "Iliad Italia", + "status": "Operational", + "bands": "UMTS 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "53", + "brand": "COOP Voce", + "operator": "COOP Voce", + "status": "Operational", + "bands": "MVNO", + "notes": "MNC used from Jan, 2020" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "54", + "brand": "Plintron", + "operator": null, + "status": "Operational", + "bands": "MVNO", + "notes": "Operates only as MVNE for Rabona, NoiTel and NT Mobile on Vodafone network" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "56", + "brand": "Spusu", + "operator": "Mass Response GmbH", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "77", + "brand": "IPSE 2000", + "operator": null, + "status": "Not operational", + "bands": "UMTS 2100", + "notes": "Retired" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "88", + "brand": "WINDTRE", + "operator": "Wind Tre", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 1800 / 5G 2600 / 5G 3500", + "notes": "Former Wind" + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "98", + "brand": "BLU", + "operator": "BLU S.p.A.", + "status": "Not operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Italy", + "countryCode": "IT", + "mcc": "222", + "mnc": "99", + "brand": "WINDTRE", + "operator": "Wind Tre", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "Former 3 Italia" + }, + { + "type": "National", + "countryName": "Jersey (United Kingdom)", + "countryCode": "JE", + "mcc": "234", + "mnc": "03", + "brand": "Airtel-Vodafone", + "operator": "Jersey Airtel Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Jersey (United Kingdom)", + "countryCode": "JE", + "mcc": "234", + "mnc": "28", + "brand": null, + "operator": "Marathon Telecom Limited", + "status": "Not operational", + "bands": "UMTS 2100", + "notes": "holds license but not network built" + }, + { + "type": "National", + "countryName": "Jersey (United Kingdom)", + "countryCode": "JE", + "mcc": "234", + "mnc": "50", + "brand": "JT", + "operator": "JT Group Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Jersey (United Kingdom)", + "countryCode": "JE", + "mcc": "234", + "mnc": "55", + "brand": "Sure Mobile", + "operator": "Sure (Jersey) Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": "former Cable & Wireless" + }, + { + "type": "National", + "countryName": "Kosovo", + "countryCode": "XK", + "mcc": "221", + "mnc": "01", + "brand": "Vala", + "operator": "Telecom of Kosovo J.S.C.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 1800", + "notes": "Previously the Monaco MCC/MNC 212-01 was used." + }, + { + "type": "National", + "countryName": "Kosovo", + "countryCode": "XK", + "mcc": "221", + "mnc": "02", + "brand": "IPKO", + "operator": "IPKO", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 1800", + "notes": "Previously the Slovenian MCC/MNC 293-41 was used. Used by MVNO D3 Mobile." + }, + { + "type": "National", + "countryName": "Kosovo", + "countryCode": "XK", + "mcc": "221", + "mnc": "06", + "brand": "Z Mobile", + "operator": "Dardaphone.Net LLC", + "status": "Operational", + "bands": "MVNO", + "notes": "Previously the Monaco MCC/MNC 212-01 was used." + }, + { + "type": "National", + "countryName": "Kosovo", + "countryCode": "XK", + "mcc": "221", + "mnc": "07", + "brand": "D3 Mobile", + "operator": "Dukagjini Telecommunications LLC", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Latvia", + "countryCode": "LV", + "mcc": "247", + "mnc": "01", + "brand": "LMT", + "operator": "Latvian Mobile Telephone", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Latvia", + "countryCode": "LV", + "mcc": "247", + "mnc": "02", + "brand": "Tele2", + "operator": "Tele2", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Latvia", + "countryCode": "LV", + "mcc": "247", + "mnc": "03", + "brand": "TRIATEL", + "operator": "Telekom Baltija", + "status": "Operational", + "bands": "CDMA 450", + "notes": null + }, + { + "type": "National", + "countryName": "Latvia", + "countryCode": "LV", + "mcc": "247", + "mnc": "04", + "brand": null, + "operator": "Beta Telecom", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former Lattelecom; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Latvia", + "countryCode": "LV", + "mcc": "247", + "mnc": "05", + "brand": "Bite", + "operator": "Bite Latvija", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "Bite's postpaid customers are still being assigned SIM cards with 246 02 MNC" + }, + { + "type": "National", + "countryName": "Latvia", + "countryCode": "LV", + "mcc": "247", + "mnc": "06", + "brand": null, + "operator": "SIA \"UNISTARS\"", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Rigatta" + }, + { + "type": "National", + "countryName": "Latvia", + "countryCode": "LV", + "mcc": "247", + "mnc": "07", + "brand": null, + "operator": "SIA \"MEGATEL\"", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Bite network; former Master Telecom" + }, + { + "type": "National", + "countryName": "Latvia", + "countryCode": "LV", + "mcc": "247", + "mnc": "08", + "brand": "VMT", + "operator": "SIA \"VENTAmobile\"", + "status": "Operational", + "bands": "MVNO", + "notes": "Former IZZI" + }, + { + "type": "National", + "countryName": "Latvia", + "countryCode": "LV", + "mcc": "247", + "mnc": "09", + "brand": "Xomobile", + "operator": "Camel Mobile", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Global Mobile Solutions" + }, + { + "type": "National", + "countryName": "Latvia", + "countryCode": "LV", + "mcc": "247", + "mnc": "10", + "brand": "LMT", + "operator": "Latvian Mobile Telephone", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Liechtenstein", + "countryCode": "LI", + "mcc": "295", + "mnc": "01", + "brand": "Swisscom", + "operator": "Swisscom Schweiz AG", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Also uses MCC 228 MNC 01 (Switzerland)" + }, + { + "type": "National", + "countryName": "Liechtenstein", + "countryCode": "LI", + "mcc": "295", + "mnc": "02", + "brand": "7acht", + "operator": "Salt Liechtenstein AG", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Orange" + }, + { + "type": "National", + "countryName": "Liechtenstein", + "countryCode": "LI", + "mcc": "295", + "mnc": "05", + "brand": "FL1", + "operator": "Telecom Liechtenstein AG", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800", + "notes": "Former Mobilkom" + }, + { + "type": "National", + "countryName": "Liechtenstein", + "countryCode": "LI", + "mcc": "295", + "mnc": "06", + "brand": "Cubic Telecom", + "operator": "Cubic Telecom AG", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Liechtenstein", + "countryCode": "LI", + "mcc": "295", + "mnc": "07", + "brand": null, + "operator": "First Mobile AG", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Liechtenstein", + "countryCode": "LI", + "mcc": "295", + "mnc": "09", + "brand": null, + "operator": "EMnify GmbH", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Liechtenstein", + "countryCode": "LI", + "mcc": "295", + "mnc": "10", + "brand": null, + "operator": "Soracom LI Ltd.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Liechtenstein", + "countryCode": "LI", + "mcc": "295", + "mnc": "11", + "brand": null, + "operator": "DIMOCO Messaging AG", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Liechtenstein", + "countryCode": "LI", + "mcc": "295", + "mnc": "77", + "brand": "Alpmobil", + "operator": "Alpcom AG", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Bankruptcy in February 2012, former Tele2, MNC withdrawn" + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "01", + "brand": "Telia", + "operator": "Telia Lietuva", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 2100 / 5G 3500", + "notes": "Former Omnitel; UMTS 2100 shut down Dec 2020, UMTS 900 - Dec 2022" + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "02", + "brand": "BITĖ", + "operator": "UAB Bitė Lietuva", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "03", + "brand": "Tele2", + "operator": "UAB Tele2 (Tele2 AB, Sweden)", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 700 / 5G 3500", + "notes": "(in Vodafone partnership)" + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "04", + "brand": null, + "operator": "LR vidaus reikalų ministerija (Ministry of the Interior)", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "05", + "brand": "LitRail", + "operator": "Lietuvos geležinkeliai (Lithuanian Railways)", + "status": "Operational", + "bands": "GSM-R 900", + "notes": null + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "06", + "brand": "Mediafon", + "operator": "UAB Mediafon", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "07", + "brand": null, + "operator": "Compatel Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "08", + "brand": "MEZON", + "operator": "Lietuvos radijo ir televizijos centras", + "status": "Operational", + "bands": "WiMAX 3500 / TD-LTE 2300 / 5G 2300", + "notes": "acquired by Bitė" + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "09", + "brand": null, + "operator": "Interactive Digital Media GmbH", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "11", + "brand": null, + "operator": "DATASIM OU", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "12", + "brand": null, + "operator": "Nord connect OU", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "13", + "brand": null, + "operator": "Travel Communication SIA", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "14", + "brand": null, + "operator": "Tismi BV", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "15", + "brand": null, + "operator": "Esim telecom, UAB", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Lithuania", + "countryCode": "LT", + "mcc": "246", + "mnc": "16", + "brand": null, + "operator": "Annecto Telecom Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "01", + "brand": "POST", + "operator": "POST Luxembourg", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 700 / 5G 3500", + "notes": "Former LuxGSM (P&T Luxembourg)" + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "02", + "brand": null, + "operator": "MTX Connect S.a.r.l.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "05", + "brand": null, + "operator": "Luxembourg Online S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "07", + "brand": null, + "operator": "Bouygues Telecom S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "10", + "brand": null, + "operator": "Blue Communications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "71", + "brand": "CFL", + "operator": "Société Nationale des Chemins de Fer Luxembourgeois", + "status": "Operational", + "bands": "GSM-R 900", + "notes": null + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "77", + "brand": "Tango", + "operator": "Tango SA", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 700 / 5G 3500", + "notes": "MNC also used in Belgium; UMTS to shut down Jan 2024" + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "78", + "brand": null, + "operator": "Interactive digital media GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "79", + "brand": null, + "operator": "Mitto AG", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "80", + "brand": null, + "operator": "Syniverse Technologies S.à r.l.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "81", + "brand": null, + "operator": "E-Lux Mobile Telecommunication S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Luxembourg", + "countryCode": "LU", + "mcc": "270", + "mnc": "99", + "brand": "Orange", + "operator": "Orange S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 700 / 5G 3500", + "notes": "Former VOXmobile; MNC also used in Belgium" + }, + { + "type": "National", + "countryName": "Malta", + "countryCode": "MT", + "mcc": "278", + "mnc": "01", + "brand": "Epic", + "operator": "Epic", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / 5G", + "notes": "Former Vodafone; supports MVNOs Redtouch Fone and VFC Mobile" + }, + { + "type": "National", + "countryName": "Malta", + "countryCode": "MT", + "mcc": "278", + "mnc": "11", + "brand": null, + "operator": "YOM Ltd.", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Malta", + "countryCode": "MT", + "mcc": "278", + "mnc": "21", + "brand": "GO", + "operator": "Mobile Communications Limited", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / 5G", + "notes": "Supports MVNO PING" + }, + { + "type": "National", + "countryName": "Malta", + "countryCode": "MT", + "mcc": "278", + "mnc": "30", + "brand": "GO", + "operator": "Mobile Communications Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Malta", + "countryCode": "MT", + "mcc": "278", + "mnc": "77", + "brand": "Melita", + "operator": "Melita", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 2100 / 5G", + "notes": null + }, + { + "type": "National", + "countryName": "Moldova", + "countryCode": "MD", + "mcc": "255", + "mnc": "00", + "brand": "IDC", + "operator": "Interdnestrcom", + "status": "Operational", + "bands": "CDMA 800", + "notes": "Unofficially using Ukrainian MCC; CDMA 450 shut down Sep 2020" + }, + { + "type": "National", + "countryName": "Moldova", + "countryCode": "MD", + "mcc": "259", + "mnc": "01", + "brand": "Orange", + "operator": "Orange Moldova", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Former Voxtel" + }, + { + "type": "National", + "countryName": "Moldova", + "countryCode": "MD", + "mcc": "259", + "mnc": "02", + "brand": "Moldcell", + "operator": "Moldcell", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Moldova", + "countryCode": "MD", + "mcc": "259", + "mnc": "03", + "brand": "Moldtelecom", + "operator": "Moldtelecom", + "status": "Operational", + "bands": "CDMA 450", + "notes": null + }, + { + "type": "National", + "countryName": "Moldova", + "countryCode": "MD", + "mcc": "259", + "mnc": "04", + "brand": "Eventis", + "operator": "Eventis Telecom", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Bankruptcy - License suspended" + }, + { + "type": "National", + "countryName": "Moldova", + "countryCode": "MD", + "mcc": "259", + "mnc": "05", + "brand": "Moldtelecom", + "operator": "Moldtelecom", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 1800", + "notes": "Former Unité" + }, + { + "type": "National", + "countryName": "Moldova", + "countryCode": "MD", + "mcc": "259", + "mnc": "15", + "brand": "IDC", + "operator": "Interdnestrcom", + "status": "Operational", + "bands": "LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Moldova", + "countryCode": "MD", + "mcc": "259", + "mnc": "99", + "brand": "Moldtelecom", + "operator": "Moldtelecom", + "status": "Operational", + "bands": "UMTS 2100", + "notes": "Former Unité; used for Femtocell service only" + }, + { + "type": "National", + "countryName": "Monaco", + "countryCode": "MC", + "mcc": "212", + "mnc": "10", + "brand": "Office des Telephones", + "operator": "Monaco Telecom", + "status": "Operational", + "bands": "GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "Used for the Vala network in Kosovo. The GSM Association lists the PTK (P&T Kosovo) website for this network." + }, + { + "type": "National", + "countryName": "Montenegro", + "countryCode": "ME", + "mcc": "297", + "mnc": "01", + "brand": "One", + "operator": "Telenor Montenegro", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G", + "notes": "Former ProMonte GSM" + }, + { + "type": "National", + "countryName": "Montenegro", + "countryCode": "ME", + "mcc": "297", + "mnc": "02", + "brand": "telekom.me", + "operator": "Crnogorski Telekom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "Former MoNet" + }, + { + "type": "National", + "countryName": "Montenegro", + "countryCode": "ME", + "mcc": "297", + "mnc": "03", + "brand": "m:tel", + "operator": "m:tel Crna Gora", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE", + "notes": "Owned by Telekom Srbija" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "00", + "brand": null, + "operator": "Intovoice B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "01", + "brand": null, + "operator": "RadioAccess Network Services", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "02", + "brand": "Tele2", + "operator": "T-Mobile Netherlands B.V", + "status": "Operational", + "bands": "LTE 800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "03", + "brand": "Enreach", + "operator": "Enreach Netherlands B.V.", + "status": "Operational", + "bands": "MVNE", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "04", + "brand": "Vodafone", + "operator": "Vodafone Libertel B.V.", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 1800", + "notes": "UMTS shut down February 2020" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "05", + "brand": null, + "operator": "Elephant Talk Communications Premium Rate Services", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "06", + "brand": "Vectone Mobile", + "operator": "Mundio Mobile (Netherlands) Ltd", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "07", + "brand": "Teleena", + "operator": "Tata Communications MOVE B.V.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "08", + "brand": "KPN", + "operator": "KPN Mobile The Netherlands B.V.", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 700", + "notes": "UMTS 2100 shut down Jan 2022" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "09", + "brand": "Lycamobile", + "operator": "Lycamobile Netherlands Limited", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "10", + "brand": "KPN", + "operator": "KPN B.V.", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "UMTS 2100 shut down Jan 2022" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "11", + "brand": null, + "operator": "Greenet Netwerk B.V", + "status": "Operational", + "bands": "LTE", + "notes": "Former VoipIT B.V., MNC withdrawn; private networks" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "12", + "brand": "Telfort", + "operator": "KPN Mobile The Netherlands B.V.", + "status": "Operational", + "bands": "MVNO", + "notes": "Subbrand of KPN" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "13", + "brand": null, + "operator": "Unica Installatietechniek B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "14", + "brand": null, + "operator": "Venus & Mercury Telecom", + "status": "Unknown", + "bands": "5G", + "notes": "Former 6GMOBILE B.V." + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "15", + "brand": "Ziggo", + "operator": "Ziggo B.V.", + "status": "Operational", + "bands": "LTE 2600", + "notes": "business users only" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "16", + "brand": "T-Mobile (BEN)", + "operator": "T-Mobile Netherlands B.V", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 700", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "17", + "brand": null, + "operator": "Lebara Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Intercity Mobile Communications" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "18", + "brand": "Ziggo", + "operator": "Ziggo Services B.V.", + "status": "Operational", + "bands": "MVNO", + "notes": "Former UPC Netherlands" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "19", + "brand": null, + "operator": "Mixe Communication Solutions B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "20", + "brand": "T-Mobile", + "operator": "T-Mobile Netherlands B.V", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 700", + "notes": "Former Orange Netherlands MCC/MNC" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "21", + "brand": null, + "operator": "ProRail B.V.", + "status": "Operational", + "bands": "GSM-R 900", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "22", + "brand": null, + "operator": "Ministerie van Defensie", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "23", + "brand": null, + "operator": "KORE Wireless Nederland B.V.", + "status": "Operational", + "bands": "MVNO", + "notes": "Former ASPIDER Solutions, Wyless" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "24", + "brand": null, + "operator": "PM Factory B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "25", + "brand": null, + "operator": "CapX B.V.", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Private networks" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "26", + "brand": null, + "operator": "SpeakUp B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "27", + "brand": "L-mobi", + "operator": "L-Mobi Mobile B.V.", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Breezz Nederland B.V." + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "28", + "brand": null, + "operator": "Lancelot B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "29", + "brand": null, + "operator": "Tismi B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Private Mobile Ltd" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "30", + "brand": null, + "operator": "ASpider Solutions Nederland B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "32", + "brand": null, + "operator": "Cubic Telecom Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "33", + "brand": null, + "operator": "Truphone B.V.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "60", + "brand": null, + "operator": "Nextgen Mobile Ltd", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "61", + "brand": null, + "operator": "Alcadis B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former BodyTrace Netherlands B.V." + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "62", + "brand": "RGTN", + "operator": "RGTN Wholesale Netherlands B.V.", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Voxbone; used for Signalling Connection Control Part and two-way SMS services" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "63", + "brand": null, + "operator": "Messagebird BV", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "64", + "brand": null, + "operator": "Zetacom B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "65", + "brand": null, + "operator": "AGMS Netherlands B.V.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "66", + "brand": null, + "operator": "Utility Connect B.V.", + "status": "Operational", + "bands": "CDMA 450", + "notes": "Subsidiary of Alliander; network operated by KPN" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "67", + "brand": null, + "operator": "Koning en Hartman B.V.", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Former RadioAccess B.V.; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "68", + "brand": null, + "operator": "Roamware (Netherlands) B.V.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "69", + "brand": null, + "operator": "KPN Mobile The Netherlands B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Netherlands (Kingdom of the Netherlands)", + "countryCode": "NL", + "mcc": "204", + "mnc": "91", + "brand": null, + "operator": "Enexis Netbeheer B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "North Macedonia", + "countryCode": "MK", + "mcc": "294", + "mnc": "01", + "brand": "Telekom.mk", + "operator": "Makedonski Telekom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 700 / 5G 3500", + "notes": "Former Mobimak" + }, + { + "type": "National", + "countryName": "North Macedonia", + "countryCode": "MK", + "mcc": "294", + "mnc": "02", + "brand": "one", + "operator": "one", + "status": "Not operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": "Former Cosmofon, One (Telekom Slovenija Group)" + }, + { + "type": "National", + "countryName": "North Macedonia", + "countryCode": "MK", + "mcc": "294", + "mnc": "03", + "brand": "A1 MK", + "operator": "A1 Macedonia DOOEL", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100", + "notes": "Former VipOperator; merged with One in 2015 and renamed to one.vip; renamed to A1 MK in 2019" + }, + { + "type": "National", + "countryName": "North Macedonia", + "countryCode": "MK", + "mcc": "294", + "mnc": "04", + "brand": "Lycamobile", + "operator": "Lycamobile LLC", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses A1 network" + }, + { + "type": "National", + "countryName": "North Macedonia", + "countryCode": "MK", + "mcc": "294", + "mnc": "10", + "brand": null, + "operator": "WTI Macedonia", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "North Macedonia", + "countryCode": "MK", + "mcc": "294", + "mnc": "11", + "brand": null, + "operator": "MOBIK TELEKOMUNIKACII DOOEL Skopje", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "North Macedonia", + "countryCode": "MK", + "mcc": "294", + "mnc": "12", + "brand": null, + "operator": "MTEL DOOEL Skopje", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "01", + "brand": "Telenor", + "operator": "Telenor Norge AS", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "UMTS shut down 2021, GSM to shut down 2025" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "02", + "brand": "Telia", + "operator": "Telia Norge AS", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2600 / 5G 700 / 5G 3500", + "notes": "Former NetCom; UMTS shut down Dec 2021" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "03", + "brand": null, + "operator": "Televerket AS", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "04", + "brand": "Tele2", + "operator": "Tele2 (Mobile Norway AS)", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "05", + "brand": "Telia", + "operator": "Telia Norge AS", + "status": "Not operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100", + "notes": "Former Tele2" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "06", + "brand": "ice", + "operator": "ICE Norge AS", + "status": "Operational", + "bands": "LTE 450", + "notes": "Former Nordisk Mobiltelefon; data services only" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "07", + "brand": "Phonero", + "operator": "Phonero AS", + "status": "Not operational", + "bands": "MVNO", + "notes": "Former Ventelo; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "08", + "brand": "Telia", + "operator": "Telia Norge AS", + "status": "Operational", + "bands": "MVNO", + "notes": "Former TDC" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "09", + "brand": "Com4", + "operator": "Com4 AS", + "status": "Operational", + "bands": "MVNO", + "notes": "Principally M2M services" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "10", + "brand": null, + "operator": "Norwegian Communications Authority", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "11", + "brand": "SystemNet", + "operator": "SystemNet AS", + "status": "Not operational", + "bands": "Test", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "12", + "brand": "Telenor", + "operator": "Telenor Norge AS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "14", + "brand": "ice", + "operator": "ICE Communication Norge AS", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 1800 / LTE 2100 / 5G 700 / 5G 2100", + "notes": "UMTS shut down Jan 2021" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "15", + "brand": null, + "operator": "eRate Norway AS", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "16", + "brand": null, + "operator": "Iristel Norway AS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "17", + "brand": "Telenor", + "operator": "Telenor Norge AS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "20", + "brand": null, + "operator": "Jernbaneverket AS", + "status": "Operational", + "bands": "GSM-R 900", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "21", + "brand": null, + "operator": "Jernbaneverket AS", + "status": "Operational", + "bands": "GSM-R 900", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "22", + "brand": null, + "operator": "Altibox AS", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Network Norway AS;" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "23", + "brand": "Lycamobile", + "operator": "Lyca Mobile Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "24", + "brand": null, + "operator": "Mobile Norway AS", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "25", + "brand": null, + "operator": "Forsvarets kompetansesenter KKIS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "70", + "brand": null, + "operator": "test networks", + "status": "Unknown", + "bands": "Unknown", + "notes": "Can be used without application" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "71", + "brand": null, + "operator": "private networks", + "status": "Unknown", + "bands": "5G 3700", + "notes": "Band n77" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "72", + "brand": null, + "operator": "private networks", + "status": "Unknown", + "bands": "5G 3700", + "notes": "Band n77" + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "73", + "brand": null, + "operator": "private networks", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "74", + "brand": null, + "operator": "private networks", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "75", + "brand": null, + "operator": "private networks", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "90", + "brand": null, + "operator": "Nokia Solutions and Networks Norge AS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Norway", + "countryCode": "NO", + "mcc": "242", + "mnc": "99", + "brand": null, + "operator": "TampNet AS", + "status": "Operational", + "bands": "LTE 800 / LTE 1800", + "notes": "Offshore" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "01", + "brand": "Plus", + "operator": "Polkomtel Sp. z o.o.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-5G 2500", + "notes": "LTE roaming with Aero 2" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "02", + "brand": "T-Mobile", + "operator": "T-Mobile Polska S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 1800 / LTE 2100 / 5G 2100", + "notes": "former Era; see MNC 260-34 for shared LTE network; UMTS 2100 shut down Oct 2021, UMTS 900 to shut down 2023" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "03", + "brand": "Orange", + "operator": "Orange Polska S.A.", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / 5G 2100", + "notes": "former Idea; see MNC 260-34 for shared LTE network; CDMA 450 shut down April 2017" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "04", + "brand": "Plus", + "operator": "Polkomtel Sp. z o.o.", + "status": "Not operational", + "bands": "Unknown", + "notes": "former CenterNet, Aero2" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "05", + "brand": "Orange", + "operator": "Orange Polska S.A.", + "status": "Not operational", + "bands": "UMTS 2100", + "notes": "not in use, using MNC 03" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "06", + "brand": "Play", + "operator": "P4 Sp. z o.o.", + "status": "Operational", + "bands": "GSM 1800 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100", + "notes": "Also roaming on Polkomtel and Orange 2G/3G network" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "07", + "brand": "Netia", + "operator": "Netia S.A.", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO on Play (P4)" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "08", + "brand": null, + "operator": "EXATEL S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former E-Telko Sp. z o.o." + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "09", + "brand": "Lycamobile", + "operator": "Lycamobile Sp. z o.o.", + "status": "Operational", + "bands": "MVNO", + "notes": "On Polkomtel 2G/3G network" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "10", + "brand": "T-Mobile", + "operator": "T-Mobile Polska S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": "former Telefony Opalenickie S.A., Sferia; CDMA 800 shut down in 2014; LTE 800 leased to Aero 2;" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "11", + "brand": "Plus", + "operator": "Polkomtel Sp. z o.o.", + "status": "Operational", + "bands": "CDMA 420", + "notes": "Former Nordisk Polska" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "12", + "brand": "Cyfrowy Polsat", + "operator": "Cyfrowy Polsat S.A.", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO on Polkomtel" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "13", + "brand": null, + "operator": "Move Telecom S.A.", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Sferia" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "14", + "brand": null, + "operator": "Telco Leaders Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Sferia" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "15", + "brand": "Plus", + "operator": "Polkomtel Sp. z o.o.", + "status": "Operational", + "bands": "LTE 1800", + "notes": "former CenterNet, Aero2 ; GSM 1800 shut down in 2010" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "16", + "brand": "Plus", + "operator": "Polkomtel Sp. z o.o.", + "status": "Operational", + "bands": "LTE 1800", + "notes": "former Mobyland, Aero2 ; GSM 1800 shut down in 2010" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "17", + "brand": "Plus", + "operator": "Polkomtel Sp. z o.o.", + "status": "Operational", + "bands": "UMTS 900 / TD-LTE 2600", + "notes": "Former Aero2" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "18", + "brand": "AMD Telecom", + "operator": "AMD Telecom S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "19", + "brand": null, + "operator": "SIA NetBalt", + "status": "Unknown", + "bands": "MVNO", + "notes": "Former Teleena Holding BV" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "20", + "brand": null, + "operator": "TISMI B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Mobile.Net, Wysyłaj SMS Polska" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "21", + "brand": null, + "operator": "private networks", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Exteri until May 2014; now used for several private networks with 4-digit MNC 21xx" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "22", + "brand": null, + "operator": "Twilio Ireland Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Arcomm until Nov 2018" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "23", + "brand": null, + "operator": "PGE Systemy S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Amicomm" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "24", + "brand": null, + "operator": "IT Partners Telco Sp. z o.o.", + "status": "Unknown", + "bands": "Unknown", + "notes": "former WideNet" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "25", + "brand": "TeleCube.PL", + "operator": "Claude ICT Poland Sp. z o.o.", + "status": "Operational", + "bands": "Unknown", + "notes": "Former Best Solutions & Technology Experience, Polskie Sieci Radiowe" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "26", + "brand": null, + "operator": "Vonage B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Advanced Technology & Experience (ATE) until 2016" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "27", + "brand": null, + "operator": "SIA Ntel Solutions", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Intertelcom" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "28", + "brand": null, + "operator": "CrossMobile Sp. z o.o.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former PhoneNet until 2016" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "29", + "brand": null, + "operator": "SMSWIZARD POLSKA Sp. z o.o.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Interfonica Sp. z o.o." + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "30", + "brand": null, + "operator": "HXG Sp. z o.o.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former GrandTel Sp. z o.o." + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "31", + "brand": "Phone IT", + "operator": "Phone IT Sp. z o.o.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "32", + "brand": null, + "operator": "Compatel Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "33", + "brand": "Truphone", + "operator": "Truphone Poland Sp. z o.o.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "34", + "brand": "NetWorkS!", + "operator": "T-Mobile Polska S.A.", + "status": "Operational", + "bands": "LTE 800 / LTE 2600", + "notes": "Shared network T-Mobile / Orange" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "35", + "brand": null, + "operator": "PKP Polskie Linie Kolejowe S.A.", + "status": "Operational", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "36", + "brand": "Vectone Mobile", + "operator": "Mundio Mobile", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn May 2014" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "37", + "brand": null, + "operator": "NEXTGEN MOBILE LTD", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn Nov 2018" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "38", + "brand": null, + "operator": "CALLFREEDOM Sp. z o.o.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdawn Apr 2019" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "39", + "brand": "Voxbone", + "operator": "VOXBONE SA", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "40", + "brand": null, + "operator": "Interactive Digital Media GmbH", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "41", + "brand": null, + "operator": "EZ PHONE MOBILE Sp. z o.o.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "42", + "brand": null, + "operator": "MobiWeb Telecom Limited", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "43", + "brand": null, + "operator": "Smart Idea International Sp. z o.o.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "44", + "brand": null, + "operator": "Rebtel Poland Sp. z o.o.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn Apr 2019" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "45", + "brand": "Virgin Mobile", + "operator": "P4 Sp. z o.o.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "46", + "brand": null, + "operator": "Terra Telekom Sp. z o.o.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "47", + "brand": null, + "operator": "SMShighway Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "48", + "brand": null, + "operator": "AGILE TELECOM S.P.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "49", + "brand": null, + "operator": "Messagebird B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "90", + "brand": null, + "operator": "Polska Spółka Gazownictwa Sp. z o.o.", + "status": "Unknown", + "bands": "Unknown", + "notes": "M2M" + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "97", + "brand": null, + "operator": "Politechnika Łódzka Uczelniane Centrum Informatyczne", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Poland", + "countryCode": "PL", + "mcc": "260", + "mnc": "98", + "brand": "Play", + "operator": "P4 Sp. z o.o.", + "status": "Not operational", + "bands": "LTE 1800", + "notes": "Test network" + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "01", + "brand": "Vodafone", + "operator": "Vodafone Portugal", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "formerly Telecel (2001)" + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "02", + "brand": null, + "operator": "Digi Portugal, Lda.", + "status": "Unknown", + "bands": "Unknown", + "notes": "formerly MEO" + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "03", + "brand": "NOS", + "operator": "NOS Comunicações", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "formerly Optimus (2014)" + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "04", + "brand": "LycaMobile", + "operator": "LycaMobile", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "05", + "brand": null, + "operator": "Oniway - Inforcomunicaçôes, S.A.", + "status": "Not operational", + "bands": "UMTS 2100", + "notes": "License withdrawn in 2003; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "06", + "brand": "MEO", + "operator": "MEO - Serviços de Comunicações e Multimédia, S.A.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500", + "notes": "formerly TMN (2014)" + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "07", + "brand": null, + "operator": "Sumamovil Portugal, S.A.", + "status": "Unknown", + "bands": "MVNO", + "notes": "formerly Vectone/Mundio" + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "08", + "brand": "MEO", + "operator": "MEO - Serviços de Comunicações e Multimédia, S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "11", + "brand": null, + "operator": "Compatel, Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "12", + "brand": null, + "operator": "Infraestruturas de Portugal, S.A.", + "status": "Operational", + "bands": "GSM-R", + "notes": "former Refer Telecom, IP Telecom - Serviços de Telecomunicações, S.A." + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "13", + "brand": null, + "operator": "G9Telecom, S.A.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "21", + "brand": "Zapp", + "operator": "Zapp Portugal", + "status": "Not operational", + "bands": "CDMA2000 450", + "notes": "Closed down in September 2011; MNC withdawn" + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "80", + "brand": "MEO", + "operator": "MEO - Serviços de Comunicações e Multimédia, S.A.", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "91", + "brand": "Vodafone", + "operator": "Vodafone Portugal", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Portugal", + "countryCode": "PT", + "mcc": "268", + "mnc": "93", + "brand": "NOS", + "operator": "NOS Comunicações", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Romania", + "countryCode": "RO", + "mcc": "226", + "mnc": "01", + "brand": "Vodafone", + "operator": "Vodafone România", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / TD-LTE 2600 / 5G 3500", + "notes": "Formerly branded as Connex" + }, + { + "type": "National", + "countryName": "Romania", + "countryCode": "RO", + "mcc": "226", + "mnc": "02", + "brand": "Clicknet Mobile", + "operator": "Telekom Romania", + "status": "Not operational", + "bands": "CDMA 420", + "notes": "Licence expired on 1 January 2015, network shut down" + }, + { + "type": "National", + "countryName": "Romania", + "countryCode": "RO", + "mcc": "226", + "mnc": "03", + "brand": "Telekom", + "operator": "Telekom Romania", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Formerly branded as Cosmote" + }, + { + "type": "National", + "countryName": "Romania", + "countryCode": "RO", + "mcc": "226", + "mnc": "04", + "brand": "Cosmote/Zapp", + "operator": "Telekom Romania", + "status": "Not operational", + "bands": "CDMA 450", + "notes": "Licence expired on 24 March 2013, network shut down" + }, + { + "type": "National", + "countryName": "Romania", + "countryCode": "RO", + "mcc": "226", + "mnc": "05", + "brand": "Digi.Mobil", + "operator": "RCS&RDS", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 2100 / TD-LTE 2600 / 5G 3500", + "notes": "3G network to be shut down until end of H1 2023" + }, + { + "type": "National", + "countryName": "Romania", + "countryCode": "RO", + "mcc": "226", + "mnc": "06", + "brand": "Telekom", + "operator": "Telekom Romania", + "status": "Not operational", + "bands": "UMTS 900 / UMTS 2100", + "notes": "Former Zapp; network shut down Mar 2023" + }, + { + "type": "National", + "countryName": "Romania", + "countryCode": "RO", + "mcc": "226", + "mnc": "10", + "brand": "Orange", + "operator": "Orange România", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "Formerly branded as Dialog" + }, + { + "type": "National", + "countryName": "Romania", + "countryCode": "RO", + "mcc": "226", + "mnc": "11", + "brand": null, + "operator": "Enigma-System", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Romania", + "countryCode": "RO", + "mcc": "226", + "mnc": "15", + "brand": "Idilis", + "operator": "Idilis", + "status": "Not operational", + "bands": "WiMAX / TD-LTE 2600", + "notes": "LTE license is sold to RCS&RDS" + }, + { + "type": "National", + "countryName": "Romania", + "countryCode": "RO", + "mcc": "226", + "mnc": "16", + "brand": "Lycamobile", + "operator": "Lycamobile Romania", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Telekom Networks" + }, + { + "type": "National", + "countryName": "Romania", + "countryCode": "RO", + "mcc": "226", + "mnc": "19", + "brand": "CFR", + "operator": "Căile Ferate Române", + "status": "Testing", + "bands": "GSM-R 900", + "notes": "Dedicated network for safety communication, not for public users." + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "01", + "brand": "MTS", + "operator": "Mobile TeleSystems", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 4700", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "02", + "brand": "MegaFon", + "operator": "MegaFon PJSC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Former North-West GSM" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "03", + "brand": "NCC", + "operator": "Nizhegorodskaya Cellular Communications", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Purchased by Tele2" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "04", + "brand": "Sibchallenge", + "operator": "Sibchallenge", + "status": "Not operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "05", + "brand": "ETK", + "operator": "Yeniseytelecom", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / CDMA 450", + "notes": "Purchased by Tele2" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "06", + "brand": "Skylink", + "operator": "CJSC Saratov System of Cellular Communications", + "status": "Not operational", + "bands": "CDMA 450", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "07", + "brand": "SMARTS", + "operator": "Zao SMARTS", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "08", + "brand": "Vainah Telecom", + "operator": "CS \"VainahTelecom\"", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "09", + "brand": "Skylink", + "operator": "Khabarovsky Cellular Phone", + "status": "Operational", + "bands": "CDMA 450", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "10", + "brand": "DTC", + "operator": "Dontelekom", + "status": "Not operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "11", + "brand": "Yota", + "operator": "Scartel", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "12", + "brand": "Baykalwestcom", + "operator": "Baykal Westcom / New Telephone Company / Far Eastern Cellular", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / CDMA 450", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "12", + "brand": "Akos", + "operator": null, + "status": "Not operational", + "bands": "GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "13", + "brand": "KUGSM", + "operator": "Kuban GSM", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "14", + "brand": "MegaFon", + "operator": "MegaFon OJSC", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / TD-LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "15", + "brand": "SMARTS", + "operator": "SMARTS Ufa, SMARTS Uljanovsk", + "status": "Not operational", + "bands": "GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "16", + "brand": "Miatel", + "operator": "Miatel", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "17", + "brand": "Utel", + "operator": "JSC Uralsvyazinform", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Former Ermak RMS" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "18", + "brand": "Osnova Telecom", + "operator": null, + "status": "Not operational", + "bands": "TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "19", + "brand": "INDIGO", + "operator": "INDIGO", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Since 19 December 2009 merged with Tele2" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "20", + "brand": "Tele2", + "operator": "Tele2", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 450 / LTE 800 / LTE 1800 / TD-LTE 2300 / TD-LTE 2500 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "21", + "brand": "GlobalTel", + "operator": "JSC \"GlobalTel\"", + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "22", + "brand": null, + "operator": "Vainakh Telecom", + "status": "Operational", + "bands": "TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "23", + "brand": "Thuraya", + "operator": "GTNT", + "status": "Operational", + "bands": "Satellite MVNO", + "notes": "Former Mobicom Novosibirsk" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "26", + "brand": "VTB Mobile", + "operator": "VTB Mobile", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "27", + "brand": "Letai", + "operator": "Tattelecom", + "status": "Operational", + "bands": "GSM 1800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "28", + "brand": "Beeline", + "operator": "Beeline", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Former EXTEL" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "29", + "brand": "Iridium", + "operator": "Iridium Communications", + "status": "Operational", + "bands": "Satellite MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "32", + "brand": "Win Mobile", + "operator": "K-Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600", + "notes": "Unapproved use in Crimea only" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "33", + "brand": "Sevmobile", + "operator": "Sevtelekom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Unapproved use in Crimea only" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "34", + "brand": "Krymtelekom", + "operator": "Krymtelekom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Unapproved use in Crimea only" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "35", + "brand": "MOTIV", + "operator": "EKATERINBURG-2000", + "status": "Operational", + "bands": "GSM 1800 / LTE 1800 / TD-LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "38", + "brand": "Tambov GSM", + "operator": "Central Telecommunication Company", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "39", + "brand": "Rostelecom", + "operator": "ROSTELECOM", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / TD-LTE 2300 / LTE 2600", + "notes": "Tele2 code 250 20 is used since acquiring" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "40", + "brand": "VTC Mobile", + "operator": "Voentelecom", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "44", + "brand": null, + "operator": "Stavtelesot / North Caucasian GSM", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "45", + "brand": "Gazprombank Mobile", + "operator": "PJSC New Mobile Communications", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "50", + "brand": "SberMobile", + "operator": "Sberbank-Telecom", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "54", + "brand": "TTK", + "operator": "Tattelecom", + "status": "Not operational", + "bands": "LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "59", + "brand": "WireFire", + "operator": "NetbyNet", + "status": "Operational", + "bands": "MVNO on Megafon base", + "notes": "Data only" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "60", + "brand": "Volna mobile", + "operator": "KTK Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600", + "notes": "Unapproved use in Crimea only" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "61", + "brand": "Intertelecom", + "operator": "Intertelecom", + "status": "Not operational", + "bands": "CDMA 800", + "notes": "Unapproved use in Crimea only" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "62", + "brand": "Tinkoff Mobile", + "operator": "Tinkoff Mobile", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "91", + "brand": "Sonic Duo", + "operator": "Sonic Duo CJSC", + "status": "Not operational", + "bands": "GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "92", + "brand": null, + "operator": "Primtelefon", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "93", + "brand": null, + "operator": "Telecom XXI", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "96", + "brand": "+7Telecom", + "operator": "K-Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600", + "notes": "Unapproved use in Zaporizhzhia and Kherson Oblast only" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "97", + "brand": "Phoenix", + "operator": "State Unitary Enterprise of DPR \"Republican Telecommunications Operator\"", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600", + "notes": "Unapproved use in Donetsk People's Republic only" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "255", + "mnc": "98", + "brand": "MKS (ex. Lugacom)", + "operator": "OOO \"MKS\"", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600", + "notes": "Unapproved use in Luhansk People's Republic only" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "99", + "brand": "Beeline", + "operator": "OJSC Vimpel-Communications", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "UMTS 2100 shut down in 2021" + }, + { + "type": "National", + "countryName": "Russian Federation", + "countryCode": "RU", + "mcc": "250", + "mnc": "811", + "brand": null, + "operator": "Votek Mobile", + "status": "Not operational", + "bands": "AMPS / DAMPS / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "San Marino", + "countryCode": "SM", + "mcc": "292", + "mnc": "01", + "brand": "PRIMA", + "operator": "San Marino Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Serbia", + "countryCode": "RS", + "mcc": "220", + "mnc": "01", + "brand": "Yettel", + "operator": "Telenor Serbia", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": "Former Telenor, 063 MOBTEL Srbija GSM, Mobi 63" + }, + { + "type": "National", + "countryName": "Serbia", + "countryCode": "RS", + "mcc": "220", + "mnc": "02", + "brand": "One", + "operator": "Telenor Montenegro", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Former Telenor, ProMonte GSM; moved to MCC 297 MNC 01 (Montenegro) on 11 November 2011" + }, + { + "type": "National", + "countryName": "Serbia", + "countryCode": "RS", + "mcc": "220", + "mnc": "03", + "brand": "mt:s", + "operator": "Telekom Srbija", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / TETRA", + "notes": null + }, + { + "type": "National", + "countryName": "Serbia", + "countryCode": "RS", + "mcc": "220", + "mnc": "04", + "brand": "T-Mobile CG", + "operator": "T-Mobile Montenegro LLC", + "status": "Not operational", + "bands": "GSM", + "notes": "Former MoNet GSM; moved to MCC 297 MNC 02 (Montenegro)" + }, + { + "type": "National", + "countryName": "Serbia", + "countryCode": "RS", + "mcc": "220", + "mnc": "05", + "brand": "A1 SRB", + "operator": "A1 Srbija d.o.o.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": "Former Vip Mobile" + }, + { + "type": "National", + "countryName": "Serbia", + "countryCode": "RS", + "mcc": "220", + "mnc": "07", + "brand": "Orion", + "operator": "Orion Telekom", + "status": "Not operational", + "bands": "CDMA 450", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Serbia", + "countryCode": "RS", + "mcc": "220", + "mnc": "09", + "brand": "Vectone Mobile", + "operator": "MUNDIO MOBILE d.o.o.", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Serbia", + "countryCode": "RS", + "mcc": "220", + "mnc": "11", + "brand": "Globaltel", + "operator": "GLOBALTEL d.o.o.", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses A1" + }, + { + "type": "National", + "countryName": "Serbia", + "countryCode": "RS", + "mcc": "220", + "mnc": "20", + "brand": "A1 SRB", + "operator": "A1 Srbija d.o.o.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Vip Mobile" + }, + { + "type": "National", + "countryName": "Serbia", + "countryCode": "RS", + "mcc": "220", + "mnc": "21", + "brand": null, + "operator": "Infrastruktura železnice Srbije a.d.", + "status": "Unknown", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "01", + "brand": "Orange", + "operator": "Orange Slovensko", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "Former Globtel" + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "02", + "brand": "Telekom", + "operator": "Slovak Telekom", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 3700 / 5G 2100", + "notes": "Former Eurotel / T-Mobile" + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "03", + "brand": "4ka", + "operator": "SWAN Mobile, a.s.", + "status": "Operational", + "bands": "LTE 1800 / TD-LTE 3500 / TD-LTE 3700 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "04", + "brand": "Telekom", + "operator": "Slovak Telekom", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": "Former T-Mobile" + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "05", + "brand": "Orange", + "operator": "Orange Slovensko", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "06", + "brand": "O2", + "operator": "O2 Slovakia", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / TD-LTE 3500 / TD-LTE 3700 / 5G 3500", + "notes": "Former Telefónica O2 Slovakia" + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "07", + "brand": "Orange", + "operator": "Orange Slovensko", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Towercom" + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "08", + "brand": "Unimobile", + "operator": "Uniphone, s.r.o.", + "status": "Testing", + "bands": "MVNO", + "notes": "Former IPfon, s.r.o." + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "09", + "brand": null, + "operator": "DSI DATA, a.s.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "10", + "brand": null, + "operator": "HMZ RÁDIOKOMUNIKÁCIE, spol. s r.o.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "50", + "brand": "Telekom", + "operator": "Slovak Telekom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Slovakia", + "countryCode": "SK", + "mcc": "231", + "mnc": "99", + "brand": "ŽSR", + "operator": "Železnice Slovenskej Republiky", + "status": "Operational", + "bands": "GSM-R", + "notes": "Railway communication and signalling" + }, + { + "type": "National", + "countryName": "Slovenia", + "countryCode": "SI", + "mcc": "293", + "mnc": "10", + "brand": null, + "operator": "SŽ - Infrastruktura, d.o.o.", + "status": "Operational", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "Slovenia", + "countryCode": "SI", + "mcc": "293", + "mnc": "11", + "brand": null, + "operator": "BeeIN d.o.o.", + "status": "Unknown", + "bands": "5G 700", + "notes": null + }, + { + "type": "National", + "countryName": "Slovenia", + "countryCode": "SI", + "mcc": "293", + "mnc": "20", + "brand": null, + "operator": "COMPATEL Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Slovenia", + "countryCode": "SI", + "mcc": "293", + "mnc": "21", + "brand": null, + "operator": "NOVATEL d.o.o.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Slovenia", + "countryCode": "SI", + "mcc": "293", + "mnc": "22", + "brand": null, + "operator": "Mobile One Ltd.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Slovenia", + "countryCode": "SI", + "mcc": "293", + "mnc": "40", + "brand": "A1 SI", + "operator": "A1 Slovenija", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500", + "notes": "Former Si.mobil" + }, + { + "type": "National", + "countryName": "Slovenia", + "countryCode": "SI", + "mcc": "293", + "mnc": "41", + "brand": "Mobitel", + "operator": "Telekom Slovenije", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 700 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2600 / 5G 3600", + "notes": "Used by IPKO network" + }, + { + "type": "National", + "countryName": "Slovenia", + "countryCode": "SI", + "mcc": "293", + "mnc": "64", + "brand": "T-2", + "operator": "T-2 d.o.o.", + "status": "Operational", + "bands": "UMTS 2100 / LTE 2100 / 5G 3600", + "notes": null + }, + { + "type": "National", + "countryName": "Slovenia", + "countryCode": "SI", + "mcc": "293", + "mnc": "70", + "brand": "Telemach", + "operator": "Tušmobil d.o.o.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 800 / LTE 1800 / LTE 2100 / 5G 700 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Slovenia", + "countryCode": "SI", + "mcc": "293", + "mnc": "86", + "brand": null, + "operator": "ELEKTRO GORENJSKA, d.d", + "status": "Unknown", + "bands": "LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "01", + "brand": "Vodafone", + "operator": "Vodafone Spain", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 700 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "02", + "brand": "Fibracat", + "operator": "Fibracat Telecom SLU", + "status": "Operational", + "bands": "TD-LTE 2600", + "notes": "Some MVNO use this MNC (Fibracat, Altecom, Aircom, Anxanet, Netports)" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "03", + "brand": "Orange", + "operator": "Orange Espagne S.A.U", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500", + "notes": "Also use MNC 33; Some MVNO use this MNC (Hualong, The Phone House Spain, CABLE movil, SUOP)" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "04", + "brand": "Yoigo", + "operator": "Xfera Moviles SA", + "status": "Operational", + "bands": "LTE 1800 / LTE 2100 / 5G 3500", + "notes": "Acquired by Grupo MÁSMÓVIL; used by MÁSMÓVIL, Yoigo, Pepephone, Euskaltel, móbilR, TeleCable and LlamaYa; roams on Orange always for 2G/3G and 4G where there is no Yoigo coverage" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "05", + "brand": "Movistar", + "operator": "Telefónica Móviles España", + "status": "Operational", + "bands": "MVNO", + "notes": "Used by resellers" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "06", + "brand": "Vodafone", + "operator": "Vodafone Spain", + "status": "Operational", + "bands": "MVNO", + "notes": "Used by resellers (e.g. Lowi - Vodafone's own low cost virtual operator, Lebara, Hits)" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "07", + "brand": "Movistar", + "operator": "Telefónica Móviles España", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2100 / 5G 3500 / 5G 26000", + "notes": "Used by Movistar and O₂ Spain - Movistar's own low cost virtual operator; UMTS to shut down 2025" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "08", + "brand": "Euskaltel", + "operator": null, + "status": "Operational", + "bands": "MVNO", + "notes": "Acquired by Grupo MÁSMÓVIL; Some MVNO use this MNC (RACC)" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "09", + "brand": "Orange", + "operator": "Orange Espagne S.A.U", + "status": "Operational", + "bands": "MVNO", + "notes": "Used by resellers" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "10", + "brand": null, + "operator": "ZINNIA TELECOMUNICACIONES, S.L.U.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Operadora de Telecomunicaciones Opera SL" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "11", + "brand": null, + "operator": "TELECOM CASTILLA-LA MANCHA, S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Orange (Orange Espagne S.A.U)" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "12", + "brand": null, + "operator": "VENUS MOVIL, S.L. UNIPERSONAL", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Contacta Servicios Avanzados de Telecomunicaciones SL; SAC CONVERGENT AGGREGATION SERVICES" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "13", + "brand": null, + "operator": "SYMA MOBILE ESPAÑA, S.L.", + "status": "Not operational", + "bands": "MVNO", + "notes": "Former Incotel Ingeniera y Consultaria; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "14", + "brand": null, + "operator": "AVATEL MÓVIL, S.L.U.", + "status": "Operational", + "bands": "WiMAX", + "notes": "Former Incotel Servicioz Avanzados SL" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "15", + "brand": "BT", + "operator": "BT Group España Compañia de Servicios Globales de Telecomunicaciones S.A.U.", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "16", + "brand": "TeleCable", + "operator": "R Cable y Telecomunicaciones Galicia S.A.", + "status": "Operational", + "bands": "MVNO", + "notes": "Acquired by Euskaltel" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "17", + "brand": "Móbil R", + "operator": "R Cable y Telecomunicaciones Galicia S.A.", + "status": "Operational", + "bands": "MVNO / 5G", + "notes": "Acquired by Euskaltel; 5G for fixed wireless" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "18", + "brand": "ONO", + "operator": "Vodafone Spain", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn; acquired by Vodafone" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "19", + "brand": "Simyo", + "operator": "Orange España Virtual Sl.", + "status": "Operational", + "bands": "MVNO", + "notes": "Acquired by Orange" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "20", + "brand": "Fonyou", + "operator": "Fonyou Telecom S.L.", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "21", + "brand": "Jazztel", + "operator": "Orange Espagne S.A.U.", + "status": "Not operational", + "bands": "MVNO", + "notes": "Acquired by Orange in 2014; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "22", + "brand": "DIGI mobil", + "operator": "Best Spain Telecom", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "23", + "brand": null, + "operator": "Xfera Moviles S.A.U.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "24", + "brand": null, + "operator": "VODAFONE ESPAÑA, S.A.U.", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Eroski Móvil España, acquired by Vodafone in Feb 2018; some MVNOs use this MNC (Orbitel, Vizzavi)" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "25", + "brand": null, + "operator": "Xfera Moviles S.A.U.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Lycamobile" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "26", + "brand": null, + "operator": "Lleida Networks Serveis Telemátics, SL", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "27", + "brand": "Truphone", + "operator": "SCN Truphone, S.L.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "28", + "brand": "Murcia4G", + "operator": "Consorcio de Telecomunicaciones Avanzadas, S.A.", + "status": "Operational", + "bands": "TD-LTE 2600", + "notes": "LTE band 38" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "29", + "brand": null, + "operator": "Xfera Moviles S.A.U.", + "status": "Operational", + "bands": "TD-LTE 3500", + "notes": "Former NEO-SKY 2002, S.A." + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "30", + "brand": null, + "operator": "Compatel Limited", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "31", + "brand": null, + "operator": "Red Digital De Telecomunicaciones de las Islas Baleares, S.L.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "32", + "brand": "Tuenti", + "operator": "Telefónica Móviles España", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn, replaced by MNC 05" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "33", + "brand": null, + "operator": "Xfera Móviles, S.A.U.", + "status": "Not operational", + "bands": "WiMAX", + "notes": "Former Eurona Wireless Telecom; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "34", + "brand": null, + "operator": "Aire Networks del Mediterráneo, S.L.U.", + "status": "Operational", + "bands": "LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "35", + "brand": null, + "operator": "INGENIUM OUTSOURCING SERVICES, S.L.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "36", + "brand": null, + "operator": "ALAI OPERADOR DE TELECOMUNICACIONES, S.L", + "status": "Unknown", + "bands": "MVNO", + "notes": "Former OPEN CABLE TELECOMUNICACIONES, S.L." + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "37", + "brand": null, + "operator": "Vodafone Spain", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "38", + "brand": null, + "operator": "Telefónica Móviles España, S.A.U.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "51", + "brand": "ADIF", + "operator": "Administrador de Infraestructuras Ferroviarias", + "status": "Operational", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "700", + "brand": null, + "operator": "Iberdrola", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Spain", + "countryCode": "ES", + "mcc": "214", + "mnc": "701", + "brand": null, + "operator": "Endesa", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "01", + "brand": "Telia", + "operator": "Telia Sverige AB", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2600 / 5G 700", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "02", + "brand": "3", + "operator": "HI3G Access AB", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600 / TD-LTE 2600 / TD-5G 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "03", + "brand": "Net 1", + "operator": "Teracom AB", + "status": "Operational", + "bands": "LTE 450", + "notes": "Former Nordisk Mobiltelefon, Ice.net; CDMA 450 shut down" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "04", + "brand": "SWEDEN", + "operator": "3G Infrastructure Services AB", + "status": "Operational", + "bands": "UMTS 2100", + "notes": "Owned by Hi3G Access (3) and Telenor. Not available in major cities since the owners operate their own city networks." + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "05", + "brand": "Sweden 3G", + "operator": "Svenska UMTS-Nät AB", + "status": "Operational", + "bands": "UMTS 2100", + "notes": "Owned by Telia and Tele2. Available all over Sweden." + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "06", + "brand": "Telenor", + "operator": "Telenor Sverige AB", + "status": "Operational", + "bands": "UMTS 2100", + "notes": "Former Vodafone Sweden" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "07", + "brand": "Tele2", + "operator": "Tele2 Sverige AB", + "status": "Operational", + "bands": "UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600", + "notes": "MOCN r6 network" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "08", + "brand": "Telenor", + "operator": "Telenor Sverige AB", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Merged with Tele2 into Net4Mobility" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "09", + "brand": "Com4", + "operator": "Communication for Devices in Sweden AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former djuice (Telenor MVNO)" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "10", + "brand": "Spring Mobil", + "operator": "Tele2 Sverige AB", + "status": "Operational", + "bands": null, + "notes": "Only used on femto- and nanocells" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "11", + "brand": null, + "operator": "ComHem AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Lindholmen Science Park AB" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "12", + "brand": "Lycamobile", + "operator": "Lycamobile Sweden Limited", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "13", + "brand": null, + "operator": "Bredband2 Företag AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Alltele Företag Sverige AB, A3 Företag AB" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "14", + "brand": null, + "operator": "Tele2 Sverige AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former TDC Sverige AB (MVNO)" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "15", + "brand": null, + "operator": "Sierra Wireless Sweden AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Wireless Maingate Nordic AB" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "16", + "brand": null, + "operator": "42 Telecom AB", + "status": "Operational", + "bands": "GSM", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "17", + "brand": "Gotanet", + "operator": "Götalandsnätet AB", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "18", + "brand": null, + "operator": "Generic Mobile Systems Sweden AB", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "19", + "brand": "Vectone Mobile", + "operator": "Mundio Mobile (Sweden) Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO in Telia's network" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "20", + "brand": null, + "operator": "Sierra Wireless Messaging AB", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Wireless Maingate Messaging Services AB" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "21", + "brand": "MobiSir", + "operator": "Trafikverket ICT", + "status": "Operational", + "bands": "GSM-R 900", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "22", + "brand": null, + "operator": "EuTel AB", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "23", + "brand": null, + "operator": "Infobip Limited (UK)", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "24", + "brand": "Sweden 2G", + "operator": "Net4Mobility HB", + "status": "Operational", + "bands": "GSM 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "LTE1800 only available in major cities; owned by Telenor and Tele2." + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "25", + "brand": null, + "operator": "Monty UK Global Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Digitel Mobile Srl" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "26", + "brand": null, + "operator": "Twilio Sweden AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Beepsend AB" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "27", + "brand": null, + "operator": "GlobeTouch AB", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Fogg Mobile AB; M2M services only" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "28", + "brand": null, + "operator": "LINK Mobile A/S", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former CoolTEL Aps; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "29", + "brand": null, + "operator": "Mercury International Carrier Services AB", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "30", + "brand": null, + "operator": "NextGen Mobile Ltd.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "31", + "brand": null, + "operator": "RebTel Network AB", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former Mobimax AB; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "32", + "brand": null, + "operator": "Compatel Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "33", + "brand": null, + "operator": "Mobile Arts AB", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "34", + "brand": null, + "operator": "Trafikverket centralfunktion IT", + "status": "Unknown", + "bands": "Unknown", + "notes": "Formerly Tigo, Pro Net;" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "35", + "brand": null, + "operator": "42 Telecom LTD", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "36", + "brand": null, + "operator": "interactive digital media GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "37", + "brand": null, + "operator": "Sinch Sweden AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former CLX Networks AB" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "38", + "brand": "Voxbone", + "operator": "Voxbone mobile", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "39", + "brand": null, + "operator": "Primlight AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former iCentrex Sweden AB, Borderlight AB" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "40", + "brand": null, + "operator": "Netmore Group AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former ReWiCom Scandinavia AB, North net connect AB" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "41", + "brand": null, + "operator": "Telenor Sverige AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Shyam Telecom UK" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "42", + "brand": null, + "operator": "Telenor Connexion AB", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "43", + "brand": null, + "operator": "MobiWeb Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "44", + "brand": null, + "operator": "Telenabler AB", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Limitless Mobile AB" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "45", + "brand": null, + "operator": "Spirius AB", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "46", + "brand": "Viahub", + "operator": "SMS Provider Corp.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "47", + "brand": null, + "operator": "Viatel Sweden AB", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "48", + "brand": null, + "operator": "Tismi BV", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "49", + "brand": null, + "operator": "Telia Sverige AB", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "60", + "brand": null, + "operator": "Västra Götalandsregionen", + "status": "Unknown", + "bands": "Unknown", + "notes": "Temporary assigned until 31 December 2026; former Telefonaktiebolaget LM Ericsson" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "61", + "brand": null, + "operator": "MessageBird B.V.", + "status": "Not operational", + "bands": "Unknown", + "notes": "temporary license until 3 November 2019" + }, + { + "type": "National", + "countryName": "Sweden", + "countryCode": "SE", + "mcc": "240", + "mnc": "63", + "brand": "FTS", + "operator": "Fink Telecom Services", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "01", + "brand": "Swisscom", + "operator": "Swisscom AG", + "status": "Operational", + "bands": "UMTS 900 / LTE 700 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 2100 / 5G 3500", + "notes": "UMTS 2100 shut down Nov 2019, GSM April 2021; UMTS 900 shutdown planned for 2024" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "02", + "brand": "Sunrise", + "operator": "Sunrise UPC", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500", + "notes": "GSM shut down Jan 2023" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "03", + "brand": "Salt", + "operator": "Salt Mobile SA", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 3500", + "notes": "Former Orange; GSM shut down June 2020" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "05", + "brand": null, + "operator": "Comfone AG", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former Togewanet AG" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "06", + "brand": "SBB-CFF-FFS", + "operator": "SBB AG", + "status": "Operational", + "bands": "GSM-R 900", + "notes": "railways communication" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "07", + "brand": "IN&Phone", + "operator": "IN&Phone SA", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "MNC withdrawn, bankrupt in 2012" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "08", + "brand": "Tele4u", + "operator": "Sunrise Communications AG", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Former Tele2" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "09", + "brand": null, + "operator": "Comfone AG", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "10", + "brand": null, + "operator": "Stadt Polizei Zürich", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "11", + "brand": null, + "operator": "Swisscom Broadcast AG", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "12", + "brand": "Sunrise", + "operator": "Sunrise Communications AG", + "status": "Not operational", + "bands": null, + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "50", + "brand": null, + "operator": "3G Mobile AG", + "status": "Not operational", + "bands": "UMTS 2100", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "51", + "brand": null, + "operator": "relario AG", + "status": "Operational", + "bands": "MVNO", + "notes": "Former BebbiCell AG" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "52", + "brand": "Barablu", + "operator": "Barablu", + "status": "Not operational", + "bands": null, + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "53", + "brand": "upc cablecom", + "operator": "Sunrise UPC GmbH", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "54", + "brand": "Lycamobile", + "operator": "Lycamobile AG", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "55", + "brand": null, + "operator": "WeMobile SA", + "status": "Unknown", + "bands": null, + "notes": "SMS relay only" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "56", + "brand": null, + "operator": "SMSRelay AG", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "57", + "brand": null, + "operator": "Mitto AG", + "status": "Unknown", + "bands": null, + "notes": "SMS relay only" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "58", + "brand": "beeone", + "operator": "Beeone Communications SA", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "59", + "brand": "Vectone", + "operator": "Mundio Mobile Limited", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "60", + "brand": "Sunrise", + "operator": "Sunrise Communications AG", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former network sharing test with Salt Mobile" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "61", + "brand": null, + "operator": "Compatel Ltd.", + "status": "Not operational", + "bands": null, + "notes": "SMS relay only; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "62", + "brand": null, + "operator": "Telecom26 AG", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "63", + "brand": "FTS", + "operator": "Fink Telecom Services", + "status": "Operational", + "bands": "Unknown", + "notes": "SMS relay only" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "64", + "brand": null, + "operator": "Nth AG", + "status": "Operational", + "bands": "MVNO", + "notes": "Mobile payment solutions" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "65", + "brand": null, + "operator": "Nexphone AG", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "66", + "brand": null, + "operator": "Inovia Services SA", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "67", + "brand": null, + "operator": "Datatrade Managed AG", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "68", + "brand": null, + "operator": "Intellico AG", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "69", + "brand": null, + "operator": "MTEL Schweiz GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "70", + "brand": null, + "operator": "Tismi BV", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "98", + "brand": null, + "operator": "Etablissement Cantonal d'Assurance", + "status": "Unknown", + "bands": "Unknown", + "notes": "Pilot project" + }, + { + "type": "National", + "countryName": "Switzerland", + "countryCode": "CH", + "mcc": "228", + "mnc": "99", + "brand": null, + "operator": "Swisscom Broadcast AG", + "status": "Not operational", + "bands": null, + "notes": "Test network; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Turkey", + "countryCode": "TR", + "mcc": "286", + "mnc": "01", + "brand": "Turkcell", + "operator": "Turkcell Iletisim Hizmetleri A.S.", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Turkey", + "countryCode": "TR", + "mcc": "286", + "mnc": "02", + "brand": "Vodafone", + "operator": "Vodafone Turkey", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600", + "notes": "Formerly known as Telsim" + }, + { + "type": "National", + "countryName": "Turkey", + "countryCode": "TR", + "mcc": "286", + "mnc": "03", + "brand": "Türk Telekom", + "operator": "Türk Telekom", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600 / TD-LTE 2600", + "notes": "Former Aria, merged with Aycell to form Avea" + }, + { + "type": "National", + "countryName": "Turkey", + "countryCode": "TR", + "mcc": "286", + "mnc": "04", + "brand": "Aycell", + "operator": "Aycell", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged into Aria to form Avea" + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "01", + "brand": "Vodafone", + "operator": "PRJSC \"VF Ukraine\"", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600", + "notes": "Former UMC, MTS; CDMA 450 shut down June 2018" + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "02", + "brand": "Kyivstar", + "operator": "PRJSC \"Kyivstar\"", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600", + "notes": "Former Beeline, WellCOM, URS; taken over by Kyivstar" + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "03", + "brand": "Kyivstar", + "operator": "PRJSC \"Kyivstar\"", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / TD-LTE 2300 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "04", + "brand": "Intertelecom", + "operator": "Intertelecom LLC", + "status": "Operational", + "bands": "CDMA 800", + "notes": null + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "05", + "brand": "Kyivstar", + "operator": "PRJSC \"Kyivstar\"", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Former Golden Telecom; taken over by Kyivstar; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "06", + "brand": "lifecell", + "operator": "lifecell LLC", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600", + "notes": "Former life:) / Astelit" + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "07", + "brand": "3Mob; Lycamobile", + "operator": "Trimob LLC", + "status": "Operational", + "bands": "UMTS 2100", + "notes": "Former Utel, GSM / UMTS roaming with Vodafone" + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "08", + "brand": null, + "operator": "JSC Ukrtelecom", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC assigned in 2019 for 2 years" + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "09", + "brand": null, + "operator": "PRJSC \"Farlep-Invest\"", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC assigned in 2019 for 2 years; part of Vega Telecommunications Group" + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "10", + "brand": null, + "operator": "Atlantis Telecom LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "21", + "brand": "PEOPLEnet", + "operator": "PRJSC \"Telesystems of Ukraine\"", + "status": "Operational", + "bands": "CDMA 800", + "notes": null + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "23", + "brand": "CDMA Ukraine", + "operator": "Intertelecom LLC", + "status": "Not operational", + "bands": "CDMA 800", + "notes": "Taken over by Intertelecom; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "25", + "brand": "NEWTONE", + "operator": "PRJSC \"Telesystems of Ukraine\"", + "status": "Not operational", + "bands": "CDMA 800", + "notes": "Taken over by PEOPLEnet; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "701", + "brand": null, + "operator": "Ukrainian Special Systems", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Ukraine", + "countryCode": "UA", + "mcc": "255", + "mnc": "99", + "brand": "Phoenix; MKS (ex. Lugacom)", + "operator": "State Unitary Enterprise of DPR \"Republican Telecommunications Operator\"; OOO \"MKS\"", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 900 / LTE 1800 / LTE 2600", + "notes": "\"Donetsk People's Republic\" and \"Luhansk People's Republic\" only; MNC not officially assigned. Moved to Russia's MCC shortly after the annexation of Donetsk, Luhansk, Kherson and Zaporizhzhia oblasts." + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "00", + "brand": "BT", + "operator": "BT Group", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "01", + "brand": "Vectone Mobile", + "operator": "Mundio Mobile Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "Previously Mapesbury Communications Ltd.; uses EE network" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "02", + "brand": "O2 (UK)", + "operator": "Telefónica Europe", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / 5G 700 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "03", + "brand": "Airtel-Vodafone", + "operator": "Jersey Airtel Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Guernsey, Jersey" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "04", + "brand": "FMS Solutions Ltd", + "operator": "FMS Solutions Ltd", + "status": "Reserved", + "bands": "GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "05", + "brand": null, + "operator": "Spitfire Network Services Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former COLT Mobile Telecommunications Ltd." + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "06", + "brand": null, + "operator": "Internet Computer Bureau Limited", + "status": "Not operational", + "bands": null, + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "07", + "brand": "Vodafone UK", + "operator": "Vodafone", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Former Cable & Wireless Worldwide; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "08", + "brand": "BT OnePhone", + "operator": "BT OnePhone (UK) Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses the EE Network" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "09", + "brand": null, + "operator": "Tismi BV", + "status": "Unknown", + "bands": null, + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "10", + "brand": "O2 (UK)", + "operator": "Telefónica Europe", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / 5G 700 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "11", + "brand": "O2 (UK)", + "operator": "Telefónica Europe", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / 5G 700 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "12", + "brand": "Railtrack", + "operator": "Network Rail Infrastructure Ltd", + "status": "Operational", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "13", + "brand": "Railtrack", + "operator": "Network Rail Infrastructure Ltd", + "status": "Operational", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "14", + "brand": null, + "operator": "Link Mobility UK Ltd", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Former Hay Systems Ltd" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "15", + "brand": "Vodafone UK", + "operator": "Vodafone", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2600 / 5G 900 / 5G 2100 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "16", + "brand": "Talk Talk", + "operator": "TalkTalk Communications Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "Formerly Opal Tel Ltd; uses Vodafone network" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "17", + "brand": null, + "operator": "FleXtel Limited", + "status": "Not operational", + "bands": null, + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "18", + "brand": "Cloud9", + "operator": "Wireless Logic Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "Isle of Man network shut down" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "19", + "brand": "PMN", + "operator": "Teleware plc", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Private GSM; roaming with Vodafone" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "20", + "brand": "3", + "operator": "Hutchison 3G UK Ltd", + "status": "Operational", + "bands": "UMTS 2100 / LTE 800 / LTE 1500 / LTE 1800 / LTE 2100 / 5G 3500", + "notes": "National roaming with Orange (UK)'s 2G network" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "21", + "brand": null, + "operator": "LogicStar Ltd", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "22", + "brand": null, + "operator": "Telesign Mobile Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Routo Telecommunications Limited" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "23", + "brand": null, + "operator": "Icron Network Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "24", + "brand": "Greenfone", + "operator": "Stour Marine Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Stour Marine network" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "25", + "brand": "Truphone", + "operator": "Truphone", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Vodafone network" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "26", + "brand": "Lycamobile", + "operator": "Lycamobile UK Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses O2 Network / Telefónica Europe" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "27", + "brand": "Teleena", + "operator": "Tata Communications Move UK Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "28", + "brand": null, + "operator": "Marathon Telecom Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "Holds unused spectrum in Jersey" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "29", + "brand": "aql", + "operator": "(aq) Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "30", + "brand": "EE", + "operator": "EE", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2100 / 5G 2600 / / 5G 3500", + "notes": "Previously owned by Deutsche Telekom; used by MVNOs Asda Mobile & Virgin Mobile" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "31", + "brand": "EE", + "operator": "EE", + "status": "Allocated", + "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2100 / 5G 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "32", + "brand": "EE", + "operator": "EE", + "status": "Allocated", + "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2100 / 5G 2600 / / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "33", + "brand": "EE", + "operator": "EE", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2100 / 5G 2600 / / 5G 3500", + "notes": "Previously owned by Orange S.A." + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "34", + "brand": "EE", + "operator": "EE", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2100 / 5G 2600 / / 5G 3500", + "notes": "Previously owned by Orange S.A." + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "35", + "brand": null, + "operator": "JSC Ingenium (UK) Limited", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "36", + "brand": "Sure Mobile", + "operator": "Sure Isle of Man Ltd.", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100", + "notes": "Isle of Man; former Cable & Wireless" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "37", + "brand": null, + "operator": "Synectiv Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "38", + "brand": "Virgin Mobile", + "operator": "Virgin Media", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "39", + "brand": null, + "operator": "Gamma Telecom Holdings Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former SSE Energy Supply Limited" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "40", + "brand": null, + "operator": "Mass Response Service GmbH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "50", + "brand": "JT", + "operator": "JT Group Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Guernsey, Jersey; former Wave Telecom" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "51", + "brand": "Relish", + "operator": "UK Broadband Limited", + "status": "Operational", + "bands": "TD-LTE 3500 / TD-LTE 3700", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "52", + "brand": null, + "operator": "Shyam Telecom UK Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "53", + "brand": "Mobile-X", + "operator": "Tango Networks UK Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Limitless Mobile" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "54", + "brand": "iD Mobile", + "operator": "The Carphone Warehouse Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Three UK" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "55", + "brand": "Sure Mobile", + "operator": "Sure (Guernsey) Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Guernsey, Jersey; former Cable & Wireless" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "56", + "brand": null, + "operator": "National Cyber Security Centre", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former CESG" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "57", + "brand": null, + "operator": "Sky UK Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "58", + "brand": "Pronto GSM", + "operator": "Manx Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": "Isle of Man" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "59", + "brand": null, + "operator": "Limitless Mobile Ltd", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "70", + "brand": null, + "operator": "AMSUK Ltd.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "71", + "brand": null, + "operator": "Home Office", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "72", + "brand": "Hanhaa Mobile", + "operator": "Hanhaa Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "M2M applications" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "73", + "brand": null, + "operator": "Bluewave Communications Ltd", + "status": "Operational", + "bands": "TD-LTE 3500", + "notes": "Isle of Man" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "74", + "brand": null, + "operator": "Pareteum Europe B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "75", + "brand": null, + "operator": "Mass Response Service GmbH", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "76", + "brand": "BT", + "operator": "BT Group", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "77", + "brand": "Vodafone UK", + "operator": "Vodafone United Kingdom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "78", + "brand": "Airwave", + "operator": "Airwave Solutions Ltd", + "status": "Operational", + "bands": "TETRA", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "79", + "brand": "UKTL", + "operator": "UK Telecoms Lab", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "86", + "brand": null, + "operator": "EE", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "234", + "mnc": "88", + "brand": "telet", + "operator": "Telet Research (N.I.) Limited", + "status": "Operational", + "bands": "GSM 1800/LTE 1800/ LTE 2600/ 5G 2600/ 5G 3800", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "00", + "brand": "Vectone Mobile", + "operator": "Mundio Mobile Limited", + "status": "Unknown", + "bands": null, + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "01", + "brand": null, + "operator": "EE", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "02", + "brand": null, + "operator": "EE", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "03", + "brand": "Relish", + "operator": "UK Broadband Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "04", + "brand": null, + "operator": "University of Strathclyde", + "status": "Unknown", + "bands": "5G", + "notes": "for more info, see StrathSDR" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "06", + "brand": null, + "operator": "University of Strathclyde", + "status": "Unknown", + "bands": "5G", + "notes": "for more info, see StrathSDR" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "07", + "brand": null, + "operator": "University of Strathclyde", + "status": "Unknown", + "bands": "5G", + "notes": "for more info, see StrathSDR" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "08", + "brand": null, + "operator": "Spitfire Network Services Limited", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "77", + "brand": "BT", + "operator": "BT Group", + "status": "Unknown", + "bands": null, + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "88", + "brand": "telet", + "operator": "Telet Research (N.I.) Limited", + "status": "Operational", + "bands": "LTE / 5G", + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "91", + "brand": "Vodafone UK", + "operator": "Vodafone United Kingdom", + "status": "Unknown", + "bands": null, + "notes": "Spitfire Network Services Limited" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "92", + "brand": "Vodafone UK", + "operator": "Vodafone United Kingdom", + "status": "Not operational", + "bands": null, + "notes": "Former Cable & Wireless UK; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "94", + "brand": null, + "operator": "Hutchison 3G UK Ltd", + "status": "Unknown", + "bands": null, + "notes": null + }, + { + "type": "National", + "countryName": "United Kingdom", + "countryCode": "GB", + "mcc": "235", + "mnc": "95", + "brand": null, + "operator": "Network Rail Infrastructure Limited", + "status": "Test Network", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "Anguilla (United Kingdom)", + "countryCode": "AI", + "mcc": "365", + "mnc": "010", + "brand": null, + "operator": "Digicel", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Anguilla (United Kingdom)", + "countryCode": "AI", + "mcc": "365", + "mnc": "840", + "brand": "FLOW", + "operator": "Cable & Wireless", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Antigua and Barbuda", + "countryCode": "AG", + "mcc": "344", + "mnc": "030", + "brand": "APUA", + "operator": "Antigua Public Utilities Authority", + "status": "Operational", + "bands": "GSM 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Antigua and Barbuda", + "countryCode": "AG", + "mcc": "344", + "mnc": "050", + "brand": "Digicel", + "operator": "Antigua Wireless Ventures Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1900 / UMTS 850 / LTE 700", + "notes": "LTE band 17" + }, + { + "type": "National", + "countryName": "Antigua and Barbuda", + "countryCode": "AG", + "mcc": "344", + "mnc": "920", + "brand": "FLOW", + "operator": "Cable & Wireless Caribbean Cellular (Antigua) Limited", + "status": "Operational", + "bands": "GSM 850 / GSM 1800 / GSM 1900 / UMTS 850 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Antigua and Barbuda", + "countryCode": "AG", + "mcc": "344", + "mnc": "930", + "brand": null, + "operator": "AT&T Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Aruba (Kingdom of the Netherlands)", + "countryCode": "AW", + "mcc": "363", + "mnc": "01", + "brand": "SETAR", + "operator": "Servicio di Telecomunicacion di Aruba", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / GSM 1900 / UMTS 2100 / LTE 1800 / TDMA 800", + "notes": null + }, + { + "type": "National", + "countryName": "Aruba (Kingdom of the Netherlands)", + "countryCode": "AW", + "mcc": "363", + "mnc": "02", + "brand": "Digicel", + "operator": "Digicel Aruba", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Bahamas", + "countryCode": "BS", + "mcc": "364", + "mnc": "39", + "brand": "BTC", + "operator": "The Bahamas Telecommunications Company Ltd (BaTelCo)", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700 / LTE 1700", + "notes": "LTE band 17 and 4" + }, + { + "type": "National", + "countryName": "Bahamas", + "countryCode": "BS", + "mcc": "364", + "mnc": "49", + "brand": "Aliv", + "operator": "Cable Bahamas Ltd", + "status": "Operational", + "bands": "UMTS 850 / LTE 700 / LTE 1700", + "notes": "Former NewCo2015; LTE bands 13 and 4; license also covers Band 2" + }, + { + "type": "National", + "countryName": "Barbados", + "countryCode": "BB", + "mcc": "342", + "mnc": "600", + "brand": "FLOW", + "operator": "LIME (formerly known as Cable & Wireless)", + "status": "Operational", + "bands": "GSM 1900 / UMTS 850 / LTE 850 / LTE 1900", + "notes": "LTE bands 5 / 2" + }, + { + "type": "National", + "countryName": "Barbados", + "countryCode": "BB", + "mcc": "342", + "mnc": "646", + "brand": null, + "operator": "KW Telecommunications Inc.", + "status": "Not operational", + "bands": "LTE 700", + "notes": "LTE band 13" + }, + { + "type": "National", + "countryName": "Barbados", + "countryCode": "BB", + "mcc": "342", + "mnc": "750", + "brand": "Digicel", + "operator": "Digicel (Barbados) Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1900", + "notes": "LTE bands 17 / 2" + }, + { + "type": "National", + "countryName": "Barbados", + "countryCode": "BB", + "mcc": "342", + "mnc": "800", + "brand": "Ozone", + "operator": "Ozone Wireless Inc.", + "status": "Not operational", + "bands": "LTE 700", + "notes": "LTE band 13; MNC withdrawn; shut down July 2019" + }, + { + "type": "National", + "countryName": "Barbados", + "countryCode": "BB", + "mcc": "342", + "mnc": "820", + "brand": null, + "operator": "Neptune Communications Inc.", + "status": "Not operational", + "bands": "LTE 700", + "notes": "LTE band 14; former Sunbeach Communications" + }, + { + "type": "National", + "countryName": "Bermuda", + "countryCode": "BM", + "mcc": "310", + "mnc": "59", + "brand": "Cellular One", + "operator": null, + "status": "Operational", + "bands": "CDMA", + "notes": "uses USA MCC" + }, + { + "type": "National", + "countryName": "Bermuda", + "countryCode": "BM", + "mcc": "338", + "mnc": "050", + "brand": "Digicel Bermuda", + "operator": null, + "status": "Operational", + "bands": "GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700", + "notes": "uses Jamaica MCC" + }, + { + "type": "National", + "countryName": "Bermuda", + "countryCode": "BM", + "mcc": "350", + "mnc": "00", + "brand": "One", + "operator": "Bermuda Digital Communications Ltd.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 850 / LTE 700", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "Bermuda", + "countryCode": "BM", + "mcc": "350", + "mnc": "007", + "brand": null, + "operator": "Paradise Mobile", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Bermuda", + "countryCode": "BM", + "mcc": "350", + "mnc": "01", + "brand": "Digicel Bermuda", + "operator": "Telecommunications (Bermuda & West Indies) Ltd", + "status": "Reserved", + "bands": "GSM 1900", + "notes": "uses Jamaica MNC/MCC (338-050)" + }, + { + "type": "National", + "countryName": "Bermuda", + "countryCode": "BM", + "mcc": "350", + "mnc": "02", + "brand": "Mobility", + "operator": "M3 Wireless", + "status": "Not operational", + "bands": "GSM 1900 / UMTS", + "notes": "Merged with CellOne in 2011" + }, + { + "type": "National", + "countryName": "Bermuda", + "countryCode": "BM", + "mcc": "350", + "mnc": "05", + "brand": null, + "operator": "Telecom Networks", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Bermuda", + "countryCode": "BM", + "mcc": "350", + "mnc": "11", + "brand": null, + "operator": "Deltronics", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Bermuda", + "countryCode": "BM", + "mcc": "350", + "mnc": "15", + "brand": null, + "operator": "FKB Net Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "British Virgin Islands (United Kingdom)", + "countryCode": "VG", + "mcc": "348", + "mnc": "170", + "brand": "FLOW", + "operator": "Cable & Wireless", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700 / LTE 1900", + "notes": null + }, + { + "type": "National", + "countryName": "British Virgin Islands (United Kingdom)", + "countryCode": "VG", + "mcc": "348", + "mnc": "370", + "brand": null, + "operator": "BVI Cable TV Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "British Virgin Islands (United Kingdom)", + "countryCode": "VG", + "mcc": "348", + "mnc": "570", + "brand": "CCT Boatphone", + "operator": "Caribbean Cellular Telephone", + "status": "Operational", + "bands": "GSM 900 / GSM 1900 / UMTS 850 / LTE 900 / LTE 1900", + "notes": null + }, + { + "type": "National", + "countryName": "British Virgin Islands (United Kingdom)", + "countryCode": "VG", + "mcc": "348", + "mnc": "770", + "brand": "Digicel", + "operator": "Digicel (BVI) Limited", + "status": "Operational", + "bands": "GSM 1800 / GSM 1900 / UMTS 1900 / LTE 700 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "100", + "brand": "dotmobile", + "operator": "Data on Tap Inc.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "130", + "brand": "Xplore", + "operator": "Xplore Inc.", + "status": "Operational", + "bands": "TD-LTE 3500 / WiMAX / 5G 3500", + "notes": "Former Xplornet" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "131", + "brand": "Xplore", + "operator": "Xplore Inc.", + "status": "Operational", + "bands": "TD-LTE 3500 / WiMAX / 5G 3500", + "notes": "Former Xplornet" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "140", + "brand": "Fibernetics", + "operator": "Fibernetics Corp.", + "status": "Not operational", + "bands": "LTE 1900", + "notes": "Ontario" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "150", + "brand": null, + "operator": "Cogeco Connexion Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "151", + "brand": null, + "operator": "Cogeco Connexion Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "152", + "brand": null, + "operator": "Cogeco Connexion Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "220", + "brand": "Telus Mobility, Koodo Mobile, Public Mobile", + "operator": "Telus Mobility", + "status": "Operational", + "bands": "UMTS 850 / UMTS 1900 / LTE 1700 / LTE 2600 / 5G 1700 / 5G 3500", + "notes": "Used in IMSI to identify Telus subscribers on shared network 302-880" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "221", + "brand": "Telus", + "operator": "Telus Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "222", + "brand": "Telus", + "operator": "Telus Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "230", + "brand": null, + "operator": "ISP Telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "250", + "brand": "ALO", + "operator": "ALO Mobile Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "270", + "brand": "EastLink", + "operator": "Bragg Communications", + "status": "Operational", + "bands": "UMTS 1700 / LTE 700 / LTE 1700 / 5G 600", + "notes": "Nova Scotia and PEI; LTE bands 13, 4" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "290", + "brand": "Airtel Wireless", + "operator": "Airtel Wireless", + "status": "Not operational", + "bands": "iDEN 900", + "notes": "Calgary, AB; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "300", + "brand": "ECOTEL", + "operator": "Ecotel inc.", + "status": "Operational", + "bands": "LTE 700 / LTE 850 / LTE 2600", + "notes": "private LTE networks" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "310", + "brand": "ECOTEL", + "operator": "Ecotel inc.", + "status": "Operational", + "bands": "LTE 700 / LTE 850 / LTE 2600", + "notes": "private LTE networks" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "320", + "brand": "Rogers Wireless", + "operator": "Rogers Communications", + "status": "Operational", + "bands": "UMTS 1700", + "notes": "Former Mobilicity" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "330", + "brand": null, + "operator": "Blue Canada Wireless Inc.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "340", + "brand": "Execulink", + "operator": "Execulink", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "350", + "brand": null, + "operator": "Naskapi Imuun Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former FIRST Networks" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "360", + "brand": "MiKe", + "operator": "Telus Mobility", + "status": "Not operational", + "bands": "iDEN 800", + "notes": "iDEN shut down January 2016" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "361", + "brand": "Telus", + "operator": "Telus Mobility", + "status": "Not operational", + "bands": "CDMA 800 / CDMA 1900", + "notes": "CDMA shut down 31 May 2017; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "370", + "brand": "Fido", + "operator": "Fido Solutions (Rogers Wireless)", + "status": "Operational", + "bands": "MVNO", + "notes": "former Microcell Telecommunications" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "380", + "brand": "Keewaytinook Mobile", + "operator": "Keewaytinook Okimakanak Mobile", + "status": "Operational", + "bands": "UMTS 850 / UMTS 1900", + "notes": "Former Dryden Mobility" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "390", + "brand": "DMTS", + "operator": "Dryden Mobility", + "status": "Not operational", + "bands": "Unknown", + "notes": "Acquired by Tbaytel in 2012; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "420", + "brand": "ABC", + "operator": "A.B.C. Allen Business Communications Ltd.", + "status": "Operational", + "bands": "TD-LTE 3500", + "notes": "British Columbia" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "480", + "brand": "Qiniq", + "operator": "SSi Connexions", + "status": "Operational", + "bands": "GSM 1900 / LTE 2600", + "notes": "Nunavut" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "490", + "brand": "Freedom Mobile", + "operator": "Shaw Communications", + "status": "Operational", + "bands": "UMTS 1700 / LTE 700 / LTE 1700 / LTE 2600", + "notes": "Former Wind Mobile; LTE bands 4, 7, 13, 66" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "491", + "brand": "Freedom Mobile", + "operator": "Shaw Communications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "500", + "brand": "Videotron", + "operator": "Videotron", + "status": "Operational", + "bands": "UMTS 1700 / LTE 700 / LTE 1700 / 5G 600 / 5G 1700 / 5G 2600", + "notes": "LTE bands 13, 4; 5G bands n71, n66, n7" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "510", + "brand": "Videotron", + "operator": "Videotron", + "status": "Operational", + "bands": "UMTS 1700 / LTE 700 / LTE 1700 / 5G 600 / 5G 1700 / 5G 2600", + "notes": "LTE bands 13, 4" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "520", + "brand": "Rogers (Vidéotron MOCN)", + "operator": "Videotron", + "status": "Operational", + "bands": "Unknown", + "notes": "Used by Vidéotron on Rogers RAN with MOCN" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "530", + "brand": "Keewaytinook Mobile", + "operator": "Keewaytinook Okimakanak Mobile", + "status": "Operational", + "bands": "GSM", + "notes": "Northwestern Ontario; also spelled Keewatinook Okimacinac" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "540", + "brand": null, + "operator": "Rovvr Communications Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "550", + "brand": null, + "operator": "Star Solutions International Inc.", + "status": "Unknown", + "bands": "LTE?", + "notes": "Private LTE" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "560", + "brand": "Lynx Mobility", + "operator": "Lynx Mobility", + "status": "Not operational", + "bands": "CDMA / GSM", + "notes": "Northern Quebec, Nunavut, Labrador; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "570", + "brand": null, + "operator": "Ligado Networks Corp.", + "status": "Unknown", + "bands": "Satellite", + "notes": "Former LightSquared" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "590", + "brand": "Quadro Mobility", + "operator": "Quadro Communications Co-op", + "status": "Operational", + "bands": "Unknown", + "notes": "Southwestern Ontario" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "600", + "brand": null, + "operator": "Iristel", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "610", + "brand": "Bell Mobility", + "operator": "Bell Mobility", + "status": "Operational", + "bands": "UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 1900 / LTE 2600 / 5G 1700 / 5G 3500", + "notes": "Used in IMSI to identify Bell subscribers on shared network 302-880; LTE bands 17, 29, 4, 2, 7" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "620", + "brand": "ICE Wireless", + "operator": "ICE Wireless", + "status": "Operational", + "bands": "UMTS 850 / GSM 1900 / LTE 850 / LTE 1900", + "notes": "Northern Canada" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "630", + "brand": "Aliant Mobility", + "operator": "Bell Aliant", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "640", + "brand": "Bell", + "operator": "Bell Mobility", + "status": "Not operational", + "bands": "CDMA 800 / CDMA 1900", + "notes": "CDMA shut down in April 2019" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "650", + "brand": "TBaytel", + "operator": "Thunder Bay Telephone", + "status": "Operational", + "bands": "UMTS 850 / UMTS 1900 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "652", + "brand": null, + "operator": "BC Tel Mobility (Telus)", + "status": "Not operational", + "bands": "CDMA2000", + "notes": "CDMA shut down 31 May 2017; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "653", + "brand": "Telus", + "operator": "Telus Mobility", + "status": "Not operational", + "bands": "CDMA 800 / CDMA 1900", + "notes": "CDMA shut down 31 May 2017; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "655", + "brand": "MTS", + "operator": "Bell MTS", + "status": "Not operational", + "bands": "CDMA 800 / CDMA 1900", + "notes": "former Manitoba Telephone System; CDMA shut down 30 Apr 2019; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "656", + "brand": "TBay", + "operator": "Thunder Bay Telephone Mobility", + "status": "Not operational", + "bands": "CDMA", + "notes": "CDMA shut down 1 October 2014; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "657", + "brand": "Telus", + "operator": "Telus Mobility", + "status": "Not operational", + "bands": "CDMA 800 / CDMA 1900", + "notes": "CDMA shut down 31 May 2017; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "660", + "brand": "MTS", + "operator": "Bell MTS", + "status": "Operational", + "bands": "UMTS 850 / UMTS 1900 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "670", + "brand": "CityTel Mobility", + "operator": "CityWest", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "680", + "brand": "SaskTel", + "operator": "SaskTel Mobility", + "status": "Operational", + "bands": "TD-LTE 2600", + "notes": "CDMA 850 shut down 5 July 2017" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "681", + "brand": "SaskTel", + "operator": "SaskTel Mobility", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "690", + "brand": "Bell", + "operator": "Bell Mobility", + "status": "Operational", + "bands": "UMTS 850 / UMTS 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "701", + "brand": null, + "operator": "MB Tel Mobility", + "status": "Not operational", + "bands": "CDMA2000", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "702", + "brand": null, + "operator": "MT&T Mobility (Aliant)", + "status": "Not operational", + "bands": "CDMA2000", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "703", + "brand": null, + "operator": "New Tel Mobility (Aliant)", + "status": "Not operational", + "bands": "CDMA2000", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "710", + "brand": "Globalstar", + "operator": null, + "status": "Operational", + "bands": "Satellite CDMA", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "720", + "brand": "Rogers Wireless", + "operator": "Rogers Communications", + "status": "Operational", + "bands": "UMTS 850 / LTE 600 / LTE 700 / LTE 850 / LTE 1700 / LTE 1900 / LTE 2600 / 5G 600 / 5G 1700 / TD-5G 2600 / 5G 3500", + "notes": "former Rogers AT&T Wireless; LTE bands 2, 4, 5, 7, 12, 17, 25, 66, 71; 5G bands n38, n41, n66, n71, n78; GSM 1900 / UMTS 1900 was shut down 7 June 2021, GSM 850 was shut down on 31 Dec 2021" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "721", + "brand": "Rogers Wireless", + "operator": "Rogers Communications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "730", + "brand": "TerreStar Solutions", + "operator": "TerreStar Networks", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "740", + "brand": "Shaw Telecom", + "operator": "Shaw Communications", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "750", + "brand": "SaskTel", + "operator": "SaskTel Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "760", + "brand": "Public Mobile", + "operator": "Telus Mobility", + "status": "Operational", + "bands": "MVNO", + "notes": "Acquired by Telus, CDMA network shut down 2014" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "770", + "brand": "TNW Wireless", + "operator": "TNW Wireless Inc.", + "status": "Operational", + "bands": "UMTS 850", + "notes": "Former Rural Com; national coverage based on iPCS technology and Wi-Nodes" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "780", + "brand": "SaskTel", + "operator": "SaskTel Mobility", + "status": "Operational", + "bands": "UMTS 850 / UMTS 1900 / LTE 600 / LTE 700 / LTE 850 / LTE 1700 / 5G 1700", + "notes": "Saskatchewan" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "781", + "brand": "SaskTel", + "operator": "SaskTel Mobility", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "790", + "brand": null, + "operator": "NetSet Communications", + "status": "Operational", + "bands": "WiMAX / TD-LTE 3500", + "notes": "Manitoba" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "820", + "brand": "Rogers Wireless", + "operator": "Rogers Communications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "848", + "brand": null, + "operator": "Vocom International Telecommunications, Inc", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "860", + "brand": "Telus", + "operator": "Telus Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "880", + "brand": "Bell / Telus / SaskTel", + "operator": "Shared Telus, Bell, and SaskTel", + "status": "Operational", + "bands": "UMTS 850 / UMTS 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "910", + "brand": null, + "operator": "Halton Regional Police Service", + "status": "Unknown", + "bands": "Unknown", + "notes": "Reserved" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "920", + "brand": "Rogers Wireless", + "operator": "Rogers Communications", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "940", + "brand": "Wightman Mobility", + "operator": "Wightman Telecom", + "status": "Operational", + "bands": "UMTS 850 / UMTS 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "990", + "brand": null, + "operator": "Ericsson Canada", + "status": "Unknown", + "bands": "Unknown", + "notes": "For testing" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "991", + "brand": null, + "operator": "Halton Regional Police Service", + "status": "Unknown", + "bands": "Unknown", + "notes": "For testing" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "996", + "brand": null, + "operator": "Powertech Labs", + "status": "Unknown", + "bands": "Unknown", + "notes": "For testing" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "997", + "brand": null, + "operator": "Powertech Labs", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Canada", + "countryCode": "CA", + "mcc": "302", + "mnc": "998", + "brand": null, + "operator": "Institut de Recherche d’Hydro-Québec", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Powertech Labs; for testing" + }, + { + "type": "National", + "countryName": "Cayman Islands (United Kingdom)", + "countryCode": "KY", + "mcc": "338", + "mnc": "05", + "brand": "Digicel", + "operator": "Digicel Cayman Ltd.", + "status": "Operational", + "bands": "UMTS 2100 / LTE 700 / LTE 1800", + "notes": "LTE bands 13 / 3; GSM shut down July 2020" + }, + { + "type": "National", + "countryName": "Cayman Islands (United Kingdom)", + "countryCode": "KY", + "mcc": "346", + "mnc": "001", + "brand": "Logic", + "operator": "WestTel Ltd.", + "status": "Operational", + "bands": "LTE 2500", + "notes": "LTE band 41; fixed wireless access" + }, + { + "type": "National", + "countryName": "Cayman Islands (United Kingdom)", + "countryCode": "KY", + "mcc": "346", + "mnc": "140", + "brand": "FLOW", + "operator": "Cable & Wireless (Cayman Islands) Limited", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700 / LTE 1900", + "notes": "LTE bands 17 / 2" + }, + { + "type": "National", + "countryName": "Cayman Islands (United Kingdom)", + "countryCode": "KY", + "mcc": "346", + "mnc": "050", + "brand": "Digicel", + "operator": "Digicel Cayman Ltd.", + "status": "Reserved", + "bands": null, + "notes": "Uses Jamaica MCC" + }, + { + "type": "National", + "countryName": "Cuba", + "countryCode": "CU", + "mcc": "368", + "mnc": "01", + "brand": "CUBACEL", + "operator": "Empresa de Telecomunicaciones de Cuba, SA", + "status": "Operational", + "bands": "GSM 900 / GSM 850 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100", + "notes": "GSM 850 only available in limited areas (Havana, Varadero, Trinidad and Cayo Coco)" + }, + { + "type": "National", + "countryName": "Dominica", + "countryCode": "DM", + "mcc": "366", + "mnc": "020", + "brand": "Digicel", + "operator": "Digicel Group Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1900 / UMTS 900 / UMTS 1900 / LTE 700", + "notes": "Former Orange Dominica" + }, + { + "type": "National", + "countryName": "Dominica", + "countryCode": "DM", + "mcc": "366", + "mnc": "110", + "brand": "FLOW", + "operator": "Cable & Wireless", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Dominican Republic", + "countryCode": "DO", + "mcc": "370", + "mnc": "01", + "brand": "Altice", + "operator": "Altice Group", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / GSM 1900 / UMTS 900 / LTE 850 / LTE 900 / LTE 1700 / LTE 1900 / 5G 3500", + "notes": "Former Orange Dominicana" + }, + { + "type": "National", + "countryName": "Dominican Republic", + "countryCode": "DO", + "mcc": "370", + "mnc": "02", + "brand": "Claro", + "operator": "Compañía Dominicana de Teléfonos", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1700 / LTE 1900 / LTE 2600 / 5G 3500", + "notes": "CDMA 1900 shut down in 2014" + }, + { + "type": "National", + "countryName": "Dominican Republic", + "countryCode": "DO", + "mcc": "370", + "mnc": "03", + "brand": "Altice", + "operator": "Altice Group", + "status": "Operational", + "bands": "AMPS / CDMA 850", + "notes": "Former Tricom, S.A, 1900 MHz spectrum returned to regulator" + }, + { + "type": "National", + "countryName": "Dominican Republic", + "countryCode": "DO", + "mcc": "370", + "mnc": "04", + "brand": "Viva", + "operator": "Trilogy Dominicana, S.A.", + "status": "Operational", + "bands": "CDMA 1900 / GSM 1900 / UMTS 1900 / LTE 1700", + "notes": "Former Centennial Dominicana" + }, + { + "type": "National", + "countryName": "Dominican Republic", + "countryCode": "DO", + "mcc": "370", + "mnc": "05", + "brand": "Wind", + "operator": "WIND Telecom, S.A", + "status": "Operational", + "bands": "TD-LTE 2600", + "notes": "LTE band 38" + }, + { + "type": "National", + "countryName": "French Antilles (France)", + "countryCode": "BL/GF/GP/MF/MQ", + "mcc": "340", + "mnc": "01", + "brand": "Orange", + "operator": "Orange Caraïbe Mobiles", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "Guadeloupe, French Guiana, Martinique, Saint Barthélemy, Saint Martin" + }, + { + "type": "National", + "countryName": "French Antilles (France)", + "countryCode": "BL/GF/GP/MF/MQ", + "mcc": "340", + "mnc": "02", + "brand": "SFR Caraïbe", + "operator": "Outremer Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Guadeloupe, French Guiana, Martinique; former Only" + }, + { + "type": "National", + "countryName": "French Antilles (France)", + "countryCode": "BL/GF/GP/MF/MQ", + "mcc": "340", + "mnc": "03", + "brand": "FLOW", + "operator": "UTS Caraïbe", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS / LTE 1800", + "notes": "Saint Barthélemy, Saint Martin; former Telcell" + }, + { + "type": "National", + "countryName": "French Antilles (France)", + "countryCode": "BL/GF/GP/MF/MQ", + "mcc": "340", + "mnc": "04", + "brand": "Free", + "operator": "Free Caraïbe", + "status": "Not operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "French Antilles (France)", + "countryCode": "BL/GF/GP/MF/MQ", + "mcc": "340", + "mnc": "08", + "brand": "Dauphin", + "operator": "Dauphin Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS / LTE", + "notes": "Saint Barthélemy, Saint Martin" + }, + { + "type": "National", + "countryName": "French Antilles (France)", + "countryCode": "BL/GF/GP/MF/MQ", + "mcc": "340", + "mnc": "09", + "brand": "Free", + "operator": "Free Caraïbe", + "status": "Upcoming", + "bands": "UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "French Antilles (France)", + "countryCode": "BL/GF/GP/MF/MQ", + "mcc": "340", + "mnc": "10", + "brand": null, + "operator": "Guadeloupe Téléphone Mobile", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "French Antilles (France)", + "countryCode": "BL/GF/GP/MF/MQ", + "mcc": "340", + "mnc": "11", + "brand": null, + "operator": "Guyane Téléphone Mobile", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "French Antilles (France)", + "countryCode": "BL/GF/GP/MF/MQ", + "mcc": "340", + "mnc": "12", + "brand": null, + "operator": "Martinique Téléphone Mobile", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "French Antilles (France)", + "countryCode": "BL/GF/GP/MF/MQ", + "mcc": "340", + "mnc": "20", + "brand": "Digicel", + "operator": "DIGICEL Antilles Française Guyane", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800", + "notes": "Guadeloupe, French Guiana, Martinique, Saint Barthélemy, Saint Martin; former Bouygues Telecom Caraïbes" + }, + { + "type": "National", + "countryName": "Grenada", + "countryCode": "GD", + "mcc": "352", + "mnc": "030", + "brand": "Digicel", + "operator": "Digicel Grenada Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1900", + "notes": "Also uses MCC 338 MNC 05 (Jamaica)" + }, + { + "type": "National", + "countryName": "Grenada", + "countryCode": "GD", + "mcc": "352", + "mnc": "110", + "brand": "FLOW", + "operator": "Cable & Wireless Grenada Ltd.", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Guam (United States of America)", + "countryCode": "GU", + "mcc": "310", + "mnc": "032", + "brand": "IT&E Wireless", + "operator": "IT&E Overseas, Inc", + "status": "Operational", + "bands": "CDMA 1900 / GSM 1900 / UMTS 1900 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Guam (United States of America)", + "countryCode": "GU", + "mcc": "310", + "mnc": "033", + "brand": null, + "operator": "Guam Telephone Authority", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Guam (United States of America)", + "countryCode": "GU", + "mcc": "310", + "mnc": "140", + "brand": "GTA Wireless", + "operator": "Teleguam Holdings, LLC", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1700 / 5G 2500 / 5G 3500 / 5G 26000", + "notes": "Previously called Guam Telephone Authority mPulse" + }, + { + "type": "National", + "countryName": "Guam (United States of America)", + "countryCode": "GU", + "mcc": "310", + "mnc": "370", + "brand": "Docomo", + "operator": "NTT DoCoMo Pacific", + "status": "Operational", + "bands": "GSM 1900 / UMTS 850 / LTE 700 / 5G", + "notes": "Formerly HafaTEL, then Guamcell; CDMA 850 shut down in late 2010" + }, + { + "type": "National", + "countryName": "Guam (United States of America)", + "countryCode": "GU", + "mcc": "310", + "mnc": "400", + "brand": "IT&E Wireless", + "operator": "IT&E Overseas, Inc", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 700", + "notes": "Former iConnect, Wave Runner LLC" + }, + { + "type": "National", + "countryName": "Guam (United States of America)", + "countryCode": "GU", + "mcc": "310", + "mnc": "470", + "brand": "Docomo", + "operator": "NTT DoCoMo Pacific", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Guam (United States of America)", + "countryCode": "GU", + "mcc": "310", + "mnc": "480", + "brand": "IT&E Wireless", + "operator": "IT&E Overseas, Inc", + "status": "Operational", + "bands": "iDEN", + "notes": "Former iConnect, Wave Runner LLC" + }, + { + "type": "National", + "countryName": "Guam (United States of America)", + "countryCode": "GU", + "mcc": "311", + "mnc": "120", + "brand": "IT&E Wireless", + "operator": "IT&E Overseas, Inc", + "status": "Operational", + "bands": "Unknown", + "notes": "Former iConnect, Wave Runner LLC" + }, + { + "type": "National", + "countryName": "Guam (United States of America)", + "countryCode": "GU", + "mcc": "311", + "mnc": "250", + "brand": "IT&E Wireless", + "operator": "IT&E Overseas, Inc", + "status": "Operational", + "bands": "Unknown", + "notes": "Former iConnect, Wave Runner LLC" + }, + { + "type": "National", + "countryName": "Haiti", + "countryCode": "HT", + "mcc": "372", + "mnc": "01", + "brand": "Voila", + "operator": "Communication Cellulaire d'Haiti S.A.", + "status": "Not operational", + "bands": "GSM 850", + "notes": "Sold to Digicel in 2012" + }, + { + "type": "National", + "countryName": "Haiti", + "countryCode": "HT", + "mcc": "372", + "mnc": "02", + "brand": "Digicel", + "operator": "Unigestion Holding S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Haiti", + "countryCode": "HT", + "mcc": "372", + "mnc": "03", + "brand": "Natcom", + "operator": "NATCOM S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UTMS 2100 / LTE 800", + "notes": "60% owned by Viettel" + }, + { + "type": "National", + "countryName": "Jamaica", + "countryCode": "JM", + "mcc": "338", + "mnc": "020", + "brand": "FLOW", + "operator": "LIME (Cable & Wireless)", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Jamaica", + "countryCode": "JM", + "mcc": "338", + "mnc": "040", + "brand": "Caricel", + "operator": "Symbiote Investment Limited", + "status": "Not operational", + "bands": "LTE", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Jamaica", + "countryCode": "JM", + "mcc": "338", + "mnc": "05", + "brand": "Digicel", + "operator": "Digicel (Jamaica) Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1900 / UMTS 850 / LTE 700 / LTE 850 / LTE 1700 / LTE 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Jamaica", + "countryCode": "JM", + "mcc": "338", + "mnc": "070", + "brand": "Claro", + "operator": "Oceanic Digital Jamaica Limited", + "status": "Not operational", + "bands": "GSM / UMTS / CDMA", + "notes": "shut down 2012" + }, + { + "type": "National", + "countryName": "Jamaica", + "countryCode": "JM", + "mcc": "338", + "mnc": "080", + "brand": null, + "operator": "Rock Mobile Limited", + "status": "Unknown", + "bands": "LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Jamaica", + "countryCode": "JM", + "mcc": "338", + "mnc": "110", + "brand": "FLOW", + "operator": "Cable & Wireless Communications", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Jamaica", + "countryCode": "JM", + "mcc": "338", + "mnc": "180", + "brand": "FLOW", + "operator": "Cable & Wireless Communications", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 1900", + "notes": "GSM shutdown started in 2022" + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "001", + "brand": null, + "operator": "Comunicaciones Digitales Del Norte, S.A. de C.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "010", + "brand": "AT&T", + "operator": "AT&T Mexico", + "status": "Not operational", + "bands": "iDEN 800", + "notes": "Former Nextel; shut down 2017" + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "020", + "brand": "Telcel", + "operator": "América Móvil", + "status": "Operational", + "bands": "UMTS 850 / UMTS 1900 / LTE 850 / LTE 1700 / LTE 2600 / 5G", + "notes": "former Radiomóvil Dipsa; GSM shut down Sep 2020" + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "030", + "brand": "Movistar", + "operator": "Telefónica", + "status": "Operational", + "bands": "MVNO", + "notes": "former Pegaso PCS; MVNO on AT&T, own spectrum returned" + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "040", + "brand": "Unefon", + "operator": "AT&T Mexico", + "status": "Not operational", + "bands": "CDMA 850 / CDMA 1900", + "notes": "Shut down 2016" + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "050", + "brand": "AT&T / Unefon", + "operator": "AT&T Mexico", + "status": "Operational", + "bands": "UMTS 850 / UMTS 1900 / UMTS 1700 / LTE 850 / LTE 1700 / LTE 2600 / TD-LTE 2600 / 5G 2600 / 5G 3500", + "notes": "Former Iusacell; GSM shut down 2019" + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "060", + "brand": null, + "operator": "Servicios de Acceso Inalambrico, S.A. de C.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "066", + "brand": null, + "operator": "Telefonos de México, S.A.B. de C.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "070", + "brand": "Unefon", + "operator": "AT&T Mexico", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "080", + "brand": "Unefon", + "operator": "AT&T Mexico", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "090", + "brand": "AT&T", + "operator": "AT&T Mexico", + "status": "Operational", + "bands": "UMTS 1700 / LTE 850 / LTE 1700", + "notes": "Former Nextel" + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "100", + "brand": null, + "operator": "Telecomunicaciones de México", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "110", + "brand": null, + "operator": "Maxcom Telecomunicaciones, S.A.B. de C.V.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "120", + "brand": null, + "operator": "Quickly Phone, S.A. de C.V.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "130", + "brand": null, + "operator": "ALESTRA SERVICIOS MÓVILES, S.A. DE C.V.", + "status": "Operational", + "bands": "Unknown", + "notes": "Division of Axtel" + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "140", + "brand": "Red Compartida", + "operator": "Altán Redes S.A.P.I. de C.V.", + "status": "Operational", + "bands": "LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "150", + "brand": "Ultranet", + "operator": "Ultravisión, S.A. de C.V.", + "status": "Operational", + "bands": "LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "160", + "brand": null, + "operator": "Cablevisión Red, S.A. de C.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "170", + "brand": null, + "operator": "Oxio Mobile, S.A. de C.V.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "180", + "brand": "FreedomPop", + "operator": "FREEDOMPOP MÉXICO, S.A. DE C.V.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Mexico", + "countryCode": "MX", + "mcc": "334", + "mnc": "190", + "brand": "Viasat", + "operator": "VIASAT TECNOLOGÍA, S.A. DE C.V.", + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "National", + "countryName": "Montserrat (United Kingdom)", + "countryCode": "MS", + "mcc": "338", + "mnc": "05", + "brand": "Digicel", + "operator": "Digicel", + "status": "Operational", + "bands": "GSM 850", + "notes": "Uses Jamaica MCC" + }, + { + "type": "National", + "countryName": "Montserrat (United Kingdom)", + "countryCode": "MS", + "mcc": "354", + "mnc": "860", + "brand": "FLOW", + "operator": "Cable & Wireless", + "status": "Operational", + "bands": "GSM 850", + "notes": null + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "31", + "brand": null, + "operator": "Eutel N.V.", + "status": "Unknown", + "bands": "GSM", + "notes": "Sint Eustatius" + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "33", + "brand": null, + "operator": "WICC N.V.", + "status": "Unknown", + "bands": "GSM", + "notes": null + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "51", + "brand": "Telcell", + "operator": "Telcell N.V.", + "status": "Operational", + "bands": "UMTS 2100 / LTE 1800", + "notes": "Sint Maarten; GSM shut down Jan 2019" + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "54", + "brand": "ECC", + "operator": "East Caribbean Cellular", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "59", + "brand": "FLOW", + "operator": "Liberty Latin America", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Bonaire, Saba, Sint Eustatius, Sint Maarten; former Radcomm N.V., UTS; shut down Sep 2017" + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "60", + "brand": "FLOW", + "operator": "Liberty Latin America", + "status": "Operational", + "bands": "UMTS 2100 / LTE 1800", + "notes": "Bonaire, Saba, Sint Eustatius, Sint Maarten; former Radcomm N.V., UTS" + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "63", + "brand": null, + "operator": "CSC N.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "68", + "brand": "Digicel", + "operator": "Curaçao Telecom N.V.", + "status": "Operational", + "bands": "UMTS 2100 / LTE 1800", + "notes": "Curaçao" + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "69", + "brand": "Digicel", + "operator": "Curaçao Telecom N.V.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Curaçao" + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "74", + "brand": null, + "operator": "PCS N.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "76", + "brand": "Digicel", + "operator": "Antiliano Por N.V.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": "Bonaire" + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "78", + "brand": "Telbo", + "operator": "Telefonia Bonairiano N.V.", + "status": "Operational", + "bands": "UMTS 900 / LTE 1800", + "notes": "Bonaire" + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "91", + "brand": "FLOW", + "operator": "Liberty Latin America", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800", + "notes": "Curaçao; former Setel N.V., UTS" + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "94", + "brand": "Bayòs", + "operator": "Bòbò Frus N.V.", + "status": "Operational", + "bands": "TDMA PCS", + "notes": "Mobile Solutions" + }, + { + "type": "National", + "countryName": "Former Netherlands Antilles (Kingdom of the Netherlands)", + "countryCode": "BQ/CW/SX", + "mcc": "362", + "mnc": "95", + "brand": "MIO", + "operator": "E.O.C.G. Wireless", + "status": "Not operational", + "bands": "CDMA2000 850", + "notes": "former GSM Caribbean N.V.; bankrupt in 2013" + }, + { + "type": "National", + "countryName": "Northern Mariana Islands (United States of America)", + "countryCode": "MP", + "mcc": "310", + "mnc": "110", + "brand": "IT&E Wireless", + "operator": "PTI Pacifica Inc.", + "status": "Operational", + "bands": "CDMA / GSM 850 / UMTS 1900 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Northern Mariana Islands (United States of America)", + "countryCode": "MP", + "mcc": "310", + "mnc": "370", + "brand": "Docomo", + "operator": "NTT DoCoMo Pacific", + "status": "Operational", + "bands": "GSM 1900 / UMTS / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Puerto Rico", + "countryCode": "PR", + "mcc": "310", + "mnc": "017", + "brand": "ProxTel", + "operator": "North Sight Communications Inc.", + "status": "Not operational", + "bands": "iDEN", + "notes": "US MCC; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Puerto Rico", + "countryCode": "PR", + "mcc": "310", + "mnc": "260", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Operational", + "bands": "GSM 1900 / LTE 600 / LTE 1900 / LTE 1700 / 5G 600 / 5G 2500", + "notes": "US MCC; UMTS shut down July 2022" + }, + { + "type": "National", + "countryName": "Puerto Rico", + "countryCode": "PR", + "mcc": "310", + "mnc": "280", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Former Centennial Puerto Rico; US MCC" + }, + { + "type": "National", + "countryName": "Puerto Rico", + "countryCode": "PR", + "mcc": "313", + "mnc": "510", + "brand": null, + "operator": "Puerto Rico Telecom Company", + "status": "Unknown", + "bands": "Unknown", + "notes": "Uses US MCC" + }, + { + "type": "National", + "countryName": "Puerto Rico", + "countryCode": "PR", + "mcc": "313", + "mnc": "790", + "brand": "Liberty", + "operator": "Liberty Cablevision of Puerto Rico LLC", + "status": "Operational", + "bands": "LTE 700 / LTE 850 / LTE 1700 / LTE 1900 / LTE 2300 / 5G 850", + "notes": "Uses US MCC; UMTS shut down Feb 2022" + }, + { + "type": "National", + "countryName": "Puerto Rico", + "countryCode": "PR", + "mcc": "330", + "mnc": "000", + "brand": "Open Mobile", + "operator": "PR Wireless", + "status": "Operational", + "bands": "CDMA 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Puerto Rico", + "countryCode": "PR", + "mcc": "330", + "mnc": "110", + "brand": "Claro Puerto Rico", + "operator": "América Móvil", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Puerto Rico", + "countryCode": "PR", + "mcc": "330", + "mnc": "120", + "brand": "Open Mobile", + "operator": "PR Wireless", + "status": "Operational", + "bands": "LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Saint Kitts and Nevis", + "countryCode": "KN", + "mcc": "356", + "mnc": "050", + "brand": "Digicel", + "operator": "Wireless Ventures (St Kitts-Nevis) Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Saint Kitts and Nevis", + "countryCode": "KN", + "mcc": "356", + "mnc": "070", + "brand": "FLOW", + "operator": "UTS", + "status": "Operational", + "bands": null, + "notes": null + }, + { + "type": "National", + "countryName": "Saint Kitts and Nevis", + "countryCode": "KN", + "mcc": "356", + "mnc": "110", + "brand": "FLOW", + "operator": "Cable & Wireless St. Kitts & Nevis Ltd", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Saint Lucia", + "countryCode": "LC", + "mcc": "338", + "mnc": "05", + "brand": "Digicel", + "operator": "Digicel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / GSM 1900 / LTE 700", + "notes": "uses Jamaica MCC" + }, + { + "type": "National", + "countryName": "Saint Lucia", + "countryCode": "LC", + "mcc": "358", + "mnc": "110", + "brand": "FLOW", + "operator": "Cable & Wireless", + "status": "Operational", + "bands": "GSM 850 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Saint Pierre and Miquelon (France)", + "countryCode": "PM", + "mcc": "308", + "mnc": "01", + "brand": "Ameris", + "operator": "St. Pierre-et-Miquelon Télécom", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Saint Pierre and Miquelon (France)", + "countryCode": "PM", + "mcc": "308", + "mnc": "02", + "brand": "GLOBALTEL", + "operator": "GLOBALTEL", + "status": "Operational", + "bands": "GSM 900 / LTE 800", + "notes": null + }, + { + "type": "National", + "countryName": "Saint Pierre and Miquelon (France)", + "countryCode": "PM", + "mcc": "308", + "mnc": "03", + "brand": "Ameris", + "operator": "St. Pierre-et-Miquelon Télécom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Saint Vincent and the Grenadines", + "countryCode": "VC", + "mcc": "360", + "mnc": "050", + "brand": "Digicel", + "operator": "Digicel (St. Vincent and the Grenadines) Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / GSM 1900 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Saint Vincent and the Grenadines", + "countryCode": "VC", + "mcc": "360", + "mnc": "100", + "brand": "Cingular Wireless", + "operator": null, + "status": "Unknown", + "bands": "GSM 850", + "notes": null + }, + { + "type": "National", + "countryName": "Saint Vincent and the Grenadines", + "countryCode": "VC", + "mcc": "360", + "mnc": "110", + "brand": "FLOW", + "operator": "Cable & Wireless (St. Vincent & the Grenadines) Ltd", + "status": "Operational", + "bands": "GSM 850 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Trinidad and Tobago", + "countryCode": "TT", + "mcc": "374", + "mnc": "01", + "brand": "bmobile", + "operator": "TSTT", + "status": "Not operational", + "bands": "GSM 850 / GSM 1900", + "notes": "Withdrawn" + }, + { + "type": "National", + "countryName": "Trinidad and Tobago", + "countryCode": "TT", + "mcc": "374", + "mnc": "12", + "brand": "bmobile", + "operator": "TSTT", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 1900 / TD-LTE 2500 / 5G 2500", + "notes": "LTE bands 2 / 4 / 28 / 41; band 41 used for FWA" + }, + { + "type": "National", + "countryName": "Trinidad and Tobago", + "countryCode": "TT", + "mcc": "374", + "mnc": "13", + "brand": "Digicel", + "operator": "Digicel (Trinidad & Tobago) Limited", + "status": "Not operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900", + "notes": "Withdrawn" + }, + { + "type": "National", + "countryName": "Trinidad and Tobago", + "countryCode": "TT", + "mcc": "374", + "mnc": "20", + "brand": "bmobile", + "operator": "TSTT", + "status": "Not operational", + "bands": "GSM 850 / GSM 1900", + "notes": "Withdrawn" + }, + { + "type": "National", + "countryName": "Trinidad and Tobago", + "countryCode": "TT", + "mcc": "374", + "mnc": "120", + "brand": "bmobile", + "operator": "TSTT", + "status": "Not operational", + "bands": "GSM 850 / GSM 1900", + "notes": "Withdrawn" + }, + { + "type": "National", + "countryName": "Trinidad and Tobago", + "countryCode": "TT", + "mcc": "374", + "mnc": "129", + "brand": "bmobile", + "operator": "TSTT", + "status": "Not operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900", + "notes": "Withdrawn" + }, + { + "type": "National", + "countryName": "Trinidad and Tobago", + "countryCode": "TT", + "mcc": "374", + "mnc": "130", + "brand": "Digicel", + "operator": "Digicel (Trinidad & Tobago) Limited", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 1900", + "notes": "LTE bands 28 / 4 / 2" + }, + { + "type": "National", + "countryName": "Trinidad and Tobago", + "countryCode": "TT", + "mcc": "374", + "mnc": "140", + "brand": "Laqtel", + "operator": "LaqTel Ltd.", + "status": "Not operational", + "bands": "CDMA", + "notes": "Shut down 2008; Withdrawn" + }, + { + "type": "National", + "countryName": "Turks and Caicos Islands", + "countryCode": "TC", + "mcc": "338", + "mnc": "050", + "brand": "Digicel", + "operator": "Digicel (Turks & Caicos) Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1900 / LTE 700 / LTE 1700", + "notes": "uses Jamaica MCC" + }, + { + "type": "National", + "countryName": "Turks and Caicos Islands", + "countryCode": "TC", + "mcc": "376", + "mnc": "350", + "brand": "FLOW", + "operator": "Cable & Wireless West Indies Ltd (Turks & Caicos)", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Turks and Caicos Islands", + "countryCode": "TC", + "mcc": "376", + "mnc": "351", + "brand": "Digicel", + "operator": "Digicel (Turks & Caicos) Limited", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Turks and Caicos Islands", + "countryCode": "TC", + "mcc": "376", + "mnc": "352", + "brand": "FLOW", + "operator": "Cable & Wireless West Indies Ltd (Turks & Caicos)", + "status": "Not operational", + "bands": "UMTS 850", + "notes": "Former IslandCom MNC withdrawn" + }, + { + "type": "National", + "countryName": "Turks and Caicos Islands", + "countryCode": "TC", + "mcc": "376", + "mnc": "360", + "brand": "Digicel", + "operator": "Digicel (Turks & Caicos) Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former IslandCom, Cable & Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "004", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "005", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "CDMA2000 850 / CDMA2000 1900", + "notes": "CDMA shut down Dec 2022" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "006", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "010", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former MCI Inc." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "012", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Operational", + "bands": "LTE 700 / LTE 1700 / LTE 1900", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "013", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former MobileTel, Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "014", + "brand": null, + "operator": null, + "status": "Not operational", + "bands": "Unknown", + "notes": "For testing; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "015", + "brand": "Southern LINC", + "operator": "Southern Communications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "016", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Not operational", + "bands": "CDMA2000 1900 / CDMA2000 1700", + "notes": "Former Cricket Wireless; shut down in September 2015" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "017", + "brand": "ProxTel", + "operator": "North Sight Communications Inc.", + "status": "Not operational", + "bands": "iDEN", + "notes": "Puerto Rico; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "020", + "brand": "Union Wireless", + "operator": "Union Telephone Company", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "030", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 850", + "notes": "Former Centennial Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "032", + "brand": "IT&E Wireless", + "operator": "IT&E Overseas, Inc", + "status": "Operational", + "bands": "CDMA 1900 / GSM 1900 / UMTS 1900 / LTE 700", + "notes": "Guam" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "033", + "brand": null, + "operator": "Guam Telephone Authority", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "034", + "brand": "Airpeak", + "operator": "Airpeak", + "status": "Operational", + "bands": "iDEN", + "notes": "Former Nevada Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "035", + "brand": "ETEX Wireless", + "operator": "ETEX Communications, LP", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "040", + "brand": "MTA", + "operator": "Matanuska Telephone Association, Inc.", + "status": "Not operational", + "bands": "CDMA", + "notes": "Formerly Concho Cellular Telephone Co.; then Alaska, shut down 2017; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "050", + "brand": "GCI", + "operator": "Alaska Communications", + "status": "Operational", + "bands": "CDMA", + "notes": "Former ACS Wireless Inc." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "053", + "brand": "Virgin Mobile", + "operator": "T-Mobile US", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Sprint Corporation" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "054", + "brand": null, + "operator": "Alltel US", + "status": "Operational", + "bands": "Unknown", + "notes": "Uses Sprint's network" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "060", + "brand": null, + "operator": "Consolidated Telcom", + "status": "Not operational", + "bands": "1900", + "notes": "North Dakota; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "066", + "brand": "U.S. Cellular", + "operator": "U.S. Cellular", + "status": "Operational", + "bands": "GSM / CDMA", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "070", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 850", + "notes": "Former Highland Cellular, Cingular" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "080", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 1900", + "notes": "Former Corr Wireless Communications LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "090", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 1900", + "notes": "Former Edge Wireless, Cingular, Cricket Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "100", + "brand": "Plateau Wireless", + "operator": "New Mexico RSA 4 East LP", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / UMTS 1700", + "notes": "Acquired by AT&T" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "110", + "brand": "IT&E Wireless", + "operator": "PTI Pacifica Inc.", + "status": "Operational", + "bands": "CDMA / GSM 850 / UMTS 1900 / LTE 700", + "notes": "Northern Mariana Islands" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "120", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Operational", + "bands": "LTE 850 / LTE 1900", + "notes": "Former Sprint Corporation; CDMA shut down May 2022" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "130", + "brand": "Carolina West Wireless", + "operator": "Carolina West Wireless", + "status": "Operational", + "bands": "CDMA2000 1900", + "notes": "North Carolina" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "140", + "brand": "GTA Wireless", + "operator": "Teleguam Holdings, LLC", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1700", + "notes": "Previously called Guam Telephone Authority mPulse" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "150", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / UMTS 1900", + "notes": "Originally BellSouth Mobility DCS, then Cingular Wireless, then Aio Wireless, then rebranded as the new GSM Cricket Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "160", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Operational", + "bands": "GSM 1900", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "170", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 1900", + "notes": "Formerly Pacific Bell Wireless, then Cingular Wireless CA/NV known as \"Cingular Orange\"" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "180", + "brand": "West Central", + "operator": "West Central Wireless", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / UMTS 1900", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "190", + "brand": "GCI", + "operator": "Alaska Communications", + "status": "Operational", + "bands": "GSM 850", + "notes": "Dutch Harbor, Alaska" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "200", + "brand": null, + "operator": "T-Mobile", + "status": "Not operational", + "bands": "GSM 1900", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "210", + "brand": null, + "operator": "T-Mobile", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Iowa" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "220", + "brand": null, + "operator": "T-Mobile", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Kansas / Oklahoma" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "230", + "brand": null, + "operator": "T-Mobile", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Utah" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "240", + "brand": null, + "operator": "T-Mobile", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "New Mexico / Texas / Arizona" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "250", + "brand": null, + "operator": "T-Mobile", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Hawaii" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "260", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Operational", + "bands": "GSM 1900 / LTE 600 / LTE 700 / LTE 850 / LTE 1900 / LTE 1700 / LTE 2500 / 5G 600 / 5G 2500 / 5G 26000 / 5G 28000 / 5G 39000", + "notes": "Former Cook Inlet West Wireless, Voicestream; now universal USA code. Also used for Mint Mobile, Ting. UMTS shut down July 2022, GSM to shut down Apr 2024." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "270", + "brand": null, + "operator": "T-Mobile", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Formerly Powertel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "280", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Former Centennial Puerto Rico" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "290", + "brand": "nep", + "operator": "NEP Cellcorp Inc.", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Shut down 22 September 2015" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "300", + "brand": "Big Sky Mobile", + "operator": "iSmart Mobile, LLC", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Montana; former Get Mobile Inc., SmartCall, LLC; acquired by T-Mobile in 2017; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "310", + "brand": null, + "operator": "T-Mobile", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Formerly Aerial Communications" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "311", + "brand": null, + "operator": "Farmers Wireless", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "NE Alabama; acquired by AT&T in 2008" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "320", + "brand": "Cellular One", + "operator": "Smith Bagley, Inc.", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS", + "notes": "Arizona / New Mexico" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "330", + "brand": null, + "operator": "Wireless Partners, LLC", + "status": "Unknown", + "bands": "LTE", + "notes": "Former AN Subsidiary LLC, AWCC, acquired by AT&T, CDMA shut down February 2015" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "340", + "brand": "Limitless Mobile", + "operator": "Limitless Mobile, LLC", + "status": "Operational", + "bands": "GSM 1900", + "notes": "Kansas; Former High Plains Midwest LLC dba Westlink Communications, acquired by United Wireless in 2013" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "350", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "CDMA", + "notes": "Former Mohave Cellular L.P." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "360", + "brand": "Pioneer Cellular", + "operator": "Cellular Network Partnership", + "status": "Operational", + "bands": "CDMA", + "notes": "Oklahoma" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "370", + "brand": "Docomo", + "operator": "NTT DoCoMo Pacific", + "status": "Operational", + "bands": "GSM 1900 / UMTS 850 / LTE 700", + "notes": "Guam, Northern Mariana Islands; former Guamcell" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "380", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Not operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900", + "notes": "Former AT&T Wireless Services, then Cingular Wireless (known as \"Cingular Blue\")" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "390", + "brand": "Cellular One of East Texas", + "operator": "TX-11 Acquisition, LLC", + "status": "Operational", + "bands": "GSM 850 / LTE 700 / CDMA", + "notes": "Former Yorkville Telephone Cooperative" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "400", + "brand": "IT&E Wireless", + "operator": "IT&E Overseas, Inc", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 700", + "notes": "Guam; former iConnect, Wave Runner LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "410", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 850 / LTE 1700 / LTE 1900 / LTE 2300 / 5G 850 / 5G 3700 / 5G 39000", + "notes": "Formerly Cingular Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "420", + "brand": "Cincinnati Bell", + "operator": "Cincinnati Bell Wireless", + "status": "Not operational", + "bands": "GSM 1900 / UMTS 1700", + "notes": "Shut down 28 February 2015; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "430", + "brand": "GCI", + "operator": "GCI Communications Corp.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900", + "notes": "Former Alaska Digitel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "440", + "brand": null, + "operator": "Numerex", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Dobson / Cellular One; M2M only" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "450", + "brand": "Viaero", + "operator": "Viaero Wireless", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900", + "notes": "Formerly North East Cellular Inc., CellONE; Colorado / Kansas / Nebraska" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "460", + "brand": "Conecto", + "operator": "NewCore Wireless LLC", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Simmetry / TMP Corporation (shut down 30 June 2012)" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "470", + "brand": null, + "operator": "NTT DoCoMo Pacific", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Guam Wireless, nTelos, Shentel, Sprint" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "480", + "brand": "IT&E Wireless", + "operator": "IT&E Overseas, Inc", + "status": "Operational", + "bands": "iDEN", + "notes": "Guam; former Choice Phone LLC, iConnect, Wave Runner LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "490", + "brand": null, + "operator": "T-Mobile", + "status": "Operational", + "bands": "GSM 850 / GSM 1900", + "notes": "Former Triton PCS, SunCom" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "500", + "brand": "Alltel", + "operator": "Public Service Cellular Inc.", + "status": "Operational", + "bands": "CDMA2000 850 / CDMA2000 1900", + "notes": "Georgia" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "510", + "brand": "Cellcom", + "operator": "Nsight", + "status": "Unknown", + "bands": "Unknown", + "notes": "Formerly Airtel Wireless LLC (iDEN, Montana)" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "520", + "brand": "TNS", + "operator": "Transaction Network Services", + "status": "Unknown", + "bands": "Unknown", + "notes": "Formerly Verisign" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "530", + "brand": null, + "operator": "T-Mobile", + "status": "Unknown", + "bands": "Unknown", + "notes": "Formerly West Virginia Wireless, iWireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "540", + "brand": "Phoenix", + "operator": "Hilliary Communications", + "status": "Operational", + "bands": "GSM 850 / GSM 1900", + "notes": "Oklahoma" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "550", + "brand": null, + "operator": "Syniverse Technologies", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Wireless Solutions International" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "560", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Not operational", + "bands": "GSM 850", + "notes": "Former Dobson Cellular, Cingular Wireless; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "570", + "brand": null, + "operator": "Broadpoint, LLC", + "status": "Operational", + "bands": "GSM 850 / LTE 700", + "notes": "Former TX-10, LLC and Central Louisiana Cellular, LLC (MTPCS) dba Cellular One; Montana network (former Chinook Wireless) shut down in 2014" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "580", + "brand": null, + "operator": "Inland Cellular Telephone Company", + "status": "Operational", + "bands": "CDMA2000", + "notes": "Former PCS One" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "590", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "GSM 850 / GSM 1900", + "notes": "Former Western Wireless Corporation, Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "591", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "592", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "593", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "594", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "595", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "596", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "597", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "598", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "599", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "600", + "brand": "Cellcom", + "operator": "NewCell Inc.", + "status": "Operational", + "bands": "CDMA 850 / CDMA 1900", + "notes": "Wisconsin; network to be shut down Dec 2023" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "610", + "brand": null, + "operator": "Mavenir Systems Inc", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Epic PCS, shut down 30 April 2015, sold to PTCI and United Wireless;" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "620", + "brand": "Cellcom", + "operator": "Nsighttel Wireless LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": "Formerly Coleman County Telecom" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "630", + "brand": "Choice Wireless", + "operator": "Commnet Wireless LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former miSpot / Agri-Valley Communications" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "640", + "brand": null, + "operator": "Numerex", + "status": "Operational", + "bands": "MVNO", + "notes": "M2M only; formerly Einstein PCS, AirFire / Airadigm, shut down 2 September 2014" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "650", + "brand": "Jasper", + "operator": "Jasper Technologies", + "status": "Operational", + "bands": "MVNO", + "notes": "M2M only" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "660", + "brand": "T-Mobile", + "operator": null, + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Formerly DigiPhone PCS / DigiPH" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "670", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Northstar" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "680", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 850 / GSM 1900", + "notes": "Formerly Cellular One DCS, NPI Wireless, Cingular" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "690", + "brand": "Limitless Mobile", + "operator": "Limitless Mobile, LLC", + "status": "Operational", + "bands": "GSM 1900 / LTE 1900", + "notes": "Pennsylvania; former Conestoga Wireless, Keystone Wireless d/b/a Immix Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "700", + "brand": "Bigfoot Cellular", + "operator": "Cross Valiant Cellular Partnership", + "status": "Unknown", + "bands": "GSM", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "710", + "brand": "ASTAC", + "operator": "Arctic Slope Telephone Association Cooperative", + "status": "Operational", + "bands": "UMTS 850 / LTE", + "notes": "Alaska; GSM shut down January 2017" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "720", + "brand": null, + "operator": "Syniverse Technologies", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Wireless Solutions International" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "730", + "brand": "U.S. Cellular", + "operator": "U.S. Cellular", + "status": "Unknown", + "bands": "Unknown", + "notes": "Formerly Sea Mobile" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "740", + "brand": "Viaero", + "operator": "Viaero Wireless", + "status": "Operational", + "bands": "LTE 700 / LTE 1700 / LTE 1900", + "notes": "Former Telemetrix Technologies, Convey Communications Inc., Green Eagle Communications, Inc." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "750", + "brand": "Appalachian Wireless", + "operator": "East Kentucky Network, LLC", + "status": "Not operational", + "bands": "CDMA 850 / CDMA 1900", + "notes": "shut down Feb 2023" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "760", + "brand": null, + "operator": "Lynch 3G Communications Corporation", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "770", + "brand": null, + "operator": "T-Mobile", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former iWireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "780", + "brand": "Dispatch Direct", + "operator": "D. D. Inc.", + "status": "Not operational", + "bands": "iDEN", + "notes": "Former Airlink PCS, Connect Net Inc.; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "790", + "brand": "BLAZE", + "operator": "PinPoint Communications Inc.", + "status": "Not operational", + "bands": "GSM 1900 / UMTS / LTE", + "notes": "Nebraska; discontinued Dec 2019" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "800", + "brand": null, + "operator": "T-Mobile", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Formerly SOL Communications" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "810", + "brand": null, + "operator": "Pacific Lightwave Inc.", + "status": "Unknown", + "bands": "1900", + "notes": "Formerly Brazos Cellular Communications Ltd., LCFR LLC (owned by New Dimension Wireless);" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "820", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former South Canaan Cellular" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "830", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Not operational", + "bands": "WiMAX", + "notes": "Former Caprock Cellular (GSM, sold to AT&T in 2010), Clearwire, Sprint Corporation" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "840", + "brand": "telna Mobile", + "operator": "Telecom North America Mobile, Inc.", + "status": "Operational", + "bands": "MVNO", + "notes": "Formerly Edge Mobile LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "850", + "brand": "Aeris", + "operator": "Aeris Communications, Inc.", + "status": "Operational", + "bands": "MVNO", + "notes": "M2M only; is a Full MVNO despite marketing claims to the contrary" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "860", + "brand": "Five Star Wireless", + "operator": "TX RSA 15B2, LP", + "status": "Operational", + "bands": "CDMA", + "notes": "Owned by West Central Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "870", + "brand": "PACE", + "operator": "Kaplan Telephone Company", + "status": "Not operational", + "bands": "GSM 850", + "notes": "Louisiana; spectrum sold to AT&T in 2014; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "880", + "brand": "DTC Wireless", + "operator": "Advantage Cellular Systems, Inc.", + "status": "Operational", + "bands": "LTE", + "notes": "Tennessee; owned by DeKalb Telephone Cooperative; fixed wireless only, GSM 850 discontinued January 2017" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "890", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "GSM 850 / GSM 1900", + "notes": "Former Unicel / Rural Cellular Corporation" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "891", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "892", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "893", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "894", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "895", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "896", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "897", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "898", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "899", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "900", + "brand": "Mid-Rivers Wireless", + "operator": "Cable & Communications Corporation", + "status": "Operational", + "bands": "CDMA2000 850 / CDMA2000 1900", + "notes": "Montana; network to shut down 1 August 2019" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "910", + "brand": null, + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "GSM 850", + "notes": "Former First Cellular of Southern Illinois, Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "920", + "brand": null, + "operator": "James Valley Wireless, LLC", + "status": "Operational", + "bands": "CDMA", + "notes": "South Dakota; includes NVC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "930", + "brand": null, + "operator": "Copper Valley Wireless", + "status": "Operational", + "bands": "CDMA", + "notes": "Alaska" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "940", + "brand": null, + "operator": "Tyntec Inc.", + "status": "Unknown", + "bands": "MVNO", + "notes": "Formerly Poka Lambro Telecommunications Ltd., Iris Wireless LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "950", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 850", + "notes": "Former Texas RSA 1 d/b/a XIT Cellular" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "960", + "brand": "STRATA", + "operator": "UBET Wireless", + "status": "Operational", + "bands": "CDMA", + "notes": "Utah" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "970", + "brand": null, + "operator": "Globalstar", + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "980", + "brand": "Peoples Telephone", + "operator": "Texas RSA 7B3", + "status": "Not operational", + "bands": "CDMA / LTE 700", + "notes": "Texas; spectrum sold to AT&T; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "310", + "mnc": "990", + "brand": "Evolve Broadband", + "operator": "Evolve Cellular Inc.", + "status": "Operational", + "bands": "LTE 700", + "notes": "LTE band 17; former Worldcall Interconnect Inc." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "000", + "brand": "West Central Wireless", + "operator": "Mid-Tex Cellular Ltd.", + "status": "Operational", + "bands": "CDMA2000 850 / CDMA2000 1900", + "notes": "Texas" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "010", + "brand": "Chariton Valley", + "operator": "Chariton Valley Communications", + "status": "Not operational", + "bands": "CDMA2000 850 / CDMA2000 1900", + "notes": "Missouri; acquired by Verizon Wireless; CDMA shut down Dec 2022" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "012", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "CDMA2000 850 / CDMA2000 1900", + "notes": "CDMA shut down Dec 2022" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "020", + "brand": "Chariton Valley", + "operator": "Missouri RSA 5 Partnership", + "status": "Operational", + "bands": "GSM 850", + "notes": "Missouri; being acquired by Verizon Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "030", + "brand": "Indigo Wireless", + "operator": "Americell PA 3 Partnership", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850", + "notes": "Pennsylvania" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "040", + "brand": "Choice Wireless", + "operator": "Commnet Wireless", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / CDMA 2000 / UMTS", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "050", + "brand": null, + "operator": "Thumb Cellular LP", + "status": "Operational", + "bands": "CDMA2000 850", + "notes": "Michigan" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "060", + "brand": null, + "operator": "Space Data Corporation", + "status": "Operational", + "bands": "Unknown", + "notes": "Former Farmers Cellular Telephone Inc." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "070", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 850", + "notes": "Former Easterbrooke Cellular Corporation, Wisconsin RSA #7 Limited Partnership" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "080", + "brand": "Pine Cellular", + "operator": "Pine Telephone Company", + "status": "Operational", + "bands": "GSM 850 / LTE", + "notes": "Oklahoma" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "090", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 1900", + "notes": "Former Siouxland PCS, Long Lines Wireless, acquired by AT&T Dec. 2013" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "100", + "brand": null, + "operator": "Nex-Tech Wireless", + "status": "Operational", + "bands": "CDMA2000", + "notes": "Kansas; former High Plains Wireless L.P." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "110", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former High Plains Wireless L.P., Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "120", + "brand": "IT&E Wireless", + "operator": "IT&E Overseas, Inc", + "status": "Operational", + "bands": "Unknown", + "notes": "Guam; former Choice Phone LLC, iConnect, Wave Runner LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "130", + "brand": null, + "operator": "Black & Veatch", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former Cell One Amarillo (Amarillo License L.P.), Lightsquared; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "140", + "brand": "Bravado Wireless", + "operator": "Cross Telephone Company", + "status": "Operational", + "bands": "CDMA", + "notes": "Oklahoma; former MBO Wireless, Sprocket Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "150", + "brand": null, + "operator": "Wilkes Cellular", + "status": "Operational", + "bands": "GSM 850", + "notes": "Georgia" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "160", + "brand": null, + "operator": "Lightsquared L.P.", + "status": "Not operational", + "bands": "LTE", + "notes": "Former Endless Mountains Wireless (acquired by Dobson Cellular in 2005) MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "170", + "brand": null, + "operator": "Tampnet", + "status": "Operational", + "bands": "GSM 850 / LTE", + "notes": "Gulf of Mexico; former PetroCom, Broadpoint Inc." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "180", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Not operational", + "bands": "GSM 850 / UMTS 850 / UMTS 1900", + "notes": "Former Pacific Telesis, Cingular Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "190", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Cellular Properties Inc." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "200", + "brand": null, + "operator": "Dish Wireless", + "status": "Unknown", + "bands": "5G", + "notes": "Former ARINC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "210", + "brand": null, + "operator": "Telnyx LLC", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Farmers Cellular Telephone, Emery Telcom Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "220", + "brand": "U.S. Cellular", + "operator": "U.S. Cellular", + "status": "Operational", + "bands": "CDMA", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "230", + "brand": "C Spire", + "operator": "Cellular South Inc.", + "status": "Operational", + "bands": "LTE 700 / LTE 850 / LTE 1700 / LTE 1900 / TD-LTE 2500", + "notes": "CDMA shut down May 2022" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "240", + "brand": null, + "operator": "Cordova Wireless", + "status": "Operational", + "bands": "GSM / UMTS 850 / WiMAX", + "notes": "Alaska" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "250", + "brand": "IT&E Wireless", + "operator": "IT&E Overseas, Inc", + "status": "Operational", + "bands": "Unknown", + "notes": "Guam; former iConnect, Wave Runner LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "260", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Not operational", + "bands": "WiMAX", + "notes": "Former CellularOne of San Luis Obispo (sold to AT&T in 2010, Clearwire, Sprint Corporation" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "270", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "271", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "272", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "273", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "274", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "275", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "276", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "277", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "278", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "279", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "280", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "281", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "282", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "283", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "284", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "285", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "286", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "287", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "288", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "289", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "290", + "brand": "BLAZE", + "operator": "PinPoint Communications Inc.", + "status": "Not operational", + "bands": "GSM 1900 / UMTS / LTE", + "notes": "Nebraska; discontinued Dec 2020; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "300", + "brand": null, + "operator": "Nexus Communications, Inc.", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former Rutal Cellular Corporation; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "310", + "brand": "NMobile", + "operator": "Leaco Rural Telephone Company Inc.", + "status": "Not operational", + "bands": "CDMA2000", + "notes": "New Mexico; shut down June 2018" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "320", + "brand": "Choice Wireless", + "operator": "Commnet Wireless", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / CDMA 2000 / UMTS", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "330", + "brand": "Bug Tussel Wireless", + "operator": "Bug Tussel Wireless LLC", + "status": "Operational", + "bands": "GSM 1900 / LTE 1700 / WiMAX 3700", + "notes": "Wisconsin" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "340", + "brand": null, + "operator": "Illinois Valley Cellular", + "status": "Operational", + "bands": "CDMA2000 / LTE 850", + "notes": "Illinois" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "350", + "brand": "Nemont", + "operator": "Sagebrush Cellular, Inc.", + "status": "Operational", + "bands": "CDMA2000", + "notes": "Former Torrestar Networks Inc.; Montana" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "360", + "brand": null, + "operator": "Stelera Wireless", + "status": "Not operational", + "bands": "UMTS 1700", + "notes": "shut down 30 April 2013" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "370", + "brand": "GCI Wireless", + "operator": "General Communication Inc.", + "status": "Operational", + "bands": "LTE 1700", + "notes": "Former Alaska Communications" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "380", + "brand": null, + "operator": "New Dimension Wireless Ltd.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "390", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Midwest Wireless Holdings LLC, Alltel" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "400", + "brand": null, + "operator": null, + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Salmon PCS LLC, New Cingular Wireless PCS LLC; for testing" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "410", + "brand": "Chat Mobility", + "operator": "Iowa RSA No. 2 LP", + "status": "Operational", + "bands": "CDMA", + "notes": "Iowa" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "420", + "brand": "NorthwestCell", + "operator": "Northwest Missouri Cellular LP", + "status": "Operational", + "bands": "CDMA", + "notes": "Missouri" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "430", + "brand": "Chat Mobility", + "operator": "RSA 1 LP", + "status": "Unknown", + "bands": "CDMA", + "notes": "Former Cellular 29 Plus; acquired by Chat Mobility in 2009; Iowa" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "440", + "brand": null, + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "CDMA", + "notes": "Former Bluegrass Cellular; Kentucky" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "450", + "brand": "PTCI", + "operator": "Panhandle Telecommunication Systems Inc.", + "status": "Operational", + "bands": "GSM 1900 / LTE 700", + "notes": "Also known as Panhandle Telephone Cooperative, Inc.; Oklahoma" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "460", + "brand": null, + "operator": "Electric Imp Inc.", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former Fisher Wireless Services Inc.; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "470", + "brand": "Viya", + "operator": "Vitelcom Cellular Inc.", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / TD-LTE 2500", + "notes": "Former Innovative Wireless; US Virgin Islands" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "480", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Operational", + "bands": "LTE 700", + "notes": "C Block" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "481", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "LTE 700", + "notes": "C Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "482", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "LTE 700", + "notes": "C Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "483", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "LTE 700", + "notes": "C Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "484", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "LTE 700", + "notes": "C Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "485", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "LTE 700", + "notes": "C Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "486", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "LTE 700", + "notes": "C Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "487", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "LTE 700", + "notes": "C Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "488", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "LTE 700", + "notes": "C Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "489", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Not operational", + "bands": "LTE 700", + "notes": "C Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "490", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Operational", + "bands": "LTE 850 / LTE 1900 / TD-LTE 2500", + "notes": "Former Wirefree Partners LLC, acquired by Sprint in 2010; LTE bands 25, 26, 41" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "500", + "brand": null, + "operator": "Mosaic Telecom", + "status": "Not operational", + "bands": "UMTS / LTE 700 / LTE 1700", + "notes": "Former CTC Telecom Inc.; discontinued cellular service in 2016; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "510", + "brand": null, + "operator": "Ligado Networks", + "status": "Not operational", + "bands": "LTE", + "notes": "Former Benton-Lian Wireless, Lightsquared L.P." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "520", + "brand": null, + "operator": "Lightsquared L.P.", + "status": "Not operational", + "bands": "LTE", + "notes": "Former Crossroads Wireless Inc.; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "530", + "brand": "NewCore", + "operator": "NewCore Wireless LLC", + "status": "Operational", + "bands": "LTE 1900", + "notes": "Former Wireless Communications Venture" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "540", + "brand": null, + "operator": "Coeur Rochester, Inc", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Keystone Wireless, Proximiti Mobility" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "550", + "brand": "Choice Wireless", + "operator": "Commnet Wireless LLC", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / CDMA 2000 / UMTS", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "560", + "brand": "OTZ Cellular", + "operator": "OTZ Communications, Inc.", + "status": "Operational", + "bands": "GSM 850", + "notes": "Alaska" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "570", + "brand": null, + "operator": "Mediacom", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former BendBroadband, shut down 25-July-2014;" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "580", + "brand": "U.S. Cellular", + "operator": "U.S. Cellular", + "status": "Operational", + "bands": "LTE 700 / LTE 850", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "590", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former California RSA No3 Ltd Partnership d/b/a Golden State Cellular, acquired by Verizon in 2014" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "600", + "brand": "Limitless Mobile", + "operator": "Limitless Mobile, LLC", + "status": "Operational", + "bands": "LTE 1900", + "notes": "Former Cox Wireless, shut down in 2012" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "610", + "brand": "SRT Communications", + "operator": "North Dakota Network Co.", + "status": "Not operational", + "bands": "CDMA", + "notes": "North Dakota; shut down in 2017" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "620", + "brand": null, + "operator": "TerreStar Networks, Inc.", + "status": "Not operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "630", + "brand": "C Spire", + "operator": "Cellular South Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Corr Wireless Communications" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "640", + "brand": "Rock Wireless", + "operator": "Standing Rock Telecommunications", + "status": "Operational", + "bands": "LTE 700", + "notes": "A Block; covering an American Indian reservation straddling remote parts of North and South Dakota" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "650", + "brand": "United Wireless", + "operator": "United Wireless", + "status": "Operational", + "bands": "CDMA / LTE 700 / WiMAX 3700", + "notes": "Kansas" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "660", + "brand": "Metro", + "operator": "Metro by T-Mobile", + "status": "Operational", + "bands": "MVNO", + "notes": "Former MetroPCS; CDMA2000 1900 / CDMA2000 1700 shut down in 2015; LTE 1700 merged with T-Mobile US" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "670", + "brand": "Pine Belt Wireless", + "operator": "Pine Belt Cellular Inc.", + "status": "Operational", + "bands": "CDMA / LTE 700", + "notes": "Alabama" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "680", + "brand": null, + "operator": "GreenFly LLC", + "status": "Unknown", + "bands": "GSM 1900", + "notes": "Iowa" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "690", + "brand": null, + "operator": "TeleBEEPER of New Mexico", + "status": "Operational", + "bands": "paging", + "notes": "New Mexico; 850 MHz band never used" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "700", + "brand": null, + "operator": "Midwest Network Solutions Hub LLC", + "status": "Not operational", + "bands": "MVNO", + "notes": "Former TotalSolutions Telecom LLC, Aspenta International, Inc.; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "710", + "brand": null, + "operator": "Northeast Wireless Networks LLC", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "720", + "brand": null, + "operator": "MainePCS LLC", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Bankrupt in 2009" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "730", + "brand": null, + "operator": "Proximiti Mobility Inc.", + "status": "Not operational", + "bands": "GSM 850", + "notes": "Former Keystone Wireless; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "740", + "brand": null, + "operator": "Telalaska Cellular", + "status": "Operational", + "bands": "GSM 850 / LTE", + "notes": "Alaska" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "750", + "brand": "ClearTalk", + "operator": "Flat Wireless LLC", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former NetAmerica Alliance; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "760", + "brand": null, + "operator": "Edigen Inc.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "770", + "brand": null, + "operator": "Altiostar Networks, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Geneseo Communications Services Inc., Radio Mobile Access Inc." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "780", + "brand": "ASTCA", + "operator": "American Samoa Telecommunications Authority", + "status": "Operational", + "bands": "LTE 700", + "notes": "Former Cellular Network Partnership d/b/a Pioneer Cellular;" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "790", + "brand": null, + "operator": "Coleman County Telephone Cooperative, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Cellular Network Partnership d/b/a Pioneer Cellular" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "800", + "brand": null, + "operator": "Verizon Wireless", + "status": "Operational", + "bands": "LTE 700", + "notes": "Former Bluegrass Cellular; Kentucky" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "810", + "brand": null, + "operator": "Verizon Wireless", + "status": "Operational", + "bands": "LTE 700", + "notes": "Former Bluegrass Cellular; Kentucky" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "820", + "brand": null, + "operator": "Sonus Networks", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Kineto Wireless Inc." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "830", + "brand": null, + "operator": "Thumb Cellular LP", + "status": "Operational", + "bands": "LTE 700", + "notes": "Michigan" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "840", + "brand": "Cellcom", + "operator": "Nsight", + "status": "Operational", + "bands": "LTE 700 / 5G 600 / 5G 850", + "notes": "Wisconsin" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "850", + "brand": "Cellcom", + "operator": "Nsight", + "status": "Operational", + "bands": "LTE 700 / 5G 600 / 5G 850", + "notes": "Wisconsin" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "860", + "brand": "STRATA", + "operator": "Uintah Basin Electronic Telecommunications", + "status": "Operational", + "bands": "LTE 700", + "notes": "Utah" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "870", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Unknown", + "bands": "MVNO", + "notes": "Former Sprint Corporation" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "880", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Sprint Corporation" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "882", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Operational", + "bands": "Unknown", + "notes": "Former Sprint Corporation" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "890", + "brand": null, + "operator": "Globecomm Network Services Corporation", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "900", + "brand": null, + "operator": "GigSky", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "910", + "brand": "MobileNation", + "operator": "SI Wireless LLC", + "status": "Not operational", + "bands": "CDMA / LTE", + "notes": "Tennessee; shut down Jan 2020; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "920", + "brand": "Chariton Valley", + "operator": "Missouri RSA 5 Partnership", + "status": "Unknown", + "bands": "Unknown", + "notes": "Missouri; being acquired by Verizon Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "930", + "brand": null, + "operator": "Cox Communications", + "status": "Unknown", + "bands": "Unknown 3500", + "notes": "Former Cablevision Systems Corporation, Syringa Wireless (shut down Dec 2015)" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "940", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Not operational", + "bands": "WiMAX", + "notes": "Former Clearwire, Sprint Corporation" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "950", + "brand": "ETC", + "operator": "Enhanced Telecommmunications Corp.", + "status": "Operational", + "bands": "CDMA / LTE 700", + "notes": "Former Sunman Telecommunications Corp.; Indiana; fixed broadband" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "960", + "brand": "Lycamobile", + "operator": "Lycamobile USA Inc.", + "status": "Not operational", + "bands": "MVNO", + "notes": "used T-Mobile; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "970", + "brand": "Big River Broadband", + "operator": "Big River Broadband, LLC", + "status": "Operational", + "bands": "LTE 1700", + "notes": "Utilizing 20 MHz in A block" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "980", + "brand": null, + "operator": "LigTel Communications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "311", + "mnc": "990", + "brand": null, + "operator": "VTel Wireless", + "status": "Operational", + "bands": "LTE 700 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "010", + "brand": "Chariton Valley", + "operator": "Chariton Valley Communications Corporation, Inc", + "status": "Unknown", + "bands": "Unknown", + "notes": "Missouri; being acquired by Verizon Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "020", + "brand": null, + "operator": "Infrastructure Networks, LLC", + "status": "Operational", + "bands": "LTE 700", + "notes": "Focused on oil & gas industries" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "030", + "brand": "Bravado Wireless", + "operator": "Cross Wireless", + "status": "Operational", + "bands": "LTE 700", + "notes": "Oklahoma; former MBO Wireless, Sprocket Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "040", + "brand": null, + "operator": "Custer Telephone Co-op (CTCI)", + "status": "Operational", + "bands": "LTE 700", + "notes": "Idaho" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "050", + "brand": null, + "operator": "Fuego Wireless", + "status": "Not operational", + "bands": "LTE 700", + "notes": "fixed broadband; New Mexico; shut down in 2016, spectrum sold to AT&T and Infrastructure Networks; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "060", + "brand": null, + "operator": "CoverageCo", + "status": "Not operational", + "bands": "CDMA / GSM", + "notes": "Vermont MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "070", + "brand": null, + "operator": "Adams Networks Inc", + "status": "Not operational", + "bands": "LTE 700", + "notes": "C block fixed broadband; Illinois; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "080", + "brand": "SyncSouth", + "operator": "South Georgia Regional Information Technology Authority", + "status": "Operational", + "bands": "UMTS-TDD 700", + "notes": "LTE 700 planned" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "090", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Allied Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "100", + "brand": null, + "operator": "ClearSky Technologies, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "110", + "brand": null, + "operator": "Texas Energy Network LLC", + "status": "Not operational", + "bands": "LTE", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "120", + "brand": "Appalachian Wireless", + "operator": "East Kentucky Network, LLC", + "status": "Operational", + "bands": "LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "130", + "brand": "Appalachian Wireless", + "operator": "East Kentucky Network, LLC", + "status": "Operational", + "bands": "LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "140", + "brand": "Revol Wireless", + "operator": "Cleveland Unlimited, Inc.", + "status": "Not operational", + "bands": "CDMA", + "notes": "Shut down 2014, acquired by Sprint; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "150", + "brand": "NorthwestCell", + "operator": "Northwest Missouri Cellular LP", + "status": "Operational", + "bands": "LTE 700", + "notes": "Missouri" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "160", + "brand": "Chat Mobility", + "operator": "RSA1 Limited Partnership", + "status": "Operational", + "bands": "LTE 700", + "notes": "Iowa" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "170", + "brand": "Chat Mobility", + "operator": "Iowa RSA No. 2 LP", + "status": "Operational", + "bands": "LTE 700", + "notes": "Iowa" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "180", + "brand": null, + "operator": "Limitless Mobile LLC", + "status": "Operational", + "bands": "LTE 1900", + "notes": "Former Keystone Wireless LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "190", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Sprint Corporation" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "200", + "brand": null, + "operator": "Voyager Mobility LLC", + "status": "Not operational", + "bands": "MVNO", + "notes": "Shut down 2015; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "210", + "brand": null, + "operator": "Aspenta International, Inc.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "220", + "brand": "Chariton Valley", + "operator": "Chariton Valley Communications Corporation, Inc.", + "status": "Operational", + "bands": "LTE 700", + "notes": "being acquired by Verizon Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "230", + "brand": "SRT Communications", + "operator": "North Dakota Network Co.", + "status": "Not operational", + "bands": "Unknown", + "notes": "North Dakota; shut down in 2017" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "240", + "brand": "Sprint", + "operator": "Sprint Corporation", + "status": "Not operational", + "bands": "Unknown", + "notes": "Former Clearwire; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "250", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Operational", + "bands": "LTE 850 / LTE 1900 / TD-LTE 2500", + "notes": "Former Clearwire, Sprint Corporation" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "260", + "brand": null, + "operator": "WorldCell Solutions LLC", + "status": "Unknown", + "bands": "LTE 1900", + "notes": "Former NewCore, Central LTE Holdings" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "270", + "brand": "Pioneer Cellular", + "operator": "Cellular Network Partnership", + "status": "Operational", + "bands": "LTE 700", + "notes": "Oklahoma" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "280", + "brand": "Pioneer Cellular", + "operator": "Cellular Network Partnership", + "status": "Operational", + "bands": "LTE 700", + "notes": "Oklahoma" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "290", + "brand": "STRATA", + "operator": "Uintah Basin Electronic Telecommunications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "300", + "brand": "telna Mobile", + "operator": "Telecom North America Mobile, Inc.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "310", + "brand": null, + "operator": "Clear Stream Communications, LLC", + "status": "Operational", + "bands": "LTE 700", + "notes": "North Carolina; owned by Carolina West Wireless, Wilkes Communications" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "320", + "brand": null, + "operator": "RTC Communications LLC", + "status": "Operational", + "bands": "LTE 700", + "notes": "Indiana; former S and R Communications LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "330", + "brand": "Nemont", + "operator": "Nemont Communications, Inc.", + "status": "Operational", + "bands": "LTE 700", + "notes": "Montana" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "340", + "brand": "MTA", + "operator": "Matanuska Telephone Association, Inc.", + "status": "Not operational", + "bands": "LTE 700", + "notes": "Alaska; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "350", + "brand": null, + "operator": "Triangle Communication System Inc.", + "status": "Operational", + "bands": "LTE 700", + "notes": "Montana; being acquired by Verizon Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "360", + "brand": null, + "operator": "Wes-Tex Telecommunications, Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Texas" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "370", + "brand": "Choice Wireless", + "operator": "Commnet Wireless", + "status": "Operational", + "bands": "LTE", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "380", + "brand": null, + "operator": "Copper Valley Wireless", + "status": "Operational", + "bands": "LTE 700", + "notes": "Alaska" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "390", + "brand": "FTC Wireless", + "operator": "FTC Communications LLC", + "status": "Operational", + "bands": "UMTS / LTE", + "notes": "South Carolina; owned by Farmers Telephone Cooperative" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "400", + "brand": "Mid-Rivers Wireless", + "operator": "Mid-Rivers Telephone Cooperative", + "status": "Operational", + "bands": "LTE 700", + "notes": "Montana; network to shut down 1 August 2019" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "410", + "brand": null, + "operator": "Eltopia Communications, LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "420", + "brand": null, + "operator": "Nex-Tech Wireless", + "status": "Operational", + "bands": "LTE 700 / 5G 600", + "notes": "Kansas" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "430", + "brand": null, + "operator": "Silver Star Communications", + "status": "Operational", + "bands": "LTE 700", + "notes": "Wyoming; fixed wireless, CDMA shut down Dec 2022" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "440", + "brand": null, + "operator": "Kajeet, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Consolidated Telcom" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "450", + "brand": null, + "operator": "Cable & Communications Corporation", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "460", + "brand": null, + "operator": "Ketchikan Public Utilities (KPU)", + "status": "Operational", + "bands": "LTE 700", + "notes": "Alaska" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "470", + "brand": "Carolina West Wireless", + "operator": "Carolina West Wireless", + "status": "Operational", + "bands": "LTE 700", + "notes": "North Carolina" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "480", + "brand": "Nemont", + "operator": "Sagebrush Cellular, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "490", + "brand": null, + "operator": "TrustComm, Inc.", + "status": "Not operational", + "bands": "Satellite", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "500", + "brand": null, + "operator": "AB Spectrum LLC", + "status": "Not operational", + "bands": "LTE 700", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "510", + "brand": null, + "operator": "WUE Inc.", + "status": "Unknown", + "bands": "LTE", + "notes": "Nevada; CDMA shut down" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "520", + "brand": null, + "operator": "ANIN", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "530", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Operational", + "bands": "Unknown", + "notes": "Former Sprint Corporation" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "540", + "brand": null, + "operator": "Broadband In Hand LLC", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "550", + "brand": null, + "operator": "Great Plains Communications, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "560", + "brand": null, + "operator": "NHLT Inc.", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "570", + "brand": "Blue Wireless", + "operator": "Buffalo-Lake Erie Wireless Systems Co., LLC", + "status": "Not operational", + "bands": "CDMA / LTE", + "notes": "shut down July 2020" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "580", + "brand": null, + "operator": "Google LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Shuttle Wireless Solutions Inc., Bingham McCutchen LLP, Morgan, Lewis & Bockius" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "590", + "brand": "NMU", + "operator": "Northern Michigan University", + "status": "Operational", + "bands": "LTE 2600", + "notes": "EBS Band (LTE band 7)" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "600", + "brand": "Nemont", + "operator": "Sagebrush Cellular, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "610", + "brand": null, + "operator": "ShawnTech Communications", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former nTelos" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "620", + "brand": null, + "operator": "GlobeTouch Inc.", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Fogg Mobile, Inc." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "630", + "brand": null, + "operator": "NetGenuity, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "640", + "brand": "Nemont", + "operator": "Sagebrush Cellular, Inc.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "650", + "brand": null, + "operator": "Brightlink", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former 365 Wireless LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "660", + "brand": "nTelos", + "operator": "nTelos Wireless", + "status": "Not operational", + "bands": "LTE 1900", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "670", + "brand": "FirstNet", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "680", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "690", + "brand": null, + "operator": "TGS, LLC", + "status": "Operational", + "bands": "MVNO/MVNE", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "700", + "brand": null, + "operator": "Wireless Partners, LLC", + "status": "Operational", + "bands": "LTE 700", + "notes": "Maine" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "710", + "brand": null, + "operator": "Great North Woods Wireless LLC", + "status": "Operational", + "bands": "LTE", + "notes": "New Hampshire; former Wireless Partners, LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "720", + "brand": "Southern LINC", + "operator": "Southern Communications Services", + "status": "Operational", + "bands": "LTE 850", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "730", + "brand": null, + "operator": "Triangle Communication System Inc.", + "status": "Not operational", + "bands": "CDMA", + "notes": "Montana; acquired by Verizon Wireless; CDMA shut down Dec 2022" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "740", + "brand": "Locus Telecommunications", + "operator": "KDDI America, Inc.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "750", + "brand": null, + "operator": "Artemis Networks LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "760", + "brand": "ASTAC", + "operator": "Arctic Slope Telephone Association Cooperative", + "status": "Unknown", + "bands": "Unknown", + "notes": "Alaska" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "770", + "brand": "Verizon", + "operator": "Verizon Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "780", + "brand": null, + "operator": "Redzone Wireless", + "status": "Operational", + "bands": "TD-LTE 2500", + "notes": "LTE band 41; Maine" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "790", + "brand": null, + "operator": "Gila Electronics", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "800", + "brand": null, + "operator": "Cirrus Core Networks", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "810", + "brand": "BBCP", + "operator": "Bristol Bay Telephone Cooperative", + "status": "Operational", + "bands": "CDMA / LTE", + "notes": "Alaska" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "820", + "brand": null, + "operator": "Santel Communications Cooperative, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": "South Dakota" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "830", + "brand": null, + "operator": "Kings County Office of Education", + "status": "Operational", + "bands": "WiMAX", + "notes": "California" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "840", + "brand": null, + "operator": "South Georgia Regional Information Technology Authority", + "status": "Unknown", + "bands": "Unknown", + "notes": "Georgia" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "850", + "brand": null, + "operator": "Onvoy Spectrum, LLC", + "status": "Unknown", + "bands": "MVNO", + "notes": "Former Emergency Networks LLC" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "860", + "brand": "ClearTalk", + "operator": "Flat Wireless, LLC", + "status": "Not operational", + "bands": "CDMA / LTE 1900 / LTE 1700", + "notes": "Texas; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "870", + "brand": null, + "operator": "GigSky Mobile, LLC", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "880", + "brand": null, + "operator": "Albemarle County Public Schools", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "890", + "brand": null, + "operator": "Circle Gx", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "900", + "brand": "ClearTalk", + "operator": "Flat West Wireless, LLC", + "status": "Operational", + "bands": "CDMA / LTE 1900 / LTE 1700", + "notes": "Arizona, California" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "910", + "brand": "Appalachian Wireless", + "operator": "East Kentucky Network, LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "920", + "brand": null, + "operator": "Northeast Wireless Networks LLC", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "930", + "brand": null, + "operator": "Hewlett-Packard Communication Services, LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "940", + "brand": null, + "operator": "Webformix", + "status": "Operational", + "bands": "Unknown", + "notes": "Oregon" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "950", + "brand": null, + "operator": "Custer Telephone Co-op (CTCI)", + "status": "Operational", + "bands": "CDMA", + "notes": "Idaho" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "960", + "brand": null, + "operator": "M&A Technology, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "970", + "brand": null, + "operator": "IOSAZ Intellectual Property LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "980", + "brand": null, + "operator": "Mark Twain Communications Company", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "312", + "mnc": "990", + "brand": "Premier Broadband", + "operator": "Premier Holdings LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "000", + "brand": null, + "operator": "Tennessee Wireless", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "010", + "brand": "Bravado Wireless", + "operator": "Cross Wireless LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Sprocket Wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "020", + "brand": "CTC Wireless", + "operator": "Cambridge Telephone Company Inc.", + "status": "Operational", + "bands": "CDMA", + "notes": "Idaho" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "030", + "brand": null, + "operator": "AT&T Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Snake River PCS" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "040", + "brand": "NNTC Wireless", + "operator": "Nucla-Naturita Telephone Company", + "status": "Operational", + "bands": "CDMA", + "notes": "Colorado" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "050", + "brand": "Breakaway Wireless", + "operator": "Manti Tele Communications Company, Inc.", + "status": "Not operational", + "bands": "CDMA", + "notes": "Utah; shut down 2018; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "060", + "brand": null, + "operator": "Country Wireless", + "status": "Operational", + "bands": "Unknown", + "notes": "Wisconsin" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "061", + "brand": null, + "operator": "Country Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "070", + "brand": null, + "operator": "Midwest Network Solutions Hub LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "080", + "brand": null, + "operator": "Speedwavz LLP", + "status": "Operational", + "bands": "Unknown", + "notes": "Ohio" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "090", + "brand": null, + "operator": "Vivint Wireless, Inc.", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "100", + "brand": "FirstNet", + "operator": "AT&T FirstNet", + "status": "Operational", + "bands": "LTE 700", + "notes": "D Block" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "110", + "brand": "FirstNet", + "operator": "AT&T FirstNet", + "status": "Unknown", + "bands": "LTE", + "notes": "D Block" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "120", + "brand": "FirstNet", + "operator": "AT&T FirstNet", + "status": "Unknown", + "bands": "LTE", + "notes": "D Block" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "130", + "brand": "FirstNet", + "operator": "AT&T FirstNet", + "status": "Unknown", + "bands": "LTE", + "notes": "D Block" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "140", + "brand": "FirstNet", + "operator": "AT&T FirstNet", + "status": "Unknown", + "bands": "LTE", + "notes": "D Block" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "150", + "brand": "FirstNet", + "operator": "700 MHz Public Safety Broadband", + "status": "Unknown", + "bands": "LTE", + "notes": "D Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "160", + "brand": "FirstNet", + "operator": "700 MHz Public Safety Broadband", + "status": "Unknown", + "bands": "LTE", + "notes": "D Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "170", + "brand": "FirstNet", + "operator": "700 MHz Public Safety Broadband", + "status": "Unknown", + "bands": "LTE", + "notes": "D Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "180", + "brand": "FirstNet", + "operator": "700 MHz Public Safety Broadband", + "status": "Unknown", + "bands": "LTE", + "notes": "D Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "190", + "brand": "FirstNet", + "operator": "700 MHz Public Safety Broadband", + "status": "Unknown", + "bands": "LTE", + "notes": "D Block for future use" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "200", + "brand": null, + "operator": "Mercury Network Corporation", + "status": "Operational", + "bands": "Unknown", + "notes": "Michigan" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "210", + "brand": "AT&T", + "operator": "AT&T Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "220", + "brand": null, + "operator": "Custer Telephone Co-op (CTCI)", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "230", + "brand": null, + "operator": "Velocity Communications Inc.", + "status": "Unknown", + "bands": "LTE", + "notes": "Montana" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "240", + "brand": "Peak Internet", + "operator": "Fundamental Holdings, Corp.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Colorado" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "250", + "brand": null, + "operator": "Imperial County Office of Education", + "status": "Unknown", + "bands": "LTE", + "notes": "California" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "260", + "brand": null, + "operator": "Expeto Wireless Inc.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "270", + "brand": null, + "operator": "Blackstar Management", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "280", + "brand": null, + "operator": "King Street Wireless, LP", + "status": "Unknown", + "bands": "LTE 700", + "notes": "Fixed wireless; mobile service through U.S. Cellular" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "290", + "brand": null, + "operator": "Gulf Coast Broadband LLC", + "status": "Unknown", + "bands": "LTE", + "notes": "Fixed wireless; Louisiana" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "300", + "brand": null, + "operator": "Cambio WiFi of Delmarva, LLC", + "status": "Operational", + "bands": "LTE", + "notes": "Maryland" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "310", + "brand": null, + "operator": "CAL.NET, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "320", + "brand": null, + "operator": "Paladin Wireless", + "status": "Unknown", + "bands": "LTE 3500", + "notes": "Fixed wireless; Georgia" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "330", + "brand": null, + "operator": "CenturyTel Broadband Services LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "340", + "brand": "Dish", + "operator": "Dish Wireless", + "status": "Operational", + "bands": "5G 600 / 5G 1700", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "350", + "brand": "Dish", + "operator": "Dish Wireless", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "360", + "brand": "Dish", + "operator": "Dish Wireless", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "370", + "brand": null, + "operator": "Red Truck Wireless, LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": "Fixed wireless" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "380", + "brand": null, + "operator": "OptimERA Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "390", + "brand": null, + "operator": "Altice USA Wireless, Inc.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "400", + "brand": null, + "operator": "Texoma Communications, LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "410", + "brand": null, + "operator": "pdvWireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "420", + "brand": null, + "operator": "Hudson Valley Wireless", + "status": "Unknown", + "bands": "LTE 3500", + "notes": "CBRS fixed wireless; New York" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "440", + "brand": null, + "operator": "Arvig Enterprises, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": "Minnesota" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "450", + "brand": null, + "operator": "Spectrum Wireless Holdings, LLC", + "status": "Unknown", + "bands": "Unknown 3500", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "460", + "brand": "Mobi", + "operator": "Mobi, Inc.", + "status": "Operational", + "bands": "LTE / CBRS", + "notes": "Hawaiʻi;CDMA network sold to Verizon in 2014" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "470", + "brand": null, + "operator": "San Diego Gas & Electric Company", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "480", + "brand": null, + "operator": "Ready Wireless, LLC", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "490", + "brand": null, + "operator": "Puloli, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "500", + "brand": null, + "operator": "Shelcomm, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "510", + "brand": "Claro", + "operator": "Puerto Rico Telephone Company", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "520", + "brand": null, + "operator": "Florida Broadband, Inc.", + "status": "Operational", + "bands": "Unknown", + "notes": "Fixed wireless; Florida" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "540", + "brand": null, + "operator": "Nokia Innovations US LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "550", + "brand": null, + "operator": "Mile High Networks LLC", + "status": "Operational", + "bands": "Unknown", + "notes": "Fixed wireless; Arizona" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "560", + "brand": null, + "operator": "Transit Wireless LLC", + "status": "Operational", + "bands": "Unknown", + "notes": "Network for MTA / NYCTA" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "570", + "brand": "Pioneer Cellular", + "operator": "Cellular Network Partnership", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "580", + "brand": null, + "operator": "Telecall Telecommunications Corp.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "590", + "brand": "Southern LINC", + "operator": "Southern Communications Services, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "600", + "brand": null, + "operator": "ST Engineering iDirect", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "610", + "brand": null, + "operator": "Crystal Automation Systems, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "620", + "brand": null, + "operator": "OmniProphis Corporation", + "status": "Unknown", + "bands": "Unknown 1700", + "notes": "Former Screened Images, Inc." + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "630", + "brand": null, + "operator": "LICT Corporation", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "640", + "brand": null, + "operator": "Geoverse LLC", + "status": "Unknown", + "bands": "LTE 3500", + "notes": "private networks" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "650", + "brand": null, + "operator": "Chevron USA, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "660", + "brand": null, + "operator": "Hudson Valley Wireless", + "status": "Unknown", + "bands": "LTE 3500", + "notes": "CBRS fixed wireless; New York" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "670", + "brand": null, + "operator": "Hudson Valley Wireless", + "status": "Unknown", + "bands": "LTE 3500", + "notes": "CBRS fixed wireless; New York" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "680", + "brand": null, + "operator": "Hudson Valley Wireless", + "status": "Unknown", + "bands": "LTE 3500", + "notes": "CBRS fixed wireless; New York" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "690", + "brand": null, + "operator": "Shenandoah Cable Television, LLC", + "status": "Operational", + "bands": "LTE", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "700", + "brand": null, + "operator": "Ameren Services Company", + "status": "Unknown", + "bands": "800", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "710", + "brand": null, + "operator": "Extent Systems", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "720", + "brand": null, + "operator": "1st Point Communications, LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "730", + "brand": null, + "operator": "TruAccess Networks", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "740", + "brand": null, + "operator": "RTO Wireless, LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "750", + "brand": "ZipLink", + "operator": "CellTex Networks, LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "760", + "brand": null, + "operator": "Hologram, Inc.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "770", + "brand": null, + "operator": "Tango Networks", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "780", + "brand": null, + "operator": "Windstream Holdings", + "status": "Unknown", + "bands": "Unknown 3500", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "790", + "brand": "Liberty", + "operator": "Liberty Cablevision of Puerto Rico LLC", + "status": "Not operational", + "bands": "UMTS 850 / UMTS 1900 / LTE 700 / LTE 850 / LTE 1700 / LTE 1900 / LTE 2300 / 5G 850", + "notes": "Puerto Rico; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "800", + "brand": null, + "operator": "Wireless Technologies of Nebraska", + "status": "Not operational", + "bands": "Unknown", + "notes": "Nebraska, Iowa; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "810", + "brand": null, + "operator": "Watch Communications", + "status": "Operational", + "bands": "LTE 3500", + "notes": "Illinois, Indiana, Kentucky & Ohio;" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "820", + "brand": null, + "operator": "Inland Cellular Telephone Company", + "status": "Not operational", + "bands": "LTE", + "notes": "Washington; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "830", + "brand": null, + "operator": "360 Communications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "840", + "brand": null, + "operator": "CellBlox Acquisitions", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "850", + "brand": null, + "operator": "Softcom Internet Communications, Inc", + "status": "Operational", + "bands": "LTE", + "notes": "California" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "860", + "brand": "Nextlink", + "operator": "AMG Technology Investment Group", + "status": "Operational", + "bands": "Unknown 3500", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "870", + "brand": null, + "operator": "ElektraFi LLC", + "status": "Operational", + "bands": "5G 3500", + "notes": "Texas" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "880", + "brand": null, + "operator": "Shuttle wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "890", + "brand": "TCOE", + "operator": "Tulare County Office of Education", + "status": "Operational", + "bands": "Unknown", + "notes": "California" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "900", + "brand": null, + "operator": "Tribal Networks", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "910", + "brand": null, + "operator": "San Diego Gas & Electric", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "920", + "brand": null, + "operator": "JCI", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "930", + "brand": "Rock Wireless", + "operator": "Standing Rock Telecom", + "status": "Operational", + "bands": "LTE 2500", + "notes": "North Dakota" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "940", + "brand": null, + "operator": "Motorola Solutions", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "950", + "brand": null, + "operator": "Cheyenne and Arapaho Development Group", + "status": "Unknown", + "bands": "2500", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "960", + "brand": null, + "operator": "Townes 5G, LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "970", + "brand": null, + "operator": "Tycrhron", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "980", + "brand": null, + "operator": "Next Generation Application LLC", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "313", + "mnc": "990", + "brand": null, + "operator": "Ericsson US", + "status": "Unknown", + "bands": "Unknown", + "notes": "EEC/ATL Private Networks" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "010", + "brand": null, + "operator": "Boingo Wireless Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "020", + "brand": null, + "operator": "Spectrum Wireless Holdings, LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "030", + "brand": null, + "operator": "Baicells Technologies North America Inc.", + "status": "Unknown", + "bands": "LTE", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "060", + "brand": null, + "operator": "Texas A&M University", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "070", + "brand": null, + "operator": "Texas A&M University", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "080", + "brand": null, + "operator": "Texas A&M University", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "090", + "brand": null, + "operator": "Southern LINC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "100 - 190", + "brand": null, + "operator": "Reserved for Public Safety", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "200", + "brand": null, + "operator": "XF Wireless Investments, LLC", + "status": "Unknown", + "bands": "Unknown 3500", + "notes": "Owned by Comcast" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "210", + "brand": null, + "operator": "Telecom Resource Center", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "220", + "brand": null, + "operator": "Securus Technologies", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "230", + "brand": null, + "operator": "Trace-Tek LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": "Use in correctional institutions" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "240", + "brand": null, + "operator": "XF Wireless Investments, LLC", + "status": "Unknown", + "bands": "Unknown 3500", + "notes": "Owned by Comcast" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "260", + "brand": null, + "operator": "AT&T Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "270", + "brand": null, + "operator": "AT&T Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "280", + "brand": null, + "operator": "AT&T Mobility", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "290", + "brand": null, + "operator": "Wave", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "300", + "brand": null, + "operator": "Southern California Edison", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "310", + "brand": null, + "operator": "Terranet", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "320", + "brand": null, + "operator": "Agri-Valley Communications, Inc", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "330", + "brand": null, + "operator": "FreedomFi", + "status": "Unknown", + "bands": "TD-LTE 3500", + "notes": "CBRS" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "314", + "mnc": "340", + "brand": "e/marconi", + "operator": "E-Marconi LLC", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "315", + "mnc": "010", + "brand": "CBRS", + "operator": "Citizens Broadband Radio Service", + "status": "Unknown", + "bands": "TD-LTE 3500", + "notes": "LTE band 48" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "316", + "mnc": "010", + "brand": "Nextel", + "operator": "Nextel Communications", + "status": "Not operational", + "bands": "iDEN 800", + "notes": "Merged with Sprint forming Sprint Nextel; iDEN network shut down June 2013; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States of America", + "countryCode": "US", + "mcc": "316", + "mnc": "011", + "brand": "Southern LINC", + "operator": "Southern Communications Services", + "status": "Not operational", + "bands": "iDEN 800", + "notes": "shut down 2019; MNC withdrawn" + }, + { + "type": "National", + "countryName": "United States Virgin Islands (United States of America)", + "countryCode": "VI", + "mcc": "310", + "mnc": "120", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Operational", + "bands": "LTE 850 / LTE 1900", + "notes": "Former Sprint Corporation; CDMA shut down May 2022" + }, + { + "type": "National", + "countryName": "United States Virgin Islands (United States of America)", + "countryCode": "VI", + "mcc": "310", + "mnc": "260", + "brand": "T-Mobile", + "operator": "T-Mobile US", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / UMTS 1700 / LTE 850 / LTE 700 / LTE 1900 / LTE 1700 / 5G 600", + "notes": "Former Cook Inlet West Wireless, Voicestream; now universal USA code. Also used for Ting." + }, + { + "type": "National", + "countryName": "United States Virgin Islands (United States of America)", + "countryCode": "VI", + "mcc": "310", + "mnc": "410", + "brand": "Liberty", + "operator": "Liberty", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / 5G 850", + "notes": "Formerly AT&T Mobility, Cingular Wireless" + }, + { + "type": "National", + "countryName": "United States Virgin Islands (United States of America)", + "countryCode": "VI", + "mcc": "311", + "mnc": "470", + "brand": "Viya", + "operator": "Vitelcom Cellular Inc.", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / TD-LTE 2500", + "notes": "Former Innovative Wireless; US Virgin Islands" + }, + { + "type": "National", + "countryName": "Afghanistan", + "countryCode": "AF", + "mcc": "412", + "mnc": "01", + "brand": "AWCC", + "operator": "Afghan Wireless Communication Company", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Afghanistan", + "countryCode": "AF", + "mcc": "412", + "mnc": "20", + "brand": "Roshan", + "operator": "Telecom Development Company Afghanistan Ltd.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Afghanistan", + "countryCode": "AF", + "mcc": "412", + "mnc": "40", + "brand": "MTN", + "operator": "MTN Group Afghanistan", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Afghanistan", + "countryCode": "AF", + "mcc": "412", + "mnc": "50", + "brand": "Etisalat", + "operator": "Etisalat Afghanistan", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Afghanistan", + "countryCode": "AF", + "mcc": "412", + "mnc": "55", + "brand": "WASEL", + "operator": "WASEL Afghanistan", + "status": "Operational", + "bands": "CDMA 800", + "notes": null + }, + { + "type": "National", + "countryName": "Afghanistan", + "countryCode": "AF", + "mcc": "412", + "mnc": "80", + "brand": "Salaam", + "operator": "Afghan Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Afghanistan", + "countryCode": "AF", + "mcc": "412", + "mnc": "88", + "brand": "Salaam", + "operator": "Afghan Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Azerbaijan", + "countryCode": "AZ", + "mcc": "400", + "mnc": "01", + "brand": "Azercell", + "operator": null, + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Azerbaijan", + "countryCode": "AZ", + "mcc": "400", + "mnc": "02", + "brand": "Bakcell", + "operator": null, + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Azerbaijan", + "countryCode": "AZ", + "mcc": "400", + "mnc": "03", + "brand": "FONEX", + "operator": "CATEL", + "status": "Operational", + "bands": "CDMA 450", + "notes": null + }, + { + "type": "National", + "countryName": "Azerbaijan", + "countryCode": "AZ", + "mcc": "400", + "mnc": "04", + "brand": "Nar Mobile", + "operator": "Azerfon", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Azerbaijan", + "countryCode": "AZ", + "mcc": "400", + "mnc": "05", + "brand": null, + "operator": "Special State Protection Service of the Republic of Azerbaijan", + "status": "Unknown", + "bands": "TETRA?", + "notes": null + }, + { + "type": "National", + "countryName": "Azerbaijan", + "countryCode": "AZ", + "mcc": "400", + "mnc": "06", + "brand": "Naxtel", + "operator": "Nakhtel LLC", + "status": "Operational", + "bands": "CDMA 800 / LTE 800 / LTE 900 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Bahrain", + "countryCode": "BH", + "mcc": "426", + "mnc": "01", + "brand": "Batelco", + "operator": "Bahrain Telecommunications Company", + "status": "Operational", + "bands": "UMTS 2100 / LTE 1800 / 5G 3500", + "notes": "GSM shut down Nov 2021" + }, + { + "type": "National", + "countryName": "Bahrain", + "countryCode": "BH", + "mcc": "426", + "mnc": "02", + "brand": "zain BH", + "operator": "Zain Bahrain", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Bahrain", + "countryCode": "BH", + "mcc": "426", + "mnc": "03", + "brand": null, + "operator": "Civil Aviation Authority", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Bahrain", + "countryCode": "BH", + "mcc": "426", + "mnc": "04", + "brand": "stc", + "operator": "Stc Bahrain", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 3500", + "notes": "Former VIVA" + }, + { + "type": "National", + "countryName": "Bahrain", + "countryCode": "BH", + "mcc": "426", + "mnc": "05", + "brand": "Batelco", + "operator": "Bahrain Telecommunications Company", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Royal Court use only" + }, + { + "type": "National", + "countryName": "Bahrain", + "countryCode": "BH", + "mcc": "426", + "mnc": "06", + "brand": "stc", + "operator": "Stc Bahrain", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Bahrain", + "countryCode": "BH", + "mcc": "426", + "mnc": "07", + "brand": null, + "operator": "TAIF", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Bangladesh", + "countryCode": "BD", + "mcc": "470", + "mnc": "01", + "brand": "Grameenphone", + "operator": "Grameenphone Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Bangladesh", + "countryCode": "BD", + "mcc": "470", + "mnc": "02", + "brand": "Robi", + "operator": "Axiata Bangladesh Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100", + "notes": "Formerly Aktel" + }, + { + "type": "National", + "countryName": "Bangladesh", + "countryCode": "BD", + "mcc": "470", + "mnc": "03", + "brand": "Banglalink", + "operator": "Banglalink Digital Communications Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": "VEON" + }, + { + "type": "National", + "countryName": "Bangladesh", + "countryCode": "BD", + "mcc": "470", + "mnc": "04", + "brand": "TeleTalk", + "operator": "Teletalk Bangladesh Limited", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Bangladesh", + "countryCode": "BD", + "mcc": "470", + "mnc": "05", + "brand": "Citycell", + "operator": "Pacific Bangladesh Telecom Limited", + "status": "Not operational", + "bands": "CDMA 800", + "notes": "Shutdown by Bangladesh Telecommunication Regulatory Commission in 2016" + }, + { + "type": "National", + "countryName": "Bangladesh", + "countryCode": "BD", + "mcc": "470", + "mnc": "07", + "brand": "Airtel", + "operator": "Bharti Airtel Bangladesh Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Formerly Warid Telcom, later Airtel. Currently merged with Robi keeping brand name Airtel" + }, + { + "type": "National", + "countryName": "Bangladesh", + "countryCode": "BD", + "mcc": "470", + "mnc": "09", + "brand": "ollo", + "operator": "Bangladesh Internet Exchange Limited (BIEL)", + "status": "Not operational", + "bands": "LTE 800 / LTE 2600 / WiMAX 3500", + "notes": "shut down 2019" + }, + { + "type": "National", + "countryName": "Bangladesh", + "countryCode": "BD", + "mcc": "470", + "mnc": "10", + "brand": "Banglalion", + "operator": "Banglalion Communications Ltd.", + "status": "Operational", + "bands": "TD-LTE 2600 / WiMAX 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Bhutan", + "countryCode": "BT", + "mcc": "402", + "mnc": "11", + "brand": "B-Mobile", + "operator": "Bhutan Telecom Limited", + "status": "Operational", + "bands": "GSM 900 / UMTS 850 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Bhutan", + "countryCode": "BT", + "mcc": "402", + "mnc": "17", + "brand": "B-Mobile", + "operator": "Bhutan Telecom Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Bhutan", + "countryCode": "BT", + "mcc": "402", + "mnc": "77", + "brand": "TashiCell", + "operator": "Tashi InfoComm Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 850 / LTE 700", + "notes": "LTE band 28" + }, + { + "type": "National", + "countryName": "Cambodia", + "countryCode": "KH", + "mcc": "456", + "mnc": "01", + "brand": "Cellcard", + "operator": "CamGSM / The Royal Group", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Mobitel" + }, + { + "type": "National", + "countryName": "Cambodia", + "countryCode": "KH", + "mcc": "456", + "mnc": "02", + "brand": "Smart", + "operator": "Smart Axiata Co. Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Cambodia", + "countryCode": "KH", + "mcc": "456", + "mnc": "03", + "brand": "qb", + "operator": "Cambodia Advance Communications Co. Ltd", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100", + "notes": "aka CADCOMMS" + }, + { + "type": "National", + "countryName": "Cambodia", + "countryCode": "KH", + "mcc": "456", + "mnc": "04", + "brand": "qb", + "operator": "Cambodia Advance Communications Co. Ltd", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100", + "notes": "aka CADCOMMS" + }, + { + "type": "National", + "countryName": "Cambodia", + "countryCode": "KH", + "mcc": "456", + "mnc": "05", + "brand": "Smart", + "operator": "Smart Axiata Co. Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Cambodia", + "countryCode": "KH", + "mcc": "456", + "mnc": "06", + "brand": "Smart", + "operator": "Smart Axiata Co. Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Cambodia", + "countryCode": "KH", + "mcc": "456", + "mnc": "08", + "brand": "Metfone", + "operator": "Viettel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Cambodia", + "countryCode": "KH", + "mcc": "456", + "mnc": "09", + "brand": "Metfone", + "operator": "Viettel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Beeline" + }, + { + "type": "National", + "countryName": "Cambodia", + "countryCode": "KH", + "mcc": "456", + "mnc": "11", + "brand": "SEATEL", + "operator": "SEATEL Cambodia", + "status": "Operational", + "bands": "LTE 850 / LTE 2600", + "notes": "Former Excell CDMA shut down 27 June 2015" + }, + { + "type": "National", + "countryName": "Cambodia", + "countryCode": "KH", + "mcc": "456", + "mnc": "18", + "brand": "Cellcard", + "operator": "The Royal Group", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Mfone" + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "00", + "brand": "China Mobile", + "operator": "China Mobile", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2500 / 5G 700 / 5G 2500", + "notes": null + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "01", + "brand": "China Unicom", + "operator": "China Unicom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500 / 5G 2100 / 5G 3500", + "notes": "CDMA network sold to China Telecom" + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "02", + "brand": "China Mobile", + "operator": "China Mobile", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2500", + "notes": null + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "03", + "brand": "China Telecom", + "operator": "China Telecom", + "status": "Operational", + "bands": "CDMA2000 800", + "notes": "EV-DO" + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "04", + "brand": "China Mobile", + "operator": "Global Star Satellite", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "05", + "brand": "China Telecom", + "operator": "China Telecom", + "status": "Not operational", + "bands": "CDMA2000 800 / LTE 850 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500", + "notes": null + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "06", + "brand": "China Unicom", + "operator": "China Unicom", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "07", + "brand": "China Mobile", + "operator": "China Mobile", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / TD-SCDMA 1900 / TD-SCDMA 2000 / TD-LTE 1900 / TD-LTE 2300 / TD-LTE 2500", + "notes": null + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "08", + "brand": "China Mobile", + "operator": "China Mobile", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "09", + "brand": "China Unicom", + "operator": "China Unicom", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "11", + "brand": "China Telecom", + "operator": "China Telecom", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "15", + "brand": "China Broadnet", + "operator": "China Broadnet", + "status": "Operational", + "bands": "LTE 1800 / LTE 900 / TD-LTE 1900 / TD-LTE 2300 / 5G 700 / 5G 2500", + "notes": "4th carrier of China. Shared frequencies with China Mobile" + }, + { + "type": "National", + "countryName": "China", + "countryCode": "CN", + "mcc": "460", + "mnc": "20", + "brand": "China Tietong", + "operator": "China Tietong", + "status": "Operational", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "00", + "brand": "1O1O / One2Free / New World Mobility / SUNMobile", + "operator": "CSL Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "01", + "brand": null, + "operator": "CITIC Telecom 1616", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO on CSL network; network code operational only at land borders and Airport to attract inbound roamers to join 454-00" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "02", + "brand": null, + "operator": "CSL Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Network code operational only at land borders and Airport to attract inbound roamers to join 454-00" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "03", + "brand": "3", + "operator": "Hutchison Telecom", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "04", + "brand": "3 (2G)", + "operator": "Hutchison Telecom", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Shut down Sep 2021" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "05", + "brand": "3 (CDMA)", + "operator": "Hutchison Telecom", + "status": "Not operational", + "bands": "CDMA 800", + "notes": "Shut down Nov 2008" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "06", + "brand": "SmarTone", + "operator": "SmarTone Mobile Communications Limited", + "status": "Operational", + "bands": "UMTS 850 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500", + "notes": "GSM shut down Oct 2022" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "07", + "brand": "China Unicom", + "operator": "China Unicom (Hong Kong) Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO on 3 Hong Kong Mobile network code operational only at land borders and Airport to attract inbound roamers to join 454-16 or 454-19" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "08", + "brand": "Truphone", + "operator": "Truphone Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Trident" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "09", + "brand": null, + "operator": "China Motion Telecom", + "status": "Not operational", + "bands": "MVNO", + "notes": "MVNO on CSL network; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "10", + "brand": "New World Mobility", + "operator": "CSL Limited", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Signal Combined with 454-00" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "11", + "brand": null, + "operator": "China-Hong Kong Telecom", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO on PCCW Mobile and Hutchison Telecom networks" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "12", + "brand": "CMCC HK", + "operator": "China Mobile Hong Kong Company Limited", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / TD-SCDMA 2000 / LTE 900 /LTE 1800 / LTE 2100 / TD-LTE 2300 / LTE 2600 / 5G 3500", + "notes": "Formerly Peoples" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "13", + "brand": "CMCC HK", + "operator": "China Mobile Hong Kong Company Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO on PCCW Mobile (3G)" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "14", + "brand": null, + "operator": "Hutchison Telecom", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Only at land borders and Airport to attract inbound roamers; shut down Sep 2021" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "15", + "brand": null, + "operator": "SmarTone Mobile Communications Limited", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Only at land borders and Airport to attract inbound roamers; shut down Oct 2022" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "16", + "brand": "PCCW Mobile (2G)", + "operator": "PCCW", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Formerly SUNDAY" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "17", + "brand": null, + "operator": "SmarTone Mobile Communications Limited", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Only at land borders and Airport to attract inbound roamers; shut down Oct 2022" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "18", + "brand": null, + "operator": "CSL Limited", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "19", + "brand": "PCCW Mobile (3G)", + "operator": "PCCW-HKT", + "status": "Operational", + "bands": "UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "20", + "brand": "PCCW Mobile (4G)", + "operator": "PCCW-HKT", + "status": "Operational", + "bands": "LTE 1800 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "21", + "brand": null, + "operator": "21Vianet Mobile Ltd.", + "status": "Not operational", + "bands": "MVNO", + "notes": "Closed on 1 February 2019" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "22", + "brand": null, + "operator": "263 Mobile Communications (HongKong) Limited", + "status": "Operational", + "bands": "MVNO", + "notes": "Formerly P Plus Communications, Delcom (HK) Ltd" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "23", + "brand": "Lycamobile", + "operator": "Lycamobile Hong Kong Ltd", + "status": "Not operational", + "bands": "MVNO", + "notes": "Closed on 27 April 2018; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "24", + "brand": null, + "operator": "Multibyte Info Technology Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "25", + "brand": null, + "operator": "Hong Kong Government", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "26", + "brand": null, + "operator": "Hong Kong Government", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "29", + "brand": "PCCW Mobile (CDMA)", + "operator": "PCCW-HKT", + "status": "Operational", + "bands": "CDMA 800", + "notes": "CDMA2000 1xEV-DO Rev A network for inbound roamers, with limited coverage" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "30", + "brand": "CMCC HK", + "operator": "China Mobile Hong Kong Company Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former China Data Enterprises Ltd" + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "31", + "brand": "CTExcel", + "operator": "China Telecom Global Limited", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "32", + "brand": null, + "operator": "Hong Kong Broadband Network Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "35", + "brand": null, + "operator": "Webbing Hong Kong Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Hong Kong", + "countryCode": "HK", + "mcc": "454", + "mnc": "36", + "brand": null, + "operator": "Easco Telecommunications Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "01", + "brand": "Vi India", + "operator": "Haryana", + "status": "Operational", + "bands": "GSM 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "02", + "brand": "AirTel", + "operator": "Punjab", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "03", + "brand": "AirTel", + "operator": "Himachal Pradesh", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "04", + "brand": "Vi India", + "operator": "Delhi & NCR", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "05", + "brand": "Vi India", + "operator": "Gujarat", + "status": "Operational", + "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Hutch, Fascel, Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "07", + "brand": "Vi India", + "operator": "Andhra Pradesh and Telangana", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "09", + "brand": "Reliance", + "operator": "Assam", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "10", + "brand": "AirTel", + "operator": "Delhi & NCR", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 850 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "11", + "brand": "Vi India", + "operator": "Delhi & NCR", + "status": "Operational", + "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "12", + "brand": "Vi India", + "operator": "Haryana", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Escotel, IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "13", + "brand": "Vi India", + "operator": "Andhra Pradesh and Telangana", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "14", + "brand": "Vi India", + "operator": "Punjab", + "status": "Operational", + "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Spice, IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "15", + "brand": "Vi India", + "operator": "Uttar Pradesh (East)", + "status": "Operational", + "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "16", + "brand": "Airtel", + "operator": "North East", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": "Former Hexacom" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "17", + "brand": "AIRCEL", + "operator": "West Bengal", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "18", + "brand": "Reliance", + "operator": "Himachal Pradesh", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "19", + "brand": "Vi India", + "operator": "Kerala", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE-2300 / TD-LTE 2500", + "notes": "Former Escotel, IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "20", + "brand": "Vi India", + "operator": "Mumbai", + "status": "Operational", + "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Hutchison Maxtouch, Orange, Hutch, Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "21", + "brand": "Loop Mobile", + "operator": "Mumbai", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Former BPL Mobile; licence expired 2014" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "22", + "brand": "Vi India", + "operator": "Maharashtra & Goa", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "23", + "brand": "Reliance", + "operator": "West Bengal", + "status": "Not operational", + "bands": "LTE", + "notes": "Reliance Telecom" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "24", + "brand": "Vi India", + "operator": "Gujarat", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "25", + "brand": "AIRCEL", + "operator": "Bihar", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "27", + "brand": "Vi India", + "operator": "Maharashtra & Goa", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "28", + "brand": "AIRCEL", + "operator": "Odisha", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "29", + "brand": "AIRCEL", + "operator": "Assam", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "30", + "brand": "Vi India", + "operator": "Kolkata", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India, Command, Hutch" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "31", + "brand": "AirTel", + "operator": "Kolkata", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "34", + "brand": "BSNL Mobile", + "operator": "Haryana", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "35", + "brand": "Aircel", + "operator": "Himachal Pradesh", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "36", + "brand": "Reliance", + "operator": "Bihar & Jharkhand", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "37", + "brand": "Aircel", + "operator": "Jammu & Kashmir", + "status": "Not operational", + "bands": "GSM 900 / UMTS 2100", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "38", + "brand": "BSNL Mobile", + "operator": "Assam", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "40", + "brand": "AirTel", + "operator": "Chennai", + "status": "Operational", + "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "41", + "brand": "Aircel", + "operator": "Chennai", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Former RPG; bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "42", + "brand": "Aircel", + "operator": "Tamil Nadu", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "43", + "brand": "Vi India", + "operator": "Tamil Nadu", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "44", + "brand": "Vi India", + "operator": "Karnataka", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100", + "notes": "Former Spice, IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "45", + "brand": "Airtel", + "operator": "Karnataka", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "46", + "brand": "Vi India", + "operator": "Kerala", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE-2300 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "48", + "brand": "Dishnet Wireless", + "operator": "Unknown", + "status": "Not operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "49", + "brand": "Airtel", + "operator": "Andhra Pradesh and Telangana", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 850 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "50", + "brand": "Reliance", + "operator": "North East", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "51", + "brand": "BSNL Mobile", + "operator": "Himachal Pradesh", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "52", + "brand": "Reliance", + "operator": "Odisha", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "53", + "brand": "BSNL Mobile", + "operator": "Punjab", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "54", + "brand": "BSNL Mobile", + "operator": "Uttar Pradesh (West)", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "55", + "brand": "BSNL Mobile", + "operator": "Uttar Pradesh (East)", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "56", + "brand": "Vi India", + "operator": "Uttar Pradesh (West)", + "status": "Operational", + "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "57", + "brand": "BSNL Mobile", + "operator": "Gujarat", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "58", + "brand": "BSNL Mobile", + "operator": "Madhya Pradesh & Chhattisgarh", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "59", + "brand": "BSNL Mobile", + "operator": "Rajasthan", + "status": "Operational", + "bands": "CDMA 850 / GSM 900 / UMTS 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "60", + "brand": "Vi India", + "operator": "Rajasthan", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "62", + "brand": "BSNL Mobile", + "operator": "Jammu & Kashmir", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "64", + "brand": "BSNL Mobile", + "operator": "Chennai", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "66", + "brand": "BSNL Mobile", + "operator": "Maharashtra & Goa", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "67", + "brand": "Reliance", + "operator": "Madhya Pradesh & Chhattisgarh", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "68", + "brand": "MTNL", + "operator": "Delhi & NCR", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": "To be merged with BSNL" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "69", + "brand": "MTNL", + "operator": "Mumbai", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": "To be merged with BSNL" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "70", + "brand": "AirTel", + "operator": "Rajasthan", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "71", + "brand": "BSNL Mobile", + "operator": "Karnataka (Bangalore)", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "72", + "brand": "BSNL Mobile", + "operator": "Kerala", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "73", + "brand": "BSNL Mobile", + "operator": "Andhra Pradesh and Telangana", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "74", + "brand": "BSNL Mobile", + "operator": "West Bengal", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "75", + "brand": "BSNL Mobile", + "operator": "Bihar", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "76", + "brand": "BSNL Mobile", + "operator": "Odisha", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "77", + "brand": "BSNL Mobile", + "operator": "North East", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "78", + "brand": "Vi India", + "operator": "Madhya Pradesh & Chattishgarh", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "79", + "brand": "BSNL Mobile", + "operator": "Andaman Nicobar", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "80", + "brand": "BSNL Mobile", + "operator": "Tamil Nadu", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "81", + "brand": "BSNL Mobile", + "operator": "Kolkata", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": "Former CellOne" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "82", + "brand": "Vi India", + "operator": "Himachal Pradesh", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "83", + "brand": "Reliance", + "operator": "Kolkata", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "84", + "brand": "Vi India", + "operator": "Chennai", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "85", + "brand": "Reliance", + "operator": "West Bengal", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "86", + "brand": "Vi India", + "operator": "Karnataka", + "status": "Operational", + "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "87", + "brand": "Vi India", + "operator": "Rajasthan", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "88", + "brand": "Vi India", + "operator": "Punjab", + "status": "Not operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "89", + "brand": "Vi India", + "operator": "Uttar Pradesh (East)", + "status": "Not operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "90", + "brand": "AirTel", + "operator": "Maharashtra", + "status": "Operational", + "bands": "GSM 1800 / LTE 850 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "91", + "brand": "AIRCEL", + "operator": "Kolkata", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "92", + "brand": "AirTel", + "operator": "Mumbai", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 850 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "93", + "brand": "AirTel", + "operator": "Madhya Pradesh", + "status": "Operational", + "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "94", + "brand": "AirTel", + "operator": "Tamil Nadu", + "status": "Operational", + "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "95", + "brand": "AirTel", + "operator": "Kerala", + "status": "Operational", + "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "96", + "brand": "AirTel", + "operator": "Haryana", + "status": "Operational", + "bands": "GSM 1800 / LTE 850 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "97", + "brand": "AirTel", + "operator": "Uttar Pradesh (West)", + "status": "Operational", + "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "404", + "mnc": "98", + "brand": "AirTel", + "operator": "Gujarat", + "status": "Operational", + "bands": "GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "01", + "brand": "Reliance", + "operator": "Andhra Pradesh and Telangana", + "status": "Not operational", + "bands": "GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "025", + "brand": "TATA DOCOMO", + "operator": "Andhra Pradesh and Telangana", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800 / UMTS 2100", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "026", + "brand": "TATA DOCOMO", + "operator": "Assam", + "status": "Not operational", + "bands": "CDMA 850", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "027", + "brand": "TATA DOCOMO", + "operator": "Bihar/Jharkhand", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "028", + "brand": "TATA DOCOMO", + "operator": "Chennai", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "029", + "brand": "TATA DOCOMO", + "operator": "Delhi", + "status": "Not operational", + "bands": "CDMA 850", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "03", + "brand": "Reliance", + "operator": "Bihar", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "030", + "brand": "TATA DOCOMO", + "operator": "Gujarat", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800 / UMTS 2100", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "031", + "brand": "TATA DOCOMO", + "operator": "Haryana", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800 / UMTS 2100", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "032", + "brand": "TATA DOCOMO", + "operator": "Himachal Pradesh", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800 / UMTS 2100", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "033", + "brand": "TATA DOCOMO", + "operator": "Jammu & Kashmir", + "status": "Not operational", + "bands": "CDMA 850", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "034", + "brand": "TATA DOCOMO", + "operator": "Karnataka", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800 / UMTS 2100", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "035", + "brand": "TATA DOCOMO", + "operator": "Kerala", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800 / UMTS 2100", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "036", + "brand": "TATA DOCOMO", + "operator": "Kolkata", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "037", + "brand": "TATA DOCOMO", + "operator": "Maharashtra & Goa", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800 / UMTS 2100", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "038", + "brand": "TATA DOCOMO", + "operator": "Madhya Pradesh", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800 / UMTS 2100", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "039", + "brand": "TATA DOCOMO", + "operator": "Mumbai", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "04", + "brand": "Reliance", + "operator": "Chennai", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "041", + "brand": "TATA DOCOMO", + "operator": "Odisha", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "042", + "brand": "TATA DOCOMO", + "operator": "Punjab", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800 / UMTS 2100", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "043", + "brand": "TATA DOCOMO", + "operator": "Rajasthan", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800 / UMTS 2100", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "044", + "brand": "TATA DOCOMO", + "operator": "Tamil Nadu including Chennai", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "045", + "brand": "TATA DOCOMO", + "operator": "Uttar Pradesh (East)", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "046", + "brand": "TATA DOCOMO", + "operator": "Uttar Pradesh (West) & Uttarakhand", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800 / UMTS 2100", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "047", + "brand": "TATA DOCOMO", + "operator": "West Bengal", + "status": "Not operational", + "bands": "CDMA 850 / GSM 1800", + "notes": "Merged with Airtel in 2019" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "05", + "brand": "Reliance", + "operator": "Delhi & NCR", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "06", + "brand": "Reliance", + "operator": "Gujarat", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "07", + "brand": "Reliance", + "operator": "Haryana", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "08", + "brand": "Reliance", + "operator": "Himachal Pradesh", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "09", + "brand": "Reliance", + "operator": "Jammu & Kashmir", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "10", + "brand": "Reliance", + "operator": "Karnataka", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "11", + "brand": "Reliance", + "operator": "Kerala", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "12", + "brand": "Reliance", + "operator": "Kolkata", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "13", + "brand": "Reliance", + "operator": "Maharashtra & Goa", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "14", + "brand": "Reliance", + "operator": "Madhya Pradesh", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "15", + "brand": "Reliance", + "operator": "Mumbai", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "17", + "brand": "Reliance", + "operator": "Odisha", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "18", + "brand": "Reliance", + "operator": "Punjab", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "19", + "brand": "Reliance", + "operator": "Rajasthan", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "20", + "brand": "Reliance", + "operator": "Tamil Nadu", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "21", + "brand": "Reliance", + "operator": "Uttar Pradesh (East)", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "22", + "brand": "Reliance", + "operator": "Uttar Pradesh (West)", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "23", + "brand": "Reliance", + "operator": "West Bengal", + "status": "Operational", + "bands": "LTE", + "notes": "Data-only as of 2020" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "51", + "brand": "AirTel", + "operator": "West Bengal", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "52", + "brand": "AirTel", + "operator": "Bihar & Jharkhand", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "53", + "brand": "AirTel", + "operator": "Odisha", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "54", + "brand": "AirTel", + "operator": "Uttar Pradesh (East)", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "55", + "brand": "Airtel", + "operator": "Jammu & Kashmir", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "56", + "brand": "AirTel", + "operator": "Assam", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "66", + "brand": "Vi India", + "operator": "Uttar Pradesh (West)", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "67", + "brand": "Vi India", + "operator": "West Bengal", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "70", + "brand": "Vi India", + "operator": "Bihar & Jharkhand", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "750", + "brand": "Vi India", + "operator": "Jammu & Kashmir", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "751", + "brand": "Vi India", + "operator": "Assam", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "752", + "brand": "Vi India", + "operator": "Bihar & Jharkhand", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "753", + "brand": "Vi India", + "operator": "Odisha", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "754", + "brand": "Vi India", + "operator": "Himachal Pradesh", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "755", + "brand": "Vi India", + "operator": "North East", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "756", + "brand": "Vi India", + "operator": "Madhya Pradesh & Chhattisgarh", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500", + "notes": "Former Vodafone India" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "799", + "brand": "Vi India", + "operator": "Mumbai", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "800", + "brand": "AIRCEL", + "operator": "Delhi & NCR", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "801", + "brand": "AIRCEL", + "operator": "Andhra Pradesh and Telangana", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "802", + "brand": "AIRCEL", + "operator": "Gujarat", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "803", + "brand": "AIRCEL", + "operator": "Karnataka", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "804", + "brand": "AIRCEL", + "operator": "Maharashtra & Goa", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "805", + "brand": "AIRCEL", + "operator": "Mumbai", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "806", + "brand": "AIRCEL", + "operator": "Rajasthan", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "807", + "brand": "AIRCEL", + "operator": "Haryana", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "808", + "brand": "AIRCEL", + "operator": "Madhya Pradesh", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "809", + "brand": "AIRCEL", + "operator": "Kerala", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "810", + "brand": "AIRCEL", + "operator": "Uttar Pradesh (East)", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "811", + "brand": "AIRCEL", + "operator": "Uttar Pradesh (West)", + "status": "Not operational", + "bands": "GSM", + "notes": "Bankrupt in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "812", + "brand": "AIRCEL", + "operator": "Punjab", + "status": "Not operational", + "bands": "GSM", + "notes": "License cancelled by Supreme Court" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "819", + "brand": "Uninor", + "operator": "Andhra Pradesh and Telangana", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged with Airtel in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "818", + "brand": "Uninor", + "operator": "Uttar Pradesh (West)", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged with Airtel in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "820", + "brand": "Uninor", + "operator": "Karnataka", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged with Airtel in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "821", + "brand": "Uninor", + "operator": "Kerala", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged with Airtel in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "822", + "brand": "Uninor", + "operator": "Kolkata", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged with Airtel in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "824", + "brand": "Videocon Telecom", + "operator": "Assam", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Shut down in 2016" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "827", + "brand": "Videocon Telecom", + "operator": "Gujarat", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Shut down in 2016" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "834", + "brand": "Videocon Telecom", + "operator": "Madhya Pradesh", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Shut down in 2016" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "844", + "brand": "Uninor", + "operator": "Delhi & NCR", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged with Airtel in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "840", + "brand": "Jio", + "operator": "West Bengal", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "845", + "brand": "Vi India", + "operator": "Assam", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "846", + "brand": "Vi India", + "operator": "Jammu & Kashmir", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "847", + "brand": "Vi India", + "operator": "Karnataka", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "848", + "brand": "Vi India", + "operator": "Kolkata", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "849", + "brand": "Vi India", + "operator": "North East", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "850", + "brand": "Vi India", + "operator": "Odisha", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "851", + "brand": "Vi India", + "operator": "Punjab", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "852", + "brand": "Vi India", + "operator": "Tamil Nadu", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "853", + "brand": "Vi India", + "operator": "West Bengal", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "854", + "brand": "Jio", + "operator": "Andhra Pradesh", + "status": "Operational", + "bands": "LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "855", + "brand": "Jio", + "operator": "Assam", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "856", + "brand": "Jio", + "operator": "Bihar", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "857", + "brand": "Jio", + "operator": "Gujarat", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "858", + "brand": "Jio", + "operator": "Haryana", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "859", + "brand": "Jio", + "operator": "Himachal Pradesh", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "860", + "brand": "Jio", + "operator": "Jammu & Kashmir", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "861", + "brand": "Jio", + "operator": "Karnataka", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "862", + "brand": "Jio", + "operator": "Kerala", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "863", + "brand": "Jio", + "operator": "Madhya Pradesh", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "864", + "brand": "Jio", + "operator": "Maharashtra", + "status": "Operational", + "bands": "LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "865", + "brand": "Jio", + "operator": "North East", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "866", + "brand": "Jio", + "operator": "Odisha", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "867", + "brand": "Jio", + "operator": "Punjab", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "868", + "brand": "Jio", + "operator": "Rajasthan", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "869", + "brand": "Jio", + "operator": "Tamil Nadu (incl. Chennai)", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "870", + "brand": "Jio", + "operator": "Uttar Pradesh (West)", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "871", + "brand": "Jio", + "operator": "Uttar Pradesh (East)", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "872", + "brand": "Jio", + "operator": "Delhi", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "873", + "brand": "Jio", + "operator": "Kolkata", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "874", + "brand": "Jio", + "operator": "Mumbai", + "status": "Operational", + "bands": "LTE 850 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "875", + "brand": "Uninor", + "operator": "Assam", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged with Airtel in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "880", + "brand": "Uninor", + "operator": "West Bengal", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged with Airtel in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "881", + "brand": "S Tel", + "operator": "Assam", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "License cancelled in 2012" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "908", + "brand": "Vi India", + "operator": "Andhra Pradesh and Telangana", + "status": "Operational", + "bands": "GSM 900 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "909", + "brand": "Vi India", + "operator": "Delhi", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "910", + "brand": "Vi India", + "operator": "Haryana", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE 2500", + "notes": "Former IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "911", + "brand": "Vi India", + "operator": "Maharashtra", + "status": "Not operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500", + "notes": "Former SPICE IDEA" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "912", + "brand": "Etisalat DB (cheers)", + "operator": "Andhra Pradesh and Telangana", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "License cancelled in 2012" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "913", + "brand": "Etisalat DB (cheers)", + "operator": "Delhi & NCR", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "License cancelled in 2012" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "914", + "brand": "Etisalat DB (cheers)", + "operator": "Gujarat", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "License cancelled in 2012" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "917", + "brand": "Etisalat DB (cheers)", + "operator": "Kerala", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "License cancelled in 2012" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "927", + "brand": "Uninor", + "operator": "Gujarat", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged with Airtel in 2018" + }, + { + "type": "National", + "countryName": "India", + "countryCode": "IN", + "mcc": "405", + "mnc": "929", + "brand": "Uninor", + "operator": "Maharashtra", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged with Airtel in 2018" + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "01", + "brand": null, + "operator": "Kish Cell Pars", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "02", + "brand": "ApTel, AzarTel", + "operator": "Negin Ertebatat Ava", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "03", + "brand": null, + "operator": "Parsian Hamrah Lotus", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "04", + "brand": null, + "operator": "TOSE E FANAVARI ERTEBATAT NOVIN HAMRAH", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "05", + "brand": "Smart Comm", + "operator": "Hamrah Hooshmand Ayandeh", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "06", + "brand": "Arian-Tel", + "operator": "Ertebatat-e Arian Tel Co.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "07", + "brand": null, + "operator": "Hooshmand Amin Mobile", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "08", + "brand": "Shatel Mobile", + "operator": "Shatel Group", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "09", + "brand": "HiWEB", + "operator": "Dadeh Dostar asr Novin PJSC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "10", + "brand": "Samantel", + "operator": "Samantel Mobile", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "11", + "brand": "IR-TCI (Hamrah-e-Avval)", + "operator": "Mobile Communications Company of Iran (MCI)", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "12", + "brand": "Avacell (HiWEB)", + "operator": "Dadeh Dostar asr Novin PJSC", + "status": "Operational", + "bands": "LTE 800 / TD-LTE 2600", + "notes": "Mostly in rural and remote areas" + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "13", + "brand": "HiWEB", + "operator": "Dadeh Dostar asr Novin PJSC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "14", + "brand": "TKC/KFZO", + "operator": "Kish Free Zone Organization", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "19", + "brand": "Espadan", + "operator": "Mobile Telecommunications Company of Esfahan", + "status": "Not operational", + "bands": "GSM 900", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "20", + "brand": "RighTel", + "operator": "Social Security Investment Co.", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "21", + "brand": "RighTel", + "operator": "Social Security Investment Co.", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "32", + "brand": "Taliya", + "operator": "Telecommunication Company of Iran (TCI)", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Roaming TKC & TCI" + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "35", + "brand": "MTN Irancell", + "operator": "MTN Irancell Telecommunications Services Company", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 3500 / TD-LTE 2300 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "40", + "brand": "Mobinnet", + "operator": "Ertebatat Mobinnet", + "status": "Operational", + "bands": "WiMAX / LTE 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "44", + "brand": "Mobinnet", + "operator": "Ertebatat Mobinnet", + "status": "Operational", + "bands": "WiMAX / LTE 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "45", + "brand": "Zi-Tel", + "operator": "Farabord Dadeh Haye Iranian Co.", + "status": "Operational", + "bands": "TD-LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "46", + "brand": "HiWEB", + "operator": "Dadeh Dostar asr Novin PJSC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "49", + "brand": null, + "operator": "Gostaresh Ertebatat Mabna", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "50", + "brand": "Shatel Mobile", + "operator": "Shatel Group", + "status": "Operational", + "bands": "TD-LTE 2600 MHz", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "51", + "brand": null, + "operator": "Pishgaman Tose'e Ertebatat", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "52", + "brand": null, + "operator": "Asiatech", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "70", + "brand": "MTCE", + "operator": "Telecommunication Company of Iran (TCI)", + "status": "Operational", + "bands": "GSM 900", + "notes": "Mostly in rural and remote areas (WLL)" + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "71", + "brand": "KOOHE NOOR", + "operator": "ERTEBATAT KOOHE NOOR", + "status": "Operational", + "bands": "GSM 900", + "notes": "Mostly in rural and remote areas (WLL)" + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "90", + "brand": "Iraphone", + "operator": "IRAPHONE GHESHM of Iran", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Mobile Phone" + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "93", + "brand": "Iraphone", + "operator": "Iraphone", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Mostly in rural and remote areas" + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "93", + "brand": "Farzanegan Pars", + "operator": "Farzanegan Pars", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Fixed Communication Provider (FCP)" + }, + { + "type": "National", + "countryName": "Iran", + "countryCode": "IR", + "mcc": "432", + "mnc": "99", + "brand": "TCI", + "operator": "TCI of Iran and Rightel", + "status": "Operational", + "bands": "GSM 850 / GSM 1900", + "notes": "Roaming IR70 & TCI & RIGHTEL (GSM WLL)" + }, + { + "type": "National", + "countryName": "Iraq", + "countryCode": "IQ", + "mcc": "418", + "mnc": "00", + "brand": "Asia Cell", + "operator": "Asia Cell Telecommunications Company", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Iraq", + "countryCode": "IQ", + "mcc": "418", + "mnc": "05", + "brand": "Asia Cell", + "operator": "Asia Cell Telecommunications Company", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Iraq", + "countryCode": "IQ", + "mcc": "418", + "mnc": "08", + "brand": "SanaTel", + "operator": null, + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Iraq", + "countryCode": "IQ", + "mcc": "418", + "mnc": "20", + "brand": "Zain", + "operator": "Zain Iraq", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Former MTC Atheer" + }, + { + "type": "National", + "countryName": "Iraq", + "countryCode": "IQ", + "mcc": "418", + "mnc": "30", + "brand": "Zain", + "operator": "Zain Iraq", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Former Orascom Telecom (Iraqna)" + }, + { + "type": "National", + "countryName": "Iraq", + "countryCode": "IQ", + "mcc": "418", + "mnc": "40", + "brand": "Korek", + "operator": "Telecom Ltd", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Iraq", + "countryCode": "IQ", + "mcc": "418", + "mnc": "45", + "brand": "Mobitel", + "operator": "Mobitel Co. Ltd.", + "status": "Operational", + "bands": "UMTS", + "notes": null + }, + { + "type": "National", + "countryName": "Iraq", + "countryCode": "IQ", + "mcc": "418", + "mnc": "62", + "brand": "Itisaluna", + "operator": "Itisaluna Wireless CO.", + "status": "Operational", + "bands": "CDMA 800 / CDMA 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Iraq", + "countryCode": "IQ", + "mcc": "418", + "mnc": "92", + "brand": "Omnnea", + "operator": "Omnnea Wireless", + "status": "Operational", + "bands": "CDMA", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "01", + "brand": "Partner", + "operator": "Partner Communications Company Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / 5G 2600 / 5G 3500", + "notes": "Former Orange (until 2016)" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "02", + "brand": "Cellcom", + "operator": "Cellcom Israel Ltd.", + "status": "Operational", + "bands": "GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800 / 5G 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "03", + "brand": "Pelephone", + "operator": "Pelephone Communications Ltd.", + "status": "Operational", + "bands": "UMTS 850 / UMTS 2100 / LTE 1800 / 5G 2600 / 5G 3500", + "notes": "CDMA 850 shut down July 2017" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "04", + "brand": null, + "operator": "Globalsim Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "05", + "brand": "Jawwal", + "operator": "Palestine Cellular Communications Ltd.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": "Covering the Palestinian territories" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "06", + "brand": "Wataniya Mobile", + "operator": "Wataniya Palestine Ltd. (Ooredoo)", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Covering the Palestinian territories" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "07", + "brand": "Hot Mobile", + "operator": "Hot Mobile Ltd.", + "status": "Operational", + "bands": "iDEN 800 / UMTS 2100 / LTE 1800 / LTE 2100 / 5G 2600 / 5G 3500", + "notes": "Former Mirs Communications; uses Pelephone network for roaming" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "08", + "brand": "Golan Telecom", + "operator": "Golan Telecom Ltd.", + "status": "Operational", + "bands": "UMTS 2100 / LTE 1800", + "notes": "Acquired by Cellcom in Aug 2020" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "09", + "brand": "We4G", + "operator": "Marathon 018 Xphone Ltd.", + "status": "Operational", + "bands": "LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "10", + "brand": "Partner", + "operator": "Partner Communications Company Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800", + "notes": "Former Orange (until 2016)" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "11", + "brand": null, + "operator": "365 Telecom", + "status": "Not operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "12", + "brand": "x2one", + "operator": "Widely Mobile", + "status": "Operational", + "bands": "MVNO", + "notes": "Former Free Telecom" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "13", + "brand": null, + "operator": "Ituran Cellular Communications", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "14", + "brand": "Youphone", + "operator": "Alon Cellular Ltd.", + "status": "Not operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "15", + "brand": "Home Cellular", + "operator": "Home Cellular Ltd.", + "status": "Not operational", + "bands": "MVNO", + "notes": "MVNO (Cellcom)" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "16", + "brand": "Rami Levy", + "operator": "Rami Levy Communications Ltd.", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO (Pelephone)" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "17", + "brand": "Sipme", + "operator": "Gale Phone", + "status": "Not operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "18", + "brand": "Cellact Communications", + "operator": "Cellact Communications Ltd.", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO (Pelephone)" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "19", + "brand": "019 Mobile", + "operator": "019 Communication Services Ltd. / TELZAR", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "20", + "brand": "Bezeq", + "operator": "Bezeq The Israeli Telecommunication Corp Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "21", + "brand": "Bezeq International", + "operator": "B.I.P. Communications Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "22", + "brand": null, + "operator": "Maskyoo Telephonia Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "23", + "brand": null, + "operator": "Beezz Communication Solutions Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "24", + "brand": "012 Mobile", + "operator": "Partner Communications Company Ltd.", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO (Partner)" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "25", + "brand": "IMOD", + "operator": "Israel Ministry of Defense", + "status": "Operational", + "bands": "LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "26", + "brand": "Annatel", + "operator": "LB Annatel Ltd.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "27", + "brand": null, + "operator": "BITIT Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "28", + "brand": null, + "operator": "PHI Networks", + "status": "Unknown", + "bands": "LTE 1800 / 5G 2600 / 5G 3500", + "notes": "Joint venture between Partner Communications Company and Hot Mobile" + }, + { + "type": "National", + "countryName": "Israel", + "countryCode": "IL", + "mcc": "425", + "mnc": "29", + "brand": null, + "operator": "CG Networks", + "status": "Unknown", + "bands": "Unknown", + "notes": "Joint venture between Cellcom, Golan Telecom and Exphone" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "00", + "brand": "Y!Mobile", + "operator": "SoftBank Corp.", + "status": "Operational", + "bands": "UMTS 1800", + "notes": "band 3; UMTS to shut down Jan 2024" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "01", + "brand": null, + "operator": "KDDI Corporation", + "status": "Operational", + "bands": "TD-LTE 2500", + "notes": "band 41; WiMAX 2500 shut down 31 Mar 2020; former UQ Communications" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "02", + "brand": null, + "operator": "Hanshin Cable Engineering Co., Ltd.", + "status": "Unknown", + "bands": "WiMAX 2500", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "03", + "brand": "IIJmio", + "operator": "Internet Initiative Japan Inc.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "04", + "brand": null, + "operator": "Japan Radio Company, Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "05", + "brand": null, + "operator": "Wireless City Planning Inc.", + "status": "Operational", + "bands": "TD-LTE 2500", + "notes": "band 41; owned by SoftBank" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "06", + "brand": null, + "operator": "SAKURA Internet Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "07", + "brand": null, + "operator": "closip, Inc.", + "status": "Unknown", + "bands": "MVNO", + "notes": "Former LTE-X" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "08", + "brand": null, + "operator": "Panasonic Connect Co., Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "09", + "brand": null, + "operator": "Marubeni Network Solutions Inc.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "10", + "brand": "NTT docomo", + "operator": "NTT DoCoMo, Inc.", + "status": "Operational", + "bands": "UMTS 850 / UMTS 2100 / LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 3500 / 5G 3500 / 5G 4700 / 5G 28000", + "notes": "bands 1, 3, 19, 21, 28, 42; UMTS to shut down Mar 2026" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "11", + "brand": "Rakuten Mobile", + "operator": "Rakuten Mobile Network, Inc.", + "status": "Operational", + "bands": "LTE 1800 / 5G 3700", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "12", + "brand": null, + "operator": "Cable media waiwai Co., Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "13", + "brand": null, + "operator": "NTT Communications Corporation", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "14", + "brand": null, + "operator": "Grape One Co., Ltd.", + "status": "Unknown", + "bands": "5G", + "notes": "Private 5G networks" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "15", + "brand": null, + "operator": "BB Backbone Corp.", + "status": "Unknown", + "bands": "LTE", + "notes": "Private LTE networks" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "16", + "brand": null, + "operator": "Nokia Innovations Japan G.K.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "17", + "brand": null, + "operator": "Osaka Gas Business Create Co., Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "18", + "brand": null, + "operator": "Kintetsu Cable Network Co., Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "19", + "brand": null, + "operator": "NEC Networks & System Integration Corporation", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "20", + "brand": "SoftBank", + "operator": "SoftBank Corp.", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 900 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 3700 / 5G 28000", + "notes": "bands 1, 3, 8, 11, 28, 41, 42; UMTS to shut down Jan 2024" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "21", + "brand": "SoftBank", + "operator": "SoftBank Corp.", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 900 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 3700 / 5G 28000", + "notes": "bands 1, 3, 8, 11, 28, 41, 42; UMTS to shut down Jan 2024" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "22", + "brand": null, + "operator": "JTOWER Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "23", + "brand": null, + "operator": "Fujitsu Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "50", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Operational", + "bands": "LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 800 / 5G 3500 / 5G 3700 / 5G 28000", + "notes": "bands 1, 3, 11, 18, 28, 41, 42" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "51", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Operational", + "bands": "LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 800 / 5G 3500 / 5G 3700 / 5G 28000", + "notes": "bands 1, 3, 11, 18, 28, 41, 42" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "52", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Operational", + "bands": "LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 800 / 5G 3500 / 5G 3700 / 5G 28000", + "notes": "bands 1, 3, 11, 18, 28, 41, 42" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "53", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Operational", + "bands": "LTE 700 / LTE 850 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 800 / 5G 3500 / 5G 3700 / 5G 28000", + "notes": "bands 1, 3, 11, 18, 28, 41, 42" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "54", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Not operational", + "bands": "CDMA 850 / CDMA 2000", + "notes": "CDMA shut down 31 Mar 2022" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "70", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Not operational", + "bands": "CDMA 850 / CDMA 2000", + "notes": "CDMA shut down 31 Mar 2022, MNC withdrawn" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "71", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Not operational", + "bands": "CDMA 850 / CDMA 2000", + "notes": "CDMA shut down 31 Mar 2022, MNC withdrawn" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "72", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Not operational", + "bands": "CDMA 850 / CDMA 2000", + "notes": "CDMA shut down 31 Mar 2022, MNC withdrawn" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "73", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Not operational", + "bands": "CDMA 850 / CDMA 2000", + "notes": "CDMA shut down 31 Mar 2022, MNC withdrawn" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "74", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Not operational", + "bands": "CDMA 850 / CDMA 2000", + "notes": "CDMA shut down 31 Mar 2022, MNC withdrawn" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "75", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Not operational", + "bands": "CDMA 850 / CDMA 2000", + "notes": "CDMA shut down 31 Mar 2022, MNC withdrawn" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "76", + "brand": "au", + "operator": "KDDI Corporation", + "status": "Not operational", + "bands": "CDMA 850 / CDMA 2000", + "notes": "CDMA shut down 31 Mar 2022, MNC withdrawn" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "440", + "mnc": "78", + "brand": "au", + "operator": "Okinawa Cellular Telephone", + "status": "Not operational", + "bands": "CDMA 850 / CDMA 2000", + "notes": "CDMA shut down 31 Mar 2022" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "00", + "brand": null, + "operator": "Wireless City Planning Inc.", + "status": "Operational", + "bands": "TD-LTE 2500", + "notes": "band 41; owned by SoftBank" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "01", + "brand": "SoftBank", + "operator": "SoftBank Corp.", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 900 / LTE 1500 / LTE 1800 / LTE 2100 / TD-LTE 2500 / TD-LTE 3500 / 5G 3700", + "notes": "bands 1, 3, 8, 11, 28, 41, 42; UMTS to shut down Jan 2024" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "10", + "brand": "UQ WiMAX", + "operator": "UQ Communications Inc.", + "status": "Not operational", + "bands": "TD-LTE 2500", + "notes": "band 41; WiMAX 2500 shut down 31 Mar 2020; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "200", + "brand": null, + "operator": "Soracom Inc.", + "status": "Operational", + "bands": "MVNO", + "notes": "IoT" + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "201", + "brand": null, + "operator": "Aurens Co., Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "202", + "brand": null, + "operator": "Sony Wireless Communications Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "203", + "brand": null, + "operator": "Gujo City", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "204", + "brand": null, + "operator": "Wicom Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "205", + "brand": null, + "operator": "Katch Network Inc.", + "status": "Operational", + "bands": "5G 4700", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "206", + "brand": null, + "operator": "Mitsubishi Electric Corp.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "207", + "brand": null, + "operator": "Mitsui Knowledge Industry Co., Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "208", + "brand": null, + "operator": "Chudenko Corp.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "209", + "brand": null, + "operator": "Cable Television Toyama Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "210", + "brand": null, + "operator": "Nippon Telegraph and Telephone East Corp.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "211", + "brand": null, + "operator": "Starcat Cable Network Co., Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "212", + "brand": null, + "operator": "I-TEC Solutions Co., Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Japan", + "countryCode": "JP", + "mcc": "441", + "mnc": "91", + "brand": null, + "operator": "Tokyo Organising Committee of the Olympic and Paralympic Games", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Jordan", + "countryCode": "JO", + "mcc": "416", + "mnc": "01", + "brand": "zain JO", + "operator": "Jordan Mobile Telephone Services", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": "Former Fastlink" + }, + { + "type": "National", + "countryName": "Jordan", + "countryCode": "JO", + "mcc": "416", + "mnc": "02", + "brand": "XPress Telecom", + "operator": "XPress Telecom", + "status": "Not operational", + "bands": "iDEN 800", + "notes": "Shut down in 2010" + }, + { + "type": "National", + "countryName": "Jordan", + "countryCode": "JO", + "mcc": "416", + "mnc": "03", + "brand": "Umniah", + "operator": "Umniah Mobile Company", + "status": "Operational", + "bands": "UMTS 2100 / LTE 1800 / LTE 3500", + "notes": "GSM shut down 2022" + }, + { + "type": "National", + "countryName": "Jordan", + "countryCode": "JO", + "mcc": "416", + "mnc": "77", + "brand": "Orange", + "operator": "Petra Jordanian Mobile Telecommunications Company (MobileCom)", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Kazakhstan", + "countryCode": "KZ", + "mcc": "401", + "mnc": "01", + "brand": "Beeline", + "operator": "KaR-Tel LLP", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Kazakhstan", + "countryCode": "KZ", + "mcc": "401", + "mnc": "02", + "brand": "Kcell", + "operator": "Kcell JSC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G", + "notes": null + }, + { + "type": "National", + "countryName": "Kazakhstan", + "countryCode": "KZ", + "mcc": "401", + "mnc": "07", + "brand": "Altel", + "operator": "Altel", + "status": "Operational", + "bands": "UMTS 850 / GSM 1800 / LTE 1800", + "notes": "CDMA 800 closed 1 July 2015; acquired by Tele2" + }, + { + "type": "National", + "countryName": "Kazakhstan", + "countryCode": "KZ", + "mcc": "401", + "mnc": "08", + "brand": "Kazakhtelecom", + "operator": null, + "status": "Operational", + "bands": "CDMA 450 / CDMA 800", + "notes": null + }, + { + "type": "National", + "countryName": "Kazakhstan", + "countryCode": "KZ", + "mcc": "401", + "mnc": "77", + "brand": "Tele2.kz", + "operator": "MTS", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / 5G", + "notes": "Called Mobile Telecom Service before its acquisition by Tele2" + }, + { + "type": "National", + "countryName": "North Korea", + "countryCode": "KP", + "mcc": "467", + "mnc": "05", + "brand": "Koryolink", + "operator": "Cheo Technology Jv Company", + "status": "Operational", + "bands": "UMTS 2100", + "notes": "for foreigners" + }, + { + "type": "National", + "countryName": "North Korea", + "countryCode": "KP", + "mcc": "467", + "mnc": "06", + "brand": "Kang Song NET", + "operator": "Korea Posts and Telecommunications Corporation", + "status": "Operational", + "bands": "UMTS 2100", + "notes": "for DPRK citizens. Government owned." + }, + { + "type": "National", + "countryName": "North Korea", + "countryCode": "KP", + "mcc": "467", + "mnc": "193", + "brand": "SunNet", + "operator": "Korea Posts and Telecommunications Corporation", + "status": "Not operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "South Korea", + "countryCode": "KR", + "mcc": "450", + "mnc": "01", + "brand": null, + "operator": "Globalstar Asia Pacific", + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "National", + "countryName": "South Korea", + "countryCode": "KR", + "mcc": "450", + "mnc": "02", + "brand": "KT", + "operator": "KT", + "status": "Operational", + "bands": "5G 3500", + "notes": "former Hansol PCS (CDMA 1800), merged with KT in 2002" + }, + { + "type": "National", + "countryName": "South Korea", + "countryCode": "KR", + "mcc": "450", + "mnc": "03", + "brand": "Power 017", + "operator": "Shinsegi Telecom, Inc.", + "status": "Not operational", + "bands": "CDMA 850", + "notes": "Merged with SK Telecom in 2002; MNC withdrawn" + }, + { + "type": "National", + "countryName": "South Korea", + "countryCode": "KR", + "mcc": "450", + "mnc": "04", + "brand": "KT", + "operator": "KT", + "status": "Operational", + "bands": "LTE 1800", + "notes": "NB-IoT network (LTE Cat NB1); former CDMA 1800" + }, + { + "type": "National", + "countryName": "South Korea", + "countryCode": "KR", + "mcc": "450", + "mnc": "05", + "brand": "SKTelecom", + "operator": "SK Telecom", + "status": "Operational", + "bands": "UMTS 2100 / LTE 850 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500 / 5G 28000", + "notes": "CDMA 850 shut down June 2020" + }, + { + "type": "National", + "countryName": "South Korea", + "countryCode": "KR", + "mcc": "450", + "mnc": "06", + "brand": "LG U+", + "operator": "LG Telecom", + "status": "Operational", + "bands": "LTE 850 / LTE 2100 / LTE 2600 / 5G 3500", + "notes": "CDMA 1800 shut down June 2021" + }, + { + "type": "National", + "countryName": "South Korea", + "countryCode": "KR", + "mcc": "450", + "mnc": "07", + "brand": "KT", + "operator": "KT", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Korea", + "countryCode": "KR", + "mcc": "450", + "mnc": "08", + "brand": "olleh", + "operator": "KT", + "status": "Operational", + "bands": "UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "South Korea", + "countryCode": "KR", + "mcc": "450", + "mnc": "11", + "brand": "Tplus", + "operator": "Korea Cable Telecom", + "status": "Operational", + "bands": "MVNO", + "notes": "MVNO of SK Telecom" + }, + { + "type": "National", + "countryName": "South Korea", + "countryCode": "KR", + "mcc": "450", + "mnc": "12", + "brand": "SKTelecom", + "operator": "SK Telecom", + "status": "Operational", + "bands": "LTE 850 / LTE 1800", + "notes": "IoT network (LTE Cat M1)" + }, + { + "type": "National", + "countryName": "Kuwait", + "countryCode": "KW", + "mcc": "419", + "mnc": "02", + "brand": "zain KW", + "operator": "Zain Kuwait", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Kuwait", + "countryCode": "KW", + "mcc": "419", + "mnc": "03", + "brand": "Ooredoo", + "operator": "National Mobile Telecommunications", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Kuwait", + "countryCode": "KW", + "mcc": "419", + "mnc": "04", + "brand": "STC", + "operator": "Saudi Telecom Company", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 2100 / 5G 3500", + "notes": "Former VIVA" + }, + { + "type": "National", + "countryName": "Kyrgyzstan", + "countryCode": "KG", + "mcc": "437", + "mnc": "01", + "brand": "Beeline", + "operator": "Sky Mobile LLC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800", + "notes": "Former Bitel" + }, + { + "type": "National", + "countryName": "Kyrgyzstan", + "countryCode": "KG", + "mcc": "437", + "mnc": "03", + "brand": null, + "operator": "7 Mobile", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Fonex/Aktel" + }, + { + "type": "National", + "countryName": "Kyrgyzstan", + "countryCode": "KG", + "mcc": "437", + "mnc": "05", + "brand": "MegaCom", + "operator": "Alfa Telecom CJSC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Kyrgyzstan", + "countryCode": "KG", + "mcc": "437", + "mnc": "09", + "brand": "O!", + "operator": "NurTelecom LLC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Kyrgyzstan", + "countryCode": "KG", + "mcc": "437", + "mnc": "10", + "brand": null, + "operator": "Saima Telecom", + "status": "Operational", + "bands": "LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Kyrgyzstan", + "countryCode": "KG", + "mcc": "437", + "mnc": "11", + "brand": null, + "operator": "iTel", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Laos", + "countryCode": "LA", + "mcc": "457", + "mnc": "01", + "brand": "LaoTel", + "operator": "Lao Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G", + "notes": null + }, + { + "type": "National", + "countryName": "Laos", + "countryCode": "LA", + "mcc": "457", + "mnc": "02", + "brand": "ETL", + "operator": "Enterprise of Telecommunications Lao", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Laos", + "countryCode": "LA", + "mcc": "457", + "mnc": "03", + "brand": "Unitel", + "operator": "Star Telecom Co., Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Lao-Asia Telecom Company (LAT); owned by Viettel" + }, + { + "type": "National", + "countryName": "Laos", + "countryCode": "LA", + "mcc": "457", + "mnc": "07", + "brand": "Best", + "operator": "Best Telecom Co., Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Laos", + "countryCode": "LA", + "mcc": "457", + "mnc": "08", + "brand": "TPLUS", + "operator": "TPLUS Digital Sole Co., Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Former Millicom (Tigo), VimpelCom (Beeline)" + }, + { + "type": "National", + "countryName": "Lebanon", + "countryCode": "LB", + "mcc": "415", + "mnc": "01", + "brand": "Alfa", + "operator": "MIC 1", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Lebanon", + "countryCode": "LB", + "mcc": "415", + "mnc": "03", + "brand": "Touch", + "operator": "MIC 2", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Lebanon", + "countryCode": "LB", + "mcc": "415", + "mnc": "05", + "brand": "Ogero Mobile", + "operator": "Ogero Telecom", + "status": "Not operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Macau (People's Republic of China)", + "countryCode": "MO", + "mcc": "455", + "mnc": "00", + "brand": "SmarTone", + "operator": "Smartone – Comunicações Móveis, S.A.", + "status": "Operational", + "bands": "UMTS 2100 / LTE 1800", + "notes": "GSM shut down 1 Aug 2019" + }, + { + "type": "National", + "countryName": "Macau (People's Republic of China)", + "countryCode": "MO", + "mcc": "455", + "mnc": "01", + "brand": "CTM", + "operator": "Companhia de Telecomunicações de Macau, S.A.R.L.", + "status": "Operational", + "bands": "LTE 1800 / 5G 3500", + "notes": "GSM shut down 1 Aug 2019" + }, + { + "type": "National", + "countryName": "Macau (People's Republic of China)", + "countryCode": "MO", + "mcc": "455", + "mnc": "02", + "brand": "China Telecom", + "operator": "China Telecom (Macau) Company Limited", + "status": "Not operational", + "bands": "CDMA 800", + "notes": "Shut down 2010" + }, + { + "type": "National", + "countryName": "Macau (People's Republic of China)", + "countryCode": "MO", + "mcc": "455", + "mnc": "03", + "brand": "3", + "operator": "Hutchison Telephone (Macau), Limitada", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "GSM shut down 1 Aug 2019" + }, + { + "type": "National", + "countryName": "Macau (People's Republic of China)", + "countryCode": "MO", + "mcc": "455", + "mnc": "04", + "brand": "CTM", + "operator": "Companhia de Telecomunicações de Macau, S.A.R.L.", + "status": "Operational", + "bands": "UMTS 2100", + "notes": "GSM shut down 1 Aug 2019" + }, + { + "type": "National", + "countryName": "Macau (People's Republic of China)", + "countryCode": "MO", + "mcc": "455", + "mnc": "05", + "brand": "3", + "operator": "Hutchison Telephone (Macau), Limitada", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Macau (People's Republic of China)", + "countryCode": "MO", + "mcc": "455", + "mnc": "06", + "brand": "SmarTone", + "operator": "Smartone – Comunicações Móveis, S.A.", + "status": "Operational", + "bands": "UMTS 2100", + "notes": "GSM shut down 1 Aug 2019" + }, + { + "type": "National", + "countryName": "Macau (People's Republic of China)", + "countryCode": "MO", + "mcc": "455", + "mnc": "07", + "brand": "China Telecom", + "operator": "China Telecom (Macau) Limitada", + "status": "Operational", + "bands": "LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Maldives", + "countryCode": "MV", + "mcc": "472", + "mnc": "01", + "brand": "Dhiraagu", + "operator": "Dhivehi Raajjeyge Gulhun", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Maldives", + "countryCode": "MV", + "mcc": "472", + "mnc": "02", + "brand": "Ooredoo", + "operator": "Ooredoo Maldives", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2600 / 5G", + "notes": "Former Wataniya Telecom" + }, + { + "type": "National", + "countryName": "Mongolia", + "countryCode": "MN", + "mcc": "428", + "mnc": "88", + "brand": "Unitel", + "operator": "Unitel LLC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Mongolia", + "countryCode": "MN", + "mcc": "428", + "mnc": "91", + "brand": "Skytel", + "operator": "Skytel LLC", + "status": "Operational", + "bands": "CDMA 850 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Mongolia", + "countryCode": "MN", + "mcc": "428", + "mnc": "98", + "brand": "G-Mobile", + "operator": "G-Mobile LLC", + "status": "Operational", + "bands": "CDMA 450 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Mongolia", + "countryCode": "MN", + "mcc": "428", + "mnc": "99", + "brand": "Mobicom", + "operator": "Mobicom Corporation", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 700 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "00", + "brand": "MPT", + "operator": "Myanmar Posts and Telecommunications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "01", + "brand": "MPT", + "operator": "Myanmar Posts and Telecommunications", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "02", + "brand": "MPT", + "operator": "Myanmar Posts and Telecommunications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "03", + "brand": "CDMA800", + "operator": "Myanmar Economic Corporation", + "status": "Operational", + "bands": "CDMA 800", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "04", + "brand": "MPT", + "operator": "Myanmar Posts and Telecommunications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "05", + "brand": "Ooredoo", + "operator": "Ooredoo Myanmar", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "06", + "brand": "Telenor", + "operator": "Telenor Myanmar", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "09", + "brand": "Mytel", + "operator": "Myanmar National Tele & Communication Co., Ltd", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "20", + "brand": "ACS", + "operator": "Amara Communication Co., Ltd", + "status": "Operational", + "bands": "TD-LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "21", + "brand": "ACS", + "operator": "Amara Communication Co., Ltd", + "status": "Operational", + "bands": "TD-LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "22", + "brand": null, + "operator": "Fortune Telecom Co., Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Myanmar", + "countryCode": "MM", + "mcc": "414", + "mnc": "23", + "brand": null, + "operator": "Global Technology Co., Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Nepal", + "countryCode": "NP", + "mcc": "429", + "mnc": "01", + "brand": "Namaste / NT Mobile / Sky Phone", + "operator": "Nepal Telecom (NDCL)", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": "WiMAX 2300, CDMA 850 shut down in 2021" + }, + { + "type": "National", + "countryName": "Nepal", + "countryCode": "NP", + "mcc": "429", + "mnc": "02", + "brand": "Ncell", + "operator": "Ncell Pvt. Ltd.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Nepal", + "countryCode": "NP", + "mcc": "429", + "mnc": "03", + "brand": "UTL", + "operator": "United Telecom Limited", + "status": "Operational", + "bands": "CDMA2000 800", + "notes": null + }, + { + "type": "National", + "countryName": "Nepal", + "countryCode": "NP", + "mcc": "429", + "mnc": "04", + "brand": "SmartCell", + "operator": "Smart Telecom Pvt. Ltd. (STPL)", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Oman", + "countryCode": "OM", + "mcc": "422", + "mnc": "02", + "brand": "Omantel", + "operator": "Oman Telecommunications Company", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 1800 / TD-LTE 2300 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Oman", + "countryCode": "OM", + "mcc": "422", + "mnc": "03", + "brand": "Ooredoo", + "operator": "Omani Qatari Telecommunications Company SAOC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 800 / LTE 1800 / TD-LTE 2300 / 5G 3500", + "notes": "Former Nawras" + }, + { + "type": "National", + "countryName": "Oman", + "countryCode": "OM", + "mcc": "422", + "mnc": "04", + "brand": "Omantel", + "operator": "Oman Telecommunications Company", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Oman", + "countryCode": "OM", + "mcc": "422", + "mnc": "06", + "brand": "Vodafone", + "operator": "Oman Future Telecommunications Company SAOC", + "status": "Operational", + "bands": "5G 700", + "notes": null + }, + { + "type": "National", + "countryName": "Pakistan", + "countryCode": "PK", + "mcc": "410", + "mnc": "01", + "brand": "Jazz", + "operator": "Mobilink-PMCL", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800", + "notes": "Former Mobilink" + }, + { + "type": "National", + "countryName": "Pakistan", + "countryCode": "PK", + "mcc": "410", + "mnc": "02", + "brand": "3G EVO / CharJi 4G", + "operator": "PTCL", + "status": "Operational", + "bands": "CDMA2000 1900 / TD-LTE 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Pakistan", + "countryCode": "PK", + "mcc": "410", + "mnc": "03", + "brand": "Ufone", + "operator": "Pakistan Telecommunication Mobile Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Pakistan", + "countryCode": "PK", + "mcc": "410", + "mnc": "04", + "brand": "Zong", + "operator": "China Mobile", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": "Former Paktel" + }, + { + "type": "National", + "countryName": "Pakistan", + "countryCode": "PK", + "mcc": "410", + "mnc": "05", + "brand": "SCO Mobile", + "operator": "SCO Mobile Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Pakistan", + "countryCode": "PK", + "mcc": "410", + "mnc": "06", + "brand": "Telenor", + "operator": "Telenor Pakistan", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 850 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Pakistan", + "countryCode": "PK", + "mcc": "410", + "mnc": "07", + "brand": "Jazz", + "operator": "WaridTel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Warid Pakistan" + }, + { + "type": "National", + "countryName": "Pakistan", + "countryCode": "PK", + "mcc": "410", + "mnc": "08", + "brand": "SCO Mobile", + "operator": "SCO Mobile Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Palestine", + "countryCode": "PS", + "mcc": "425", + "mnc": "05", + "brand": "Jawwal", + "operator": "Palestine Cellular Communications, Ltd.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Palestine", + "countryCode": "PS", + "mcc": "425", + "mnc": "06", + "brand": "Ooredoo", + "operator": "Ooredoo Palestine", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Former Wataniya" + }, + { + "type": "National", + "countryName": "Qatar", + "countryCode": "QA", + "mcc": "427", + "mnc": "01", + "brand": "Ooredoo", + "operator": "Ooredoo", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "Former Qtel (Qatar Telecom)" + }, + { + "type": "National", + "countryName": "Qatar", + "countryCode": "QA", + "mcc": "427", + "mnc": "02", + "brand": "Vodafone", + "operator": "Vodafone Qatar", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Qatar", + "countryCode": "QA", + "mcc": "427", + "mnc": "05", + "brand": "Ministry of Interior", + "operator": "Ministry of Interior", + "status": "Operational", + "bands": "TETRA 380", + "notes": null + }, + { + "type": "National", + "countryName": "Qatar", + "countryCode": "QA", + "mcc": "427", + "mnc": "06", + "brand": "Ministry of Interior", + "operator": "Ministry of Interior", + "status": "Operational", + "bands": "LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Saudi Arabia", + "countryCode": "SA", + "mcc": "420", + "mnc": "01", + "brand": "Al Jawal (STC )", + "operator": "Saudi Telecom Company", + "status": "Operational", + "bands": "GSM 900 / LTE 700 / LTE 1800 / LTE 2100 / TD-LTE 2300 / 5G 3500", + "notes": "UMTS shut down 2022" + }, + { + "type": "National", + "countryName": "Saudi Arabia", + "countryCode": "SA", + "mcc": "420", + "mnc": "03", + "brand": "Mobily", + "operator": "Etihad Etisalat Company", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800 / TD-LTE 2500", + "notes": null + }, + { + "type": "National", + "countryName": "Saudi Arabia", + "countryCode": "SA", + "mcc": "420", + "mnc": "04", + "brand": "Zain SA", + "operator": "Zain Saudi Arabia", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / TD-LTE 2500 / 5G 2500 / 5G 3500", + "notes": "Active September 2008" + }, + { + "type": "National", + "countryName": "Saudi Arabia", + "countryCode": "SA", + "mcc": "420", + "mnc": "05", + "brand": "Virgin Mobile", + "operator": "Virgin Mobile Saudi Arabia", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Al Jawal network" + }, + { + "type": "National", + "countryName": "Saudi Arabia", + "countryCode": "SA", + "mcc": "420", + "mnc": "06", + "brand": "Lebara Mobile", + "operator": "Lebara Mobile", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Saudi Arabia", + "countryCode": "SA", + "mcc": "420", + "mnc": "21", + "brand": "RGSM", + "operator": "Saudi Railways GSM", + "status": "Operational", + "bands": "GSM-R 900", + "notes": null + }, + { + "type": "National", + "countryName": "Sri Lanka", + "countryCode": "LK", + "mcc": "413", + "mnc": "01", + "brand": "SLTMobitel", + "operator": "Mobitel (Pvt) Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 850 / LTE 900 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Sri Lanka", + "countryCode": "LK", + "mcc": "413", + "mnc": "02", + "brand": "Dialog", + "operator": "Dialog Axiata PLC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former MTN" + }, + { + "type": "National", + "countryName": "Sri Lanka", + "countryCode": "LK", + "mcc": "413", + "mnc": "03", + "brand": "Hutch", + "operator": "Hutchison Telecommunications Lanka (Pvt) Ltd", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Former Etisalat; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Sri Lanka", + "countryCode": "LK", + "mcc": "413", + "mnc": "04", + "brand": "Lanka Bell", + "operator": "Lanka Bell Ltd", + "status": "Operational", + "bands": "CDMA / WiMAX / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Sri Lanka", + "countryCode": "LK", + "mcc": "413", + "mnc": "05", + "brand": "Airtel", + "operator": "Bharti Airtel Lanka (Pvt) Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 850 / LTE 2100 / TD-LTE 2500", + "notes": null + }, + { + "type": "National", + "countryName": "Sri Lanka", + "countryCode": "LK", + "mcc": "413", + "mnc": "08", + "brand": "Hutch", + "operator": "Hutchison Telecommunications Lanka (Pvt) Ltd", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 900 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Sri Lanka", + "countryCode": "LK", + "mcc": "413", + "mnc": "09", + "brand": "Hutch", + "operator": "Hutchison Telecommunications Lanka (Pvt) Ltd", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Sri Lanka", + "countryCode": "LK", + "mcc": "413", + "mnc": "11", + "brand": "Dialog", + "operator": "Dialog Broadband Networks (Pvt) Ltd", + "status": "Operational", + "bands": "CDMA / WiMAX / TD-LTE 2300", + "notes": "Fixed wireless" + }, + { + "type": "National", + "countryName": "Sri Lanka", + "countryCode": "LK", + "mcc": "413", + "mnc": "12", + "brand": "SLTMobitel", + "operator": "Sri Lanka Telecom PLC", + "status": "Operational", + "bands": "TD-LTE 2600", + "notes": "Fixed wireless" + }, + { + "type": "National", + "countryName": "Syria", + "countryCode": "SY", + "mcc": "417", + "mnc": "01", + "brand": "Syriatel", + "operator": "Syriatel Mobile Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Syria", + "countryCode": "SY", + "mcc": "417", + "mnc": "02", + "brand": "MTN", + "operator": "MTN Syria", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Spacetel" + }, + { + "type": "National", + "countryName": "Syria", + "countryCode": "SY", + "mcc": "417", + "mnc": "03", + "brand": null, + "operator": "Wafa Telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Syria", + "countryCode": "SY", + "mcc": "417", + "mnc": "09", + "brand": null, + "operator": "Syrian Telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "01", + "brand": "FarEasTone", + "operator": "Far EasTone Telecommunications Co Ltd", + "status": "Operational", + "bands": "LTE 700 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "LTE band 28;" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "02", + "brand": "FarEasTone", + "operator": "Far EasTone Telecommunications Co Ltd", + "status": "Not operational", + "bands": "GSM 900", + "notes": "GSM shut down July 2017" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "03", + "brand": "FarEasTone", + "operator": "Far EasTone Telecommunications Co Ltd", + "status": "Not operational", + "bands": "UMTS 2100", + "notes": "UMTS shut down Dec 2018" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "05", + "brand": "Gt", + "operator": "Asia Pacific Telecom", + "status": "Operational", + "bands": "LTE 700 / LTE 900 / TD-LTE 2600 / 5G 3500 / 5G 28000", + "notes": "LTE bands 28 / 8 / 41; CDMA 850 MHz shut down Dec 2017" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "06", + "brand": "FarEasTone", + "operator": "Far EasTone Telecommunications Co Ltd", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Former KG Telecom until 2004" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "07", + "brand": "FarEasTone", + "operator": "Far EasTone Telecommunications Co Ltd", + "status": "Not operational", + "bands": "WiMAX 2600", + "notes": "Shut down in 2015" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "09", + "brand": "VMAX", + "operator": "Vmax Telecom", + "status": "Operational", + "bands": "WiMAX 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "10", + "brand": "G1", + "operator": "Global Mobile Corp.", + "status": "Operational", + "bands": "WiMAX 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "11", + "brand": "Chunghwa LDM", + "operator": "LDTA/Chunghwa Telecom", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Also known as \"Long Distance & Mobile Business Group\"" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "12", + "brand": null, + "operator": "Ambit Microsystems", + "status": "Operational", + "bands": "LTE 700 / LTE 900", + "notes": "Subsidiary of Foxconn; LTE band 28" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "56", + "brand": "FITEL", + "operator": "First International Telecom", + "status": "Not operational", + "bands": "WiMAX 2600 / PHS", + "notes": "Bankruptcy in 2014" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "68", + "brand": null, + "operator": "Tatung InfoComm", + "status": "Not operational", + "bands": "WiMAX 2600", + "notes": "License expired in 2014" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "88", + "brand": "FarEasTone", + "operator": "Far EasTone Telecommunications Co Ltd", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Former KG Telecom until 2004, KG Telecom brand used until 2009" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "89", + "brand": "T Star", + "operator": "Taiwan Star Telecom", + "status": "Operational", + "bands": "LTE 900 / LTE 2600 / 5G 3500", + "notes": "UMTS shut down Dec 2018" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "90", + "brand": "T Star", + "operator": "Taiwan Star Telecom", + "status": "Unknown", + "bands": "LTE 900", + "notes": null + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "92", + "brand": "Chunghwa", + "operator": "Chunghwa Telecom", + "status": "Operational", + "bands": "LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "GSM shut down July 2017; UMTS shut down Dec 2018" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "93", + "brand": "MobiTai", + "operator": "Mobitai Communications", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Acquired by Taiwan Mobile in 2004, MobiTai brand used until 2008" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "97", + "brand": "Taiwan Mobile", + "operator": "Taiwan Mobile Co. Ltd", + "status": "Operational", + "bands": "LTE 700 / LTE 1800 / LTE 2100 / 5G 3500", + "notes": "LTE band 28; GSM shut down July 2017; UMTS shut down Dec 2018" + }, + { + "type": "National", + "countryName": "Taiwan", + "countryCode": "TW", + "mcc": "466", + "mnc": "99", + "brand": "TransAsia", + "operator": "TransAsia Telecoms", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Acquired by Taiwan Mobile in 2002, TransAsia brand used until 2008" + }, + { + "type": "National", + "countryName": "Tajikistan", + "countryCode": "TJ", + "mcc": "436", + "mnc": "01", + "brand": "Tcell", + "operator": "JV Somoncom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Tajikistan", + "countryCode": "TJ", + "mcc": "436", + "mnc": "02", + "brand": "Tcell", + "operator": "Indigo Tajikistan", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Tajikistan", + "countryCode": "TJ", + "mcc": "436", + "mnc": "03", + "brand": "MegaFon", + "operator": "TT Mobile", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800", + "notes": null + }, + { + "type": "National", + "countryName": "Tajikistan", + "countryCode": "TJ", + "mcc": "436", + "mnc": "04", + "brand": "Babilon-M", + "operator": "Babilon-Mobile", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Tajikistan", + "countryCode": "TJ", + "mcc": "436", + "mnc": "05", + "brand": "ZET-Mobile", + "operator": "Tacom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2100", + "notes": "Former Beeline" + }, + { + "type": "National", + "countryName": "Tajikistan", + "countryCode": "TJ", + "mcc": "436", + "mnc": "10", + "brand": "Babilon-T", + "operator": "Babilon-T", + "status": "Operational", + "bands": "TD-LTE 2300 / WiMAX", + "notes": null + }, + { + "type": "National", + "countryName": "Tajikistan", + "countryCode": "TJ", + "mcc": "436", + "mnc": "12", + "brand": "Tcell", + "operator": "Indigo", + "status": "Unknown", + "bands": "UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Turkmenistan", + "countryCode": "TM", + "mcc": "438", + "mnc": "01", + "brand": "MTS", + "operator": "MTS Turkmenistan", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Forced to shut down 2017" + }, + { + "type": "National", + "countryName": "Turkmenistan", + "countryCode": "TM", + "mcc": "438", + "mnc": "02", + "brand": "TM-Cell", + "operator": "Altyn Asyr", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Turkmenistan", + "countryCode": "TM", + "mcc": "438", + "mnc": "03", + "brand": "AGTS CDMA", + "operator": "AŞTU", + "status": "Operational", + "bands": "CDMA 450", + "notes": null + }, + { + "type": "National", + "countryName": "United Arab Emirates", + "countryCode": "AE", + "mcc": "424", + "mnc": "02", + "brand": "Etisalat", + "operator": "Emirates Telecom Corp", + "status": "Operational", + "bands": "LTE 800 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": "GSM shut down Dec 2022" + }, + { + "type": "National", + "countryName": "United Arab Emirates", + "countryCode": "AE", + "mcc": "424", + "mnc": "03", + "brand": "du", + "operator": "Emirates Integrated Telecommunications Company", + "status": "Operational", + "bands": "UMTS 2100 / LTE 800 / LTE 1800 / 5G 3500 / 5G 26000", + "notes": "GSM shut down Dec 2022" + }, + { + "type": "National", + "countryName": "Uzbekistan", + "countryCode": "UZ", + "mcc": "434", + "mnc": "01", + "brand": null, + "operator": "Buztel", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Uzbekistan", + "countryCode": "UZ", + "mcc": "434", + "mnc": "02", + "brand": null, + "operator": "Uzmacom", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Uzbekistan", + "countryCode": "UZ", + "mcc": "434", + "mnc": "03", + "brand": "UzMobile", + "operator": "Uzbektelekom", + "status": "Operational", + "bands": "CDMA 450", + "notes": "EVDO Rev A" + }, + { + "type": "National", + "countryName": "Uzbekistan", + "countryCode": "UZ", + "mcc": "434", + "mnc": "04", + "brand": "Beeline", + "operator": "Unitel LLC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600", + "notes": "Former Daewoo Unitel" + }, + { + "type": "National", + "countryName": "Uzbekistan", + "countryCode": "UZ", + "mcc": "434", + "mnc": "05", + "brand": "Ucell", + "operator": "Coscom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Uzbekistan", + "countryCode": "UZ", + "mcc": "434", + "mnc": "06", + "brand": "Perfectum Mobile", + "operator": "RUBICON WIRELESS COMMUNICATION", + "status": "Operational", + "bands": "CDMA 800", + "notes": null + }, + { + "type": "National", + "countryName": "Uzbekistan", + "countryCode": "UZ", + "mcc": "434", + "mnc": "07", + "brand": "Mobiuz", + "operator": "Universal Mobile Systems (UMS)", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / 5G", + "notes": null + }, + { + "type": "National", + "countryName": "Uzbekistan", + "countryCode": "UZ", + "mcc": "434", + "mnc": "08", + "brand": "UzMobile", + "operator": "Uzbektelekom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Uzbekistan", + "countryCode": "UZ", + "mcc": "434", + "mnc": "09", + "brand": "EVO", + "operator": "OOO «Super iMAX»", + "status": "Operational", + "bands": "WiMAX / LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Vietnam", + "countryCode": "VN", + "mcc": "452", + "mnc": "01", + "brand": "MobiFone", + "operator": "Vietnam Mobile Telecom Services Company", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Vietnam", + "countryCode": "VN", + "mcc": "452", + "mnc": "02", + "brand": "Vinaphone", + "operator": "Vietnam Telecom Services Company", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Vietnam", + "countryCode": "VN", + "mcc": "452", + "mnc": "03", + "brand": "S-Fone", + "operator": "S-Telecom", + "status": "Not operational", + "bands": "CDMA2000 800", + "notes": "License revoked; MNC withdawn" + }, + { + "type": "National", + "countryName": "Vietnam", + "countryCode": "VN", + "mcc": "452", + "mnc": "04", + "brand": "Viettel Mobile", + "operator": "Viettel Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Vietnam", + "countryCode": "VN", + "mcc": "452", + "mnc": "05", + "brand": "Vietnamobile", + "operator": "Hanoi Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Vietnam", + "countryCode": "VN", + "mcc": "452", + "mnc": "06", + "brand": "EVNTelecom", + "operator": "EVN Telecom", + "status": "Not operational", + "bands": "CDMA2000 450", + "notes": "License revoked; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Vietnam", + "countryCode": "VN", + "mcc": "452", + "mnc": "07", + "brand": "Gmobile", + "operator": "GTEL Mobile JSC", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Former Beeline" + }, + { + "type": "National", + "countryName": "Vietnam", + "countryCode": "VN", + "mcc": "452", + "mnc": "08", + "brand": "I-Telecom", + "operator": "Indochina Telecom", + "status": "Operational", + "bands": "WiMAX", + "notes": "Former EVNTelecom" + }, + { + "type": "National", + "countryName": "Vietnam", + "countryCode": "VN", + "mcc": "452", + "mnc": "09", + "brand": "REDDI", + "operator": "MOBICAST JSC", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Vinaphone" + }, + { + "type": "National", + "countryName": "Yemen", + "countryCode": "YE", + "mcc": "421", + "mnc": "01", + "brand": "SabaFon", + "operator": "SabaFon", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Yemen", + "countryCode": "YE", + "mcc": "421", + "mnc": "02", + "brand": "YOU", + "operator": "Yemen Oman United Telecom", + "status": "Operational", + "bands": "GSM 900 / LTE", + "notes": "Former Spacetel, MTN" + }, + { + "type": "National", + "countryName": "Yemen", + "countryCode": "YE", + "mcc": "421", + "mnc": "03", + "brand": "Yemen Mobile", + "operator": "Yemen Mobile", + "status": "Operational", + "bands": "CDMA 850", + "notes": null + }, + { + "type": "National", + "countryName": "Yemen", + "countryCode": "YE", + "mcc": "421", + "mnc": "04", + "brand": "Y", + "operator": "HiTS-UNITEL", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Yemen", + "countryCode": "YE", + "mcc": "421", + "mnc": "10", + "brand": "Yemen-4G", + "operator": "PTC/Yemen-Telecom", + "status": "Operational", + "bands": "700/1800/2600", + "notes": null + }, + { + "type": "National", + "countryName": "Yemen", + "countryCode": "YE", + "mcc": "421", + "mnc": "11", + "brand": "Yemen Mobile", + "operator": "Yemen Mobile", + "status": "Operational", + "bands": "LTE 3", + "notes": null + }, + { + "type": "National", + "countryName": "American Samoa (United States of America)", + "countryCode": "AS", + "mcc": "311", + "mnc": "780", + "brand": "ASTCA", + "operator": "American Samoa Telecommunications", + "status": "Operational", + "bands": "LTE 700", + "notes": "Uses United States MCC" + }, + { + "type": "National", + "countryName": "American Samoa (United States of America)", + "countryCode": "AS", + "mcc": "544", + "mnc": "11", + "brand": "Bluesky", + "operator": "Bluesky", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700 / LTE 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "01", + "brand": "Telstra", + "operator": "Telstra Corporation Limited", + "status": "Operational", + "bands": "UMTS 850 / LTE 700 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 850 / 5G 3500 / 5G 28000", + "notes": "LTE bands 28 / 8 / 3 / 1 / 7; GSM shut down 1 December 2016; UMTS 2100 shut down 25 March 2019" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "02", + "brand": "Optus", + "operator": "Singtel Optus Pty Ltd", + "status": "Operational", + "bands": "UMTS 900 / LTE 700 / LTE 1800 / LTE 2100 / TD-LTE 2300 / LTE 2600 / 5G 900 / 5G 1800 / 5G 2100 / TD-5G 2300 / 5G 3500 / 5G 28000", + "notes": "LTE bands 28 / 3 / 1 / 7; GSM shut down Aug 2017, UMTS 2100 – May 2022, UMTS 900 – Sep 2024" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "03", + "brand": "Vodafone", + "operator": "Vodafone Hutchison Australia Pty Ltd", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 850 / LTE 1800 / LTE 2100 / 5G 700 / 5G 3500", + "notes": "LTE bands 5 / 3 / 1; GSM shut down 30 April 2018" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "04", + "brand": null, + "operator": "Department of Defence", + "status": "Operational", + "bands": "Unknown", + "notes": "Private network" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "05", + "brand": "Ozitel", + "operator": null, + "status": "Not operational", + "bands": null, + "notes": "Brand was taken over by Telstra." + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "06", + "brand": "3", + "operator": "Vodafone Hutchison Australia Pty Ltd", + "status": "Not operational", + "bands": "UMTS 2100", + "notes": "Vodafone Hutchison Australia and Telstra ended their network sharing agreement on 31 August 2012. The 3TELSTRA network was shut down on this date." + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "07", + "brand": "Vodafone", + "operator": "Vodafone Network Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "08", + "brand": "One.Tel", + "operator": "One.Tel Limited", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Brand was dissolved." + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "09", + "brand": "Airnet", + "operator": null, + "status": "Not operational", + "bands": null, + "notes": "No longer provide mobile services." + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "10", + "brand": "Norfolk Is.", + "operator": "Norfolk Telecom", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "11", + "brand": "Telstra", + "operator": "Telstra Corporation Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "12", + "brand": "3", + "operator": "Vodafone Hutchison Australia Pty Ltd", + "status": "Not operational", + "bands": "UMTS 2100", + "notes": "See MNC 06" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "13", + "brand": "RailCorp", + "operator": "Railcorp, Transport for NSW", + "status": "Operational", + "bands": "GSM-R 1800", + "notes": "For use by Sydney Trains Digital Train Radio System" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "14", + "brand": "AAPT", + "operator": "TPG Telecom", + "status": "Operational", + "bands": "MVNO", + "notes": "Wholesale from Vodafone Hutchison Australia" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "15", + "brand": "3GIS", + "operator": null, + "status": "Not operational", + "bands": null, + "notes": "Taken over by Vodafone." + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "16", + "brand": "VicTrack", + "operator": "Victorian Rail Track", + "status": "Operational", + "bands": "GSM-R 1800", + "notes": "Digital Train Radio System" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "17", + "brand": null, + "operator": "Optus", + "status": "Operational", + "bands": "TD-LTE 2300", + "notes": "Former Vivid Wireless Pty. Ltd." + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "18", + "brand": "Pactel", + "operator": "Pactel International Pty Ltd", + "status": "Not operational", + "bands": null, + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "19", + "brand": "Lycamobile", + "operator": "Lycamobile Pty Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "20", + "brand": null, + "operator": "Ausgrid Corporation", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "21", + "brand": null, + "operator": "Queensland Rail Limited", + "status": "Unknown", + "bands": "GSM-R 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "22", + "brand": null, + "operator": "iiNet Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "23", + "brand": null, + "operator": "Challenge Networks Pty Ltd", + "status": "Operational", + "bands": "LTE 1800 / LTE 2100", + "notes": "Private networks, primarily for mining industry" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "24", + "brand": null, + "operator": "Advanced Communications Technologies Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "25", + "brand": null, + "operator": "Pilbara Iron Company Services Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "26", + "brand": null, + "operator": "Dialogue Communications Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "27", + "brand": null, + "operator": "Nexium Telecommunications", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "28", + "brand": null, + "operator": "RCOM International Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "30", + "brand": null, + "operator": "Compatel Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "31", + "brand": null, + "operator": "BHP", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "32", + "brand": null, + "operator": "Thales Australia", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "33", + "brand": null, + "operator": "CLX Networks Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "34", + "brand": null, + "operator": "Santos Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "35", + "brand": null, + "operator": "MessageBird Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "36", + "brand": "Optus", + "operator": "Optus Mobile Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "37", + "brand": null, + "operator": "Yancoal Australia Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "38", + "brand": "Truphone", + "operator": "Truphone Pty Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": "Formerly Crazy John's" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "39", + "brand": "Telstra", + "operator": "Telstra Corporation Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "40", + "brand": null, + "operator": "CITIC Pacific Mining", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "41", + "brand": null, + "operator": "Aqura Technologies Pty", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former OTOC" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "42", + "brand": "GEMCO", + "operator": "Groote Eylandt Mining Company Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "43", + "brand": null, + "operator": "Arrow Energy Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "44", + "brand": null, + "operator": "Roy Hill Iron Ore Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "45", + "brand": null, + "operator": "Clermont Coal Operations Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "46", + "brand": null, + "operator": "AngloGold Ashanti Australia Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "47", + "brand": null, + "operator": "Woodside Energy Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "48", + "brand": null, + "operator": "Titan ICT Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "49", + "brand": null, + "operator": "Field Solutions Group Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "50", + "brand": null, + "operator": "Pivotel Group Pty Ltd", + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "51", + "brand": null, + "operator": "Fortescue Metals Group", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "52", + "brand": null, + "operator": "OptiTel Australia", + "status": "Operational", + "bands": "LTE 1800 / LTE 2100 / 5G 1800 / 5G 2100", + "notes": "Research, development, and operation; Northern Territory" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "53", + "brand": null, + "operator": "Shell Australia Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "54", + "brand": null, + "operator": "Nokia Solutions and Networks Australia Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "61", + "brand": "CommTel NS", + "operator": "Commtel Network Solutions Pty Ltd", + "status": "Implement / Design", + "bands": "LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "62", + "brand": "NBN", + "operator": "National Broadband Network Co.", + "status": "Operational", + "bands": "TD-LTE 2300 / TD-LTE 3500", + "notes": "LTE band 40 / 42" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "68", + "brand": "NBN", + "operator": "National Broadband Network Co.", + "status": "Operational", + "bands": "TD-LTE 2300 / TD-LTE 3500", + "notes": "LTE band 40 / 42" + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "71", + "brand": "Telstra", + "operator": "Telstra Corporation Limited", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "72", + "brand": "Telstra", + "operator": "Telstra Corporation Limited", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "88", + "brand": null, + "operator": "Pivotel Group Pty Ltd", + "status": "Operational", + "bands": "Satellite", + "notes": "Former Localstar Holding Pty. Ltd." + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "90", + "brand": "Optus", + "operator": "Singtel Optus Proprietary Ltd", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Australia", + "countryCode": "AU/CC/CX", + "mcc": "505", + "mnc": "99", + "brand": "One.Tel", + "operator": "One.Tel", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Brand was dissolved. Rail operators purchased 1800 spectrum." + }, + { + "type": "National", + "countryName": "Brunei", + "countryCode": "BN", + "mcc": "528", + "mnc": "01", + "brand": "TelBru", + "operator": "Telekom Brunei Berhad", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Jabatan Telekom Brunei" + }, + { + "type": "National", + "countryName": "Brunei", + "countryCode": "BN", + "mcc": "528", + "mnc": "02", + "brand": "PCSB", + "operator": "Progresif Cellular Sdn Bhd", + "status": "Operational", + "bands": "UMTS 2100", + "notes": "Former B-Mobile" + }, + { + "type": "National", + "countryName": "Brunei", + "countryCode": "BN", + "mcc": "528", + "mnc": "03", + "brand": "UNN", + "operator": "Unified National Networks Sdn Bhd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Brunei", + "countryCode": "BN", + "mcc": "528", + "mnc": "11", + "brand": "DST", + "operator": "Data Stream Technology Sdn Bhd", + "status": "Operational", + "bands": "UMTS 2100 / LTE 1800", + "notes": "GSM shut down June 2021" + }, + { + "type": "National", + "countryName": "Cook Islands (Pacific Ocean)", + "countryCode": "CK", + "mcc": "548", + "mnc": "01", + "brand": "Vodafone", + "operator": "Telecom Cook Islands", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 700 / LTE 1800", + "notes": "Former Bluesky; LTE bands 20 / 3" + }, + { + "type": "National", + "countryName": "East Timor", + "countryCode": "TL", + "mcc": "514", + "mnc": "01", + "brand": "Telkomcel", + "operator": "PT Telekomunikasi Indonesia International", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 850 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "East Timor", + "countryCode": "TL", + "mcc": "514", + "mnc": "02", + "brand": "TT", + "operator": "Timor Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "East Timor", + "countryCode": "TL", + "mcc": "514", + "mnc": "03", + "brand": "Telemor", + "operator": "Viettel Timor-Leste", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Fiji", + "countryCode": "FJ", + "mcc": "542", + "mnc": "01", + "brand": "Vodafone", + "operator": "Vodafone Fiji", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Fiji", + "countryCode": "FJ", + "mcc": "542", + "mnc": "02", + "brand": "Digicel", + "operator": "Digicel Fiji", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / WiMAX", + "notes": null + }, + { + "type": "National", + "countryName": "Fiji", + "countryCode": "FJ", + "mcc": "542", + "mnc": "03", + "brand": "TFL", + "operator": "Telecom Fiji Ltd", + "status": "Operational", + "bands": "CDMA2000 850 / LTE 700", + "notes": "LTE band 28" + }, + { + "type": "National", + "countryName": "French Polynesia (France)", + "countryCode": "PF", + "mcc": "547", + "mnc": "05", + "brand": "Ora", + "operator": "VITI", + "status": "Operational", + "bands": "WiMAX / LTE 800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "French Polynesia (France)", + "countryCode": "PF", + "mcc": "547", + "mnc": "10", + "brand": null, + "operator": "Mara Telecom", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Bankrupt in 2013" + }, + { + "type": "National", + "countryName": "French Polynesia (France)", + "countryCode": "PF", + "mcc": "547", + "mnc": "15", + "brand": "Vodafone", + "operator": "Pacific Mobile Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "French Polynesia (France)", + "countryCode": "PF", + "mcc": "547", + "mnc": "20", + "brand": "Vini", + "operator": "Onati S.A.S.", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "00", + "brand": "PSN", + "operator": "PT Pasifik Satelit Nusantara", + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "01", + "brand": "Indosat Ooredoo Hutchison", + "operator": "PT Indosat Tbk", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / 5G 1800", + "notes": "Former PT Satelindo; UMTS shut down Dec 2022" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "03", + "brand": "StarOne", + "operator": "PT Indosat Tbk", + "status": "Not operational", + "bands": "CDMA 800", + "notes": "Shut down on 30 June 2015" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "07", + "brand": "TelkomFlexi", + "operator": "PT Telkom Indonesia Tbk", + "status": "Not operational", + "bands": "CDMA 800", + "notes": "Network shut down end of 2015" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "08", + "brand": "AXIS", + "operator": "PT Natrindo Telepon Seluler", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100", + "notes": "Merged with XL (MNC 11), MNC 08 no longer used" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "09", + "brand": "Smartfren", + "operator": "PT Smartfren Telecom", + "status": "Operational", + "bands": "LTE 850 / TD-LTE 2300", + "notes": "CDMA 1900 shut down December 2016, CDMA 850 shut down November 2017" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "10", + "brand": "Telkomsel", + "operator": "PT Telekomunikasi Selular", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / TD-LTE 2300 / 5G 2300", + "notes": "UMTS shut down Dec 2022" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "11", + "brand": "XL", + "operator": "PT XL Axiata Tbk", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 900 / LTE 1800 / 5G 1800 / 5G 2100", + "notes": "UMTS shut down on 31 March 2022" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "20", + "brand": "TELKOMMobile", + "operator": "PT Telkom Indonesia Tbk", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Merged with Telkomsel" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "21", + "brand": "Indosat Ooredoo Hutchison", + "operator": "PT Indosat Tbk", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Former Indosat-M3; merged with Indosat (MNC 01)" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "27", + "brand": "Net 1", + "operator": "PT Net Satu Indonesia", + "status": "Not operational", + "bands": "LTE 450", + "notes": "Former Ceria, Sampoerna Telekomunikasi; CDMA 450 shut down 2017; license revoked on 30 November 2021" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "28", + "brand": "Fren/Hepi", + "operator": "PT Mobile-8 Telecom", + "status": "Operational", + "bands": "LTE 850 / TD-LTE 2300", + "notes": "Merged with SMART (MNC 09), CDMA 850 shut down November 2017" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "78", + "brand": "Hinet", + "operator": "PT Berca Hardayaperkasa", + "status": "Not operational", + "bands": "TD-LTE 2300", + "notes": "Shut down on 16 November 2022" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "88", + "brand": "BOLT! 4G LTE", + "operator": "PT Internux", + "status": "Not operational", + "bands": "TD-LTE 2300", + "notes": "Shut down on 28 December 2018" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "89", + "brand": "3", + "operator": "PT Hutchison 3 Indonesia", + "status": "Operational", + "bands": "GSM 1800 / LTE 1800", + "notes": "Merged with Indosat (MNC 01); UMTS shut down Dec 2022" + }, + { + "type": "National", + "countryName": "Indonesia", + "countryCode": "ID", + "mcc": "510", + "mnc": "99", + "brand": "Esia", + "operator": "PT Bakrie Telecom", + "status": "Not operational", + "bands": "CDMA 800", + "notes": "Merged with Smartfren (MNC 09)" + }, + { + "type": "National", + "countryName": "Kiribati", + "countryCode": "KI", + "mcc": "545", + "mnc": "01", + "brand": "Kiribati - ATH", + "operator": "Amalgamated Telecom Holdings Kiribati Limited", + "status": "Operational", + "bands": "UMTS 900 / LTE 1800", + "notes": "Former Telecom Services Kiribati Ltd (TSKL)" + }, + { + "type": "National", + "countryName": "Kiribati", + "countryCode": "KI", + "mcc": "545", + "mnc": "02", + "brand": null, + "operator": "OceanLink", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Kiribati", + "countryCode": "KI", + "mcc": "545", + "mnc": "09", + "brand": "Kiribati - Frigate Net", + "operator": "Amalgamated Telecom Holdings Kiribati Limited", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "01", + "brand": "ATUR 450", + "operator": "Telekom Malaysia Bhd", + "status": "Not operational", + "bands": "CDMA2000 450", + "notes": null + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "10", + "brand": null, + "operator": "Celcom, DiGi, Maxis, Tune Talk, U Mobile, Unifi, XOX, Yes", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600", + "notes": "Former Celcom" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "11", + "brand": "TM Homeline", + "operator": "Telekom Malaysia Bhd", + "status": "Operational", + "bands": "CDMA2000 850 / LTE 850", + "notes": null + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "12", + "brand": "Maxis", + "operator": "Maxis Communications Berhad", + "status": "Operational", + "bands": "GSM 900 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "Used by MVNO Kartu As; LTE 2600 in co-operation with REDtone; UMTS shut down Dec 2021" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "13", + "brand": "Celcom", + "operator": "Celcom Axiata Berhad", + "status": "Operational", + "bands": "GSM 900 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "Former Emartel, TMTouch; LTE 2600 in co-operation with Altel; UMTS shut down Dec 2021" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "14", + "brand": null, + "operator": "Telekom Malaysia Berhad for PSTN SMS", + "status": "Unknown", + "bands": null, + "notes": null + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "150", + "brand": "Tune Talk", + "operator": "Tune Talk Sdn Bhd", + "status": "Operational", + "bands": "MVNO", + "notes": "uses Celcom" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "151", + "brand": "SalamFone", + "operator": "Baraka Telecom Sdn Bhd", + "status": "Not operational", + "bands": "MVNO", + "notes": "(MVNO)-MAXIS, previously using DiGi; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "152", + "brand": "Yes", + "operator": "YTL Communications Sdn Bhd", + "status": "Operational", + "bands": "TD-LTE 2300 / TD-LTE 2600 / 5G 700 / 5G 3500 / 5G 28000", + "notes": "WiMAX shut down 2019; 5G provided by Digital Nasional Berhad" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "153", + "brand": "unifi", + "operator": "Webe Digital Sdn Bhd", + "status": "Operational", + "bands": "WiMAX 2300 / LTE 850 / TD-LTE 2300 / 5G 700 / 5G 3500 / 5G 28000", + "notes": "Former Packet One Networks; subsidiary of Telekom Malaysia; 5G provided by Digital Nasional Berhad" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "154", + "brand": "Tron", + "operator": "Talk Focus Sdn Bhd", + "status": "Not operational", + "bands": "MVNO", + "notes": "Uses Digi, shut down on 17 Jan 2019" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "155", + "brand": "Clixster", + "operator": "Clixster Mobile Sdn Bhd", + "status": "Not operational", + "bands": "MVNO", + "notes": "Uses Digi; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "156", + "brand": "Altel", + "operator": "Altel Communications Sdn Bhd", + "status": "Operational", + "bands": "MVNO", + "notes": "Using Celcom; LTE 2600 band licensed to Celcom" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "157", + "brand": "Telin", + "operator": "Telekomunikasi Indonesia International (M) Sdn Bhd", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses U Mobile" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "16", + "brand": "DiGi", + "operator": "DiGi Telecommunications", + "status": "Operational", + "bands": "GSM 1800 / LTE 900 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "LTE 2600 coverage limited to certain areas in the Klang Valley at the moment; former Mutiara Telecom; UMTS shut down Dec 2021" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "17", + "brand": "Maxis", + "operator": "Maxis Communications Berhad", + "status": "Operational", + "bands": "GSM 900 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "Former TimeCel, Adam017; UMTS shut down Dec 2021" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "18", + "brand": "U Mobile", + "operator": "U Mobile Sdn Bhd", + "status": "Operational", + "bands": "LTE 1800 / LTE 2100 / LTE 2600", + "notes": "Domestic Roaming with Maxis, also for GSM; former Mobikom; UMTS shut down Dec 2021" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "19", + "brand": "Celcom", + "operator": "Celcom Axiata Berhad", + "status": "Operational", + "bands": "GSM 900 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "UMTS shut down Dec 2021" + }, + { + "type": "National", + "countryName": "Malaysia", + "countryCode": "MY", + "mcc": "502", + "mnc": "20", + "brand": "Electcoms", + "operator": "Electcoms Berhad", + "status": "Not operational", + "bands": "DMR", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Marshall Islands", + "countryCode": "MH", + "mcc": "551", + "mnc": "01", + "brand": null, + "operator": "Marshall Islands National Telecommunications Authority (MINTA)", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Federated States of Micronesia", + "countryCode": "FM", + "mcc": "550", + "mnc": "01", + "brand": null, + "operator": "FSMTC", + "status": "Operational", + "bands": "GSM 900 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Nauru", + "countryCode": "NR", + "mcc": "536", + "mnc": "02", + "brand": "Digicel", + "operator": "Digicel (Nauru) Corporation", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Also uses MCC 542 MNC 02 (Fiji)" + }, + { + "type": "National", + "countryName": "New Caledonia (France)", + "countryCode": "NC", + "mcc": "546", + "mnc": "01", + "brand": "Mobilis", + "operator": "OPT New Caledonia", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 800 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "New Zealand", + "countryCode": "NZ", + "mcc": "530", + "mnc": "00", + "brand": "Telecom", + "operator": "Spark New Zealand", + "status": "Not operational", + "bands": "AMPS 800 / TDMA 800", + "notes": "Shut down on 31 March 2007" + }, + { + "type": "National", + "countryName": "New Zealand", + "countryCode": "NZ", + "mcc": "530", + "mnc": "01", + "brand": "Vodafone", + "operator": "Vodafone New Zealand", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "New Zealand", + "countryCode": "NZ", + "mcc": "530", + "mnc": "02", + "brand": "Telecom", + "operator": "Spark New Zealand", + "status": "Not operational", + "bands": "CDMA2000 800", + "notes": "Shut down on 31 July 2012" + }, + { + "type": "National", + "countryName": "New Zealand", + "countryCode": "NZ", + "mcc": "530", + "mnc": "03", + "brand": "Woosh", + "operator": "Woosh Wireless", + "status": "Not operational", + "bands": "UMTS-TDD 2000", + "notes": "Wireless broadband only" + }, + { + "type": "National", + "countryName": "New Zealand", + "countryCode": "NZ", + "mcc": "530", + "mnc": "04", + "brand": "TelstraClear", + "operator": "TelstraClear", + "status": "Not operational", + "bands": "UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "New Zealand", + "countryCode": "NZ", + "mcc": "530", + "mnc": "05", + "brand": "Spark", + "operator": "Spark New Zealand", + "status": "Operational", + "bands": "UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / TD-LTE 2300 / LTE 2600 / 5G 2600 / 5G 3500", + "notes": "Formerly Telecom New Zealand" + }, + { + "type": "National", + "countryName": "New Zealand", + "countryCode": "NZ", + "mcc": "530", + "mnc": "06", + "brand": null, + "operator": "FX Networks", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "New Zealand", + "countryCode": "NZ", + "mcc": "530", + "mnc": "07", + "brand": null, + "operator": "Dense Air New Zealand", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Bluereach Limited" + }, + { + "type": "National", + "countryName": "New Zealand", + "countryCode": "NZ", + "mcc": "530", + "mnc": "24", + "brand": "2degrees", + "operator": "2degrees", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 900 / LTE 1800 / LTE 2100 / 5G 3500", + "notes": "GSM shut down on 15 March 2018" + }, + { + "type": "National", + "countryName": "Niue", + "countryCode": "NU", + "mcc": "555", + "mnc": "01", + "brand": "Telecom Niue", + "operator": "Telecom Niue", + "status": "Operational", + "bands": "GSM 900 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Norfolk Island", + "countryCode": "NF", + "mcc": "505", + "mnc": "10", + "brand": "Norfolk Telecom", + "operator": "Norfolk Telecom", + "status": "Operational", + "bands": "GSM 900 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Palau", + "countryCode": "PW", + "mcc": "552", + "mnc": "01", + "brand": "PNCC", + "operator": "Palau National Communications Corp.", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Palau", + "countryCode": "PW", + "mcc": "552", + "mnc": "02", + "brand": "PT Waves", + "operator": "Palau Equipment Company Inc.", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Palau", + "countryCode": "PW", + "mcc": "552", + "mnc": "80", + "brand": "Palau Mobile", + "operator": "Palau Mobile Corporation", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Service shutdown in 2014" + }, + { + "type": "National", + "countryName": "Palau", + "countryCode": "PW", + "mcc": "552", + "mnc": "99", + "brand": "PMCI", + "operator": "Palau Mobile Communications Inc.", + "status": "Operational", + "bands": "LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Papua New Guinea", + "countryCode": "PG", + "mcc": "537", + "mnc": "01", + "brand": "bmobile", + "operator": "Bemobile Limited", + "status": "Operational", + "bands": "GSM 900 / UMTS 900", + "notes": null + }, + { + "type": "National", + "countryName": "Papua New Guinea", + "countryCode": "PG", + "mcc": "537", + "mnc": "02", + "brand": "citifon", + "operator": "Telikom PNG Ltd.", + "status": "Operational", + "bands": "CDMA2000 450 / LTE 700", + "notes": "Formerly Greencom; LTE band 28" + }, + { + "type": "National", + "countryName": "Papua New Guinea", + "countryCode": "PG", + "mcc": "537", + "mnc": "03", + "brand": "Digicel", + "operator": "Digicel PNG", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 700", + "notes": "LTE band 28" + }, + { + "type": "National", + "countryName": "Papua New Guinea", + "countryCode": "PG", + "mcc": "537", + "mnc": "04", + "brand": null, + "operator": "Digitec Communication Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Philippines", + "countryCode": "PH", + "mcc": "515", + "mnc": "01", + "brand": "Islacom", + "operator": "Globe Telecom via Innove Communications", + "status": "Not operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Philippines", + "countryCode": "PH", + "mcc": "515", + "mnc": "02", + "brand": "Globe", + "operator": "Globe Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / TD-LTE 2300 / TD-LTE 2500 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Philippines", + "countryCode": "PH", + "mcc": "515", + "mnc": "03", + "brand": "SMART", + "operator": "PLDT via Smart Communications", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 850 / LTE 1800 / LTE 2100 / TD-LTE 2300 / TD-LTE 2500 / 5G 3500", + "notes": "Formerly PilTel" + }, + { + "type": "National", + "countryName": "Philippines", + "countryCode": "PH", + "mcc": "515", + "mnc": "05", + "brand": "Sun Cellular", + "operator": "Digital Telecommunications Philippines", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100", + "notes": "Uses SMART for LTE roaming" + }, + { + "type": "National", + "countryName": "Philippines", + "countryCode": "PH", + "mcc": "515", + "mnc": "11", + "brand": null, + "operator": "PLDT via ACeS Philippines", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Philippines", + "countryCode": "PH", + "mcc": "515", + "mnc": "18", + "brand": "Cure", + "operator": "PLDT via Smart's Connectivity Unlimited Resources Enterprise", + "status": "Not operational", + "bands": "GSM 900 / UMTS 2100", + "notes": "Formerly ümobile, then Red Mobile; shut down 2012" + }, + { + "type": "National", + "countryName": "Philippines", + "countryCode": "PH", + "mcc": "515", + "mnc": "24", + "brand": "ABS-CBN Mobile", + "operator": "ABS-CBN Convergence with Globe Telecom", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Philippines", + "countryCode": "PH", + "mcc": "515", + "mnc": "66", + "brand": "DITO", + "operator": "Dito Telecommunity Corp.", + "status": "Operational", + "bands": "LTE 700 / LTE 2100 / TD-LTE 2500 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Philippines", + "countryCode": "PH", + "mcc": "515", + "mnc": "88", + "brand": null, + "operator": "Next Mobile Inc.", + "status": "Operational", + "bands": "iDEN", + "notes": "Former Nextel Philippines" + }, + { + "type": "National", + "countryName": "Samoa", + "countryCode": "WS", + "mcc": "549", + "mnc": "00", + "brand": "Digicel", + "operator": "Digicel Pacific Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Samoa", + "countryCode": "WS", + "mcc": "549", + "mnc": "01", + "brand": "Digicel", + "operator": "Digicel Pacific Ltd.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": "Former Telecom Samoa Cellular Ltd." + }, + { + "type": "National", + "countryName": "Samoa", + "countryCode": "WS", + "mcc": "549", + "mnc": "27", + "brand": "Vodafone", + "operator": "Vodafone Samoa Ltd.", + "status": "Operational", + "bands": "GSM 900 / LTE 700 / LTE 1800", + "notes": "Former Samoatel Ltd., Bluesky Samoa" + }, + { + "type": "National", + "countryName": "Singapore", + "countryCode": "SG", + "mcc": "525", + "mnc": "01", + "brand": "SingTel", + "operator": "Singapore Telecom", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500 / 5G 28000", + "notes": "GSM shut down on 1 April 2017" + }, + { + "type": "National", + "countryName": "Singapore", + "countryCode": "SG", + "mcc": "525", + "mnc": "02", + "brand": "SingTel-G18", + "operator": "Singapore Telecom", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "GSM shut down on 1 April 2017" + }, + { + "type": "National", + "countryName": "Singapore", + "countryCode": "SG", + "mcc": "525", + "mnc": "03", + "brand": "M1", + "operator": "M1 Limited", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2600 / 5G 2100 / 5G 3500", + "notes": "GSM shut down on 1 April 2017" + }, + { + "type": "National", + "countryName": "Singapore", + "countryCode": "SG", + "mcc": "525", + "mnc": "05", + "brand": "StarHub", + "operator": "StarHub Mobile", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / LTE 2600 / TD-LTE 2500 / 5G 2100 / 5G 3500", + "notes": "GSM shut down on 1 April 2017" + }, + { + "type": "National", + "countryName": "Singapore", + "countryCode": "SG", + "mcc": "525", + "mnc": "06", + "brand": "StarHub", + "operator": "StarHub Mobile", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Singapore", + "countryCode": "SG", + "mcc": "525", + "mnc": "07", + "brand": "SingTel", + "operator": "Singapore Telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Singapore", + "countryCode": "SG", + "mcc": "525", + "mnc": "08", + "brand": "StarHub", + "operator": "StarHub Mobile", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Singapore", + "countryCode": "SG", + "mcc": "525", + "mnc": "09", + "brand": "Circles.Life", + "operator": "Liberty Wireless Pte Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Singapore", + "countryCode": "SG", + "mcc": "525", + "mnc": "10", + "brand": "SIMBA", + "operator": "SIMBA Telecom Pte Ltd", + "status": "Operational", + "bands": "LTE 900 / TD-LTE 2300 / TD-LTE 2500", + "notes": "Former TPG Telecom" + }, + { + "type": "National", + "countryName": "Singapore", + "countryCode": "SG", + "mcc": "525", + "mnc": "11", + "brand": "M1", + "operator": "M1 Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Singapore", + "countryCode": "SG", + "mcc": "525", + "mnc": "12", + "brand": "Grid", + "operator": "GRID Communications Pte Ltd.", + "status": "Operational", + "bands": "iDEN 800", + "notes": "Digital Trunked Radio Network" + }, + { + "type": "National", + "countryName": "Solomon Islands", + "countryCode": "SB", + "mcc": "540", + "mnc": "01", + "brand": "BREEZE", + "operator": "Our Telekom", + "status": "Operational", + "bands": "GSM 900 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800", + "notes": "Former Solomon Telekom Co Ltd" + }, + { + "type": "National", + "countryName": "Solomon Islands", + "countryCode": "SB", + "mcc": "540", + "mnc": "02", + "brand": "BeMobile", + "operator": "BMobile (SI) Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "00", + "brand": "TrueMove H / my by NT", + "operator": "National Telecom Public Company Limited", + "status": "Operational", + "bands": "UMTS 850", + "notes": "Former Hutch Thailand, CAT Telecom; inbound roaming for TrueMove H" + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "01", + "brand": "AIS", + "operator": "Advanced Info Service", + "status": "Operational", + "bands": "GSM 900", + "notes": "UMTS 900 shut down in 2013" + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "02", + "brand": "NT Mobile", + "operator": "National Telecom Public Company Limited", + "status": "Operational", + "bands": "UMTS 850", + "notes": "Former CAT Telecom; CDMA shut down in April 2013" + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "03", + "brand": "AIS", + "operator": "Advanced Wireless Network Company Ltd.", + "status": "Operational", + "bands": "UMTS 2100 / LTE 700 / LTE 900 / LTE 1800 / LTE 2100 / 5G 700 / 5G 2500", + "notes": null + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "04", + "brand": "TrueMove H", + "operator": "True Move H Universal Communication Company Ltd.", + "status": "Operational", + "bands": "UMTS 2100 / LTE 700 / LTE 900 / LTE 1800 / LTE 2100 / 5G 700 / 5G 2500", + "notes": "UMTS roaming with network 520-00" + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "05", + "brand": "dtac", + "operator": "DTAC TriNet Company Ltd.", + "status": "Operational", + "bands": "UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / 5G 700", + "notes": "LTE 2300 roaming with 520-47" + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "09", + "brand": null, + "operator": "Royal Thai Police", + "status": "Operational", + "bands": "LTE 850", + "notes": "LTE band 26" + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "15", + "brand": "AIS-T / NT Mobile", + "operator": "National Telecom Public Company Limited", + "status": "Operational", + "bands": "UMTS 2100 / LTE 2100", + "notes": "Former Thaimobile 1900, ACT Mobile, TOT Public Company Limited; used for NT Mobile, AIS-T and MVNO" + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "17", + "brand": "NT Mobile", + "operator": "National Telecom Public Company Limited", + "status": "Operational", + "bands": "TD-LTE 2300", + "notes": "Former TOT Public Company Limited; LTE band 40; for NT Mobile and MVNO except dtac-T uses 520-47, UMTS 850 uses 520-02" + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "18", + "brand": "dtac", + "operator": "Total Access Communications Public Company Ltd.", + "status": "Operational", + "bands": "GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "20", + "brand": "ACeS", + "operator": "ACeS", + "status": "Unknown", + "bands": "Satellite", + "notes": null + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "23", + "brand": "AIS GSM 1800", + "operator": "Digital Phone Company Ltd.", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Owned by AIS; network shut down in October 2019" + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "25", + "brand": "WE PCT", + "operator": "True Corporation", + "status": "Not operational", + "bands": "PHS 1900", + "notes": "In Bangkok area" + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "47", + "brand": "dtac-T", + "operator": "National Telecom Public Company Limited", + "status": "Operational", + "bands": "TD-LTE 2300", + "notes": "Former TOT Public Company Limited; LTE band 40; for dtac only" + }, + { + "type": "National", + "countryName": "Thailand", + "countryCode": "TH", + "mcc": "520", + "mnc": "99", + "brand": "TrueMove", + "operator": "True Corporation", + "status": "Operational", + "bands": "GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Tokelau", + "countryCode": "TK", + "mcc": "554", + "mnc": "01", + "brand": null, + "operator": "Teletok", + "status": "Operational", + "bands": "LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Tonga", + "countryCode": "TO", + "mcc": "539", + "mnc": "01", + "brand": "U-Call", + "operator": "Tonga Communications Corporation", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Tonga", + "countryCode": "TO", + "mcc": "539", + "mnc": "43", + "brand": null, + "operator": "Shoreline Communication", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Tonga", + "countryCode": "TO", + "mcc": "539", + "mnc": "88", + "brand": "Digicel", + "operator": "Digicel (Tonga) Limited", + "status": "Operational", + "bands": "GSM 900 / LTE 700 / LTE 1800", + "notes": "Former TonFon; LTE bands 28 / 3" + }, + { + "type": "National", + "countryName": "Tuvalu", + "countryCode": "TV", + "mcc": "553", + "mnc": "01", + "brand": "TTC", + "operator": "Tuvalu Telecom", + "status": "Operational", + "bands": "UMTS 900 / LTE 850", + "notes": "GSM shutdown in 2015" + }, + { + "type": "National", + "countryName": "Vanuatu", + "countryCode": "VU", + "mcc": "541", + "mnc": "00", + "brand": "AIL", + "operator": "ACeS International (AIL)", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Vanuatu", + "countryCode": "VU", + "mcc": "541", + "mnc": "01", + "brand": "SMILE", + "operator": "Telecom Vanuatu Ltd", + "status": "Operational", + "bands": "GSM 900 / LTE 700", + "notes": "LTE band 28" + }, + { + "type": "National", + "countryName": "Vanuatu", + "countryCode": "VU", + "mcc": "541", + "mnc": "05", + "brand": "Digicel", + "operator": "Digicel Vanuatu Ltd", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 700", + "notes": "LTE band 28" + }, + { + "type": "National", + "countryName": "Vanuatu", + "countryCode": "VU", + "mcc": "541", + "mnc": "07", + "brand": "WanTok", + "operator": "WanTok Vanuatu Ltd", + "status": "Operational", + "bands": "TD-LTE 2300", + "notes": "LTE band 40" + }, + { + "type": "National", + "countryName": "Wallis and Futuna", + "countryCode": "WF", + "mcc": "543", + "mnc": "01", + "brand": "Manuia", + "operator": "Service des Postes et Télécommunications des Îles Wallis et Futuna (SPT)", + "status": "Operational", + "bands": "UMTS 900 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Algeria", + "countryCode": "DZ", + "mcc": "603", + "mnc": "01", + "brand": "Mobilis", + "operator": "Algérie Télécom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Algeria", + "countryCode": "DZ", + "mcc": "603", + "mnc": "02", + "brand": "Djezzy", + "operator": "Optimum Telecom Algérie Spa", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Orascom Telecom" + }, + { + "type": "National", + "countryName": "Algeria", + "countryCode": "DZ", + "mcc": "603", + "mnc": "03", + "brand": "Ooredoo", + "operator": "Wataniya Telecom Algérie", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Nedjma" + }, + { + "type": "National", + "countryName": "Algeria", + "countryCode": "DZ", + "mcc": "603", + "mnc": "07", + "brand": "AT", + "operator": "Algérie Télécom", + "status": "Operational", + "bands": "CDMA 1900", + "notes": "Wireless Local Loop" + }, + { + "type": "National", + "countryName": "Algeria", + "countryCode": "DZ", + "mcc": "603", + "mnc": "09", + "brand": "AT", + "operator": "Algérie Télécom", + "status": "Operational", + "bands": "LTE", + "notes": "Fixed Wireless Broadband" + }, + { + "type": "National", + "countryName": "Algeria", + "countryCode": "DZ", + "mcc": "603", + "mnc": "21", + "brand": "ANESRIF", + "operator": "Anesrif", + "status": "Ongoing", + "bands": "GSM-R", + "notes": null + }, + { + "type": "National", + "countryName": "Angola", + "countryCode": "AO", + "mcc": "631", + "mnc": "02", + "brand": "UNITEL", + "operator": "UNITEL S.a.r.l.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Angola", + "countryCode": "AO", + "mcc": "631", + "mnc": "04", + "brand": "MOVICEL", + "operator": "MOVICEL Telecommunications S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 1800", + "notes": "CDMA shut down March 2016" + }, + { + "type": "National", + "countryName": "Angola", + "countryCode": "AO", + "mcc": "631", + "mnc": "05", + "brand": null, + "operator": "Africell", + "status": "Operational", + "bands": "LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Benin", + "countryCode": "BJ", + "mcc": "616", + "mnc": "01", + "brand": null, + "operator": "Benin Telecoms Mobile", + "status": "Operational", + "bands": "LTE 1800 / CDMA / WiMAX", + "notes": "Brands are:- Telecoms (LTE), Kanakoo (CDMA / WiMAX); Libercom GSM shut down 2018" + }, + { + "type": "National", + "countryName": "Benin", + "countryCode": "BJ", + "mcc": "616", + "mnc": "02", + "brand": "Moov", + "operator": "Telecel Benin", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": "EtiSalat / Atlantique Telecom / Moov" + }, + { + "type": "National", + "countryName": "Benin", + "countryCode": "BJ", + "mcc": "616", + "mnc": "03", + "brand": "MTN", + "operator": "Spacetel Benin", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800", + "notes": "Former BeninCell, Areeba" + }, + { + "type": "National", + "countryName": "Benin", + "countryCode": "BJ", + "mcc": "616", + "mnc": "04", + "brand": "BBCOM", + "operator": "Bell Benin Communications", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Benin", + "countryCode": "BJ", + "mcc": "616", + "mnc": "05", + "brand": "Glo", + "operator": "Glo Communication Benin", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Licence revoked in 2017" + }, + { + "type": "National", + "countryName": "Botswana", + "countryCode": "BW", + "mcc": "652", + "mnc": "01", + "brand": "Mascom", + "operator": "Mascom Wireless (Pty) Limited", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / 5G", + "notes": null + }, + { + "type": "National", + "countryName": "Botswana", + "countryCode": "BW", + "mcc": "652", + "mnc": "02", + "brand": "Orange", + "operator": "Orange (Botswana) Pty Limited", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / LTE 2100 / TD-LTE / 5G", + "notes": "formerly Vista Cellular" + }, + { + "type": "National", + "countryName": "Botswana", + "countryCode": "BW", + "mcc": "652", + "mnc": "04", + "brand": "beMobile", + "operator": "Botswana Telecommunications Corporation", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Burkina Faso", + "countryCode": "BF", + "mcc": "613", + "mnc": "01", + "brand": "Telmob", + "operator": "Onatel", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Burkina Faso", + "countryCode": "BF", + "mcc": "613", + "mnc": "02", + "brand": "Orange", + "operator": "Orange Burkina Faso", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": "Previously Zain/Celtel, Airtel" + }, + { + "type": "National", + "countryName": "Burkina Faso", + "countryCode": "BF", + "mcc": "613", + "mnc": "03", + "brand": "Telecel Faso", + "operator": "Telecel Faso SA", + "status": "Operational", + "bands": "GSM 900 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Burundi", + "countryCode": "BI", + "mcc": "642", + "mnc": "01", + "brand": "econet Leo", + "operator": "Econet Wireless Burundi PLC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Spacetel" + }, + { + "type": "National", + "countryName": "Burundi", + "countryCode": "BI", + "mcc": "642", + "mnc": "02", + "brand": "Tempo", + "operator": "VTEL MEA", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Former Safaris; not related to Africell; suspended in 2015; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Burundi", + "countryCode": "BI", + "mcc": "642", + "mnc": "03", + "brand": "Onatel", + "operator": "Onatel", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Burundi", + "countryCode": "BI", + "mcc": "642", + "mnc": "07", + "brand": "Smart Mobile", + "operator": "LACELL SU", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100", + "notes": "suspended in 2022" + }, + { + "type": "National", + "countryName": "Burundi", + "countryCode": "BI", + "mcc": "642", + "mnc": "08", + "brand": "Lumitel", + "operator": "Viettel Burundi", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800", + "notes": "Formerly HiTs Telecom" + }, + { + "type": "National", + "countryName": "Burundi", + "countryCode": "BI", + "mcc": "642", + "mnc": "82", + "brand": "econet Leo", + "operator": "Econet Wireless Burundi PLC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Formerly Telecel, then U-COM Burundi" + }, + { + "type": "National", + "countryName": "Cameroon", + "countryCode": "CM", + "mcc": "624", + "mnc": "01", + "brand": "MTN Cameroon", + "operator": "Mobile Telephone Network Cameroon Ltd", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / TD-LTE 2500", + "notes": null + }, + { + "type": "National", + "countryName": "Cameroon", + "countryCode": "CM", + "mcc": "624", + "mnc": "02", + "brand": "Orange", + "operator": "Orange Cameroun S.A.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Cameroon", + "countryCode": "CM", + "mcc": "624", + "mnc": "03", + "brand": "Camtel", + "operator": "Camtel", + "status": "Operational", + "bands": "CDMA / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Cameroon", + "countryCode": "CM", + "mcc": "624", + "mnc": "04", + "brand": "Nexttel", + "operator": "Viettel Cameroun", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Cape Verde", + "countryCode": "CV", + "mcc": "625", + "mnc": "01", + "brand": "CVMOVEL", + "operator": "CVMóvel, S.A.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800", + "notes": null + }, + { + "type": "National", + "countryName": "Cape Verde", + "countryCode": "CV", + "mcc": "625", + "mnc": "02", + "brand": "T+", + "operator": "UNITEL T+ TELECOMUNICACÕES, S.A.", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Central African Republic", + "countryCode": "CF", + "mcc": "623", + "mnc": "01", + "brand": "Moov", + "operator": "Atlantique Telecom Centrafrique SA", + "status": "Operational", + "bands": "GSM 900", + "notes": "Former Centrafrique Telecom Plus, Etisalat" + }, + { + "type": "National", + "countryName": "Central African Republic", + "countryCode": "CF", + "mcc": "623", + "mnc": "02", + "brand": "TC", + "operator": "Telecel Centrafrique", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Central African Republic", + "countryCode": "CF", + "mcc": "623", + "mnc": "03", + "brand": "Orange", + "operator": "Orange RCA", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / WiMAX", + "notes": null + }, + { + "type": "National", + "countryName": "Central African Republic", + "countryCode": "CF", + "mcc": "623", + "mnc": "04", + "brand": "Azur", + "operator": "Azur RCA", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": "Former Nationlink Telecom RCA" + }, + { + "type": "National", + "countryName": "Chad", + "countryCode": "TD", + "mcc": "622", + "mnc": "01", + "brand": "Airtel", + "operator": "Bharti Airtel SA", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Chad", + "countryCode": "TD", + "mcc": "622", + "mnc": "02", + "brand": "Tawali", + "operator": "SotelTchad", + "status": "Operational", + "bands": "CDMA2000", + "notes": "semi-fixed line; formerly Tchad Mobile / Orascom Telecom GSM 900 - defunct in 2004" + }, + { + "type": "National", + "countryName": "Chad", + "countryCode": "TD", + "mcc": "622", + "mnc": "03", + "brand": "Tigo", + "operator": "Millicom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Chad", + "countryCode": "TD", + "mcc": "622", + "mnc": "07", + "brand": "Salam", + "operator": "SotelTchad", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Comoros", + "countryCode": "KM", + "mcc": "654", + "mnc": "01", + "brand": "HURI", + "operator": "Comores Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS 900", + "notes": null + }, + { + "type": "National", + "countryName": "Comoros", + "countryCode": "KM", + "mcc": "654", + "mnc": "02", + "brand": "TELCO SA", + "operator": "Telecom Malagasy (Telma)", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / LTE 800", + "notes": null + }, + { + "type": "National", + "countryName": "Congo", + "countryCode": "CG", + "mcc": "629", + "mnc": "01", + "brand": "Airtel", + "operator": "Celtel Congo", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 2600", + "notes": "Former Zain and Celtel brand" + }, + { + "type": "National", + "countryName": "Congo", + "countryCode": "CG", + "mcc": "629", + "mnc": "07", + "brand": "Airtel", + "operator": "Warid Telecom", + "status": "Operational", + "bands": "GSM 900", + "notes": "Acquired by Airtel in 2014" + }, + { + "type": "National", + "countryName": "Congo", + "countryCode": "CG", + "mcc": "629", + "mnc": "10", + "brand": "Libertis Telecom", + "operator": "MTN CONGO S.A", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Democratic Republic of the Congo", + "countryCode": "CD", + "mcc": "630", + "mnc": "01", + "brand": "Vodacom", + "operator": "Vodacom Congo RDC sprl", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / TD-LTE 3500 / WiMAX 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Democratic Republic of the Congo", + "countryCode": "CD", + "mcc": "630", + "mnc": "02", + "brand": "Airtel", + "operator": "Airtel sprl", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Democratic Republic of the Congo", + "countryCode": "CD", + "mcc": "630", + "mnc": "05", + "brand": "Supercell", + "operator": "Supercell SPRL", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Democratic Republic of the Congo", + "countryCode": "CD", + "mcc": "630", + "mnc": "86", + "brand": "Orange RDC", + "operator": "Orange RDC sarl", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / TD-LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Democratic Republic of the Congo", + "countryCode": "CD", + "mcc": "630", + "mnc": "88", + "brand": "YTT", + "operator": "Yozma Timeturns sprl", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Planned" + }, + { + "type": "National", + "countryName": "Democratic Republic of the Congo", + "countryCode": "CD", + "mcc": "630", + "mnc": "89", + "brand": "Orange RDC", + "operator": "Orange RDC sarl", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Former OASIS, Tigo; acquired by Orange 2016" + }, + { + "type": "National", + "countryName": "Democratic Republic of the Congo", + "countryCode": "CD", + "mcc": "630", + "mnc": "90", + "brand": "Africell", + "operator": "Africell RDC sprl", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Djibouti", + "countryCode": "DJ", + "mcc": "638", + "mnc": "01", + "brand": "Evatis", + "operator": "Djibouti Telecom SA", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Egypt", + "countryCode": "EG", + "mcc": "602", + "mnc": "01", + "brand": "Orange", + "operator": "Orange Egypt", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Mobinil" + }, + { + "type": "National", + "countryName": "Egypt", + "countryCode": "EG", + "mcc": "602", + "mnc": "02", + "brand": "Vodafone", + "operator": "Vodafone Egypt", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Egypt", + "countryCode": "EG", + "mcc": "602", + "mnc": "03", + "brand": "Etisalat", + "operator": "Etisalat Egypt", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Egypt", + "countryCode": "EG", + "mcc": "602", + "mnc": "04", + "brand": "WE", + "operator": "Telecom Egypt", + "status": "Operational", + "bands": "LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Equatorial Guinea", + "countryCode": "GQ", + "mcc": "627", + "mnc": "01", + "brand": "Orange GQ", + "operator": "GETESA", + "status": "Operational", + "bands": "GSM 900 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Equatorial Guinea", + "countryCode": "GQ", + "mcc": "627", + "mnc": "03", + "brand": "Muni", + "operator": "Green Com S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE", + "notes": "Former HiTS" + }, + { + "type": "National", + "countryName": "Eritrea", + "countryCode": "ER", + "mcc": "657", + "mnc": "01", + "brand": "Eritel", + "operator": "Eritrea Telecommunications Services Corporation", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Eswatini", + "countryCode": "SZ", + "mcc": "653", + "mnc": "01", + "brand": null, + "operator": "SPTC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Eswatini", + "countryCode": "SZ", + "mcc": "653", + "mnc": "02", + "brand": null, + "operator": "Eswatini Mobile Limited", + "status": "Operational", + "bands": "LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Eswatini", + "countryCode": "SZ", + "mcc": "653", + "mnc": "10", + "brand": "MTN Eswatini", + "operator": "MTN Eswatini Limited", + "status": "Operational", + "bands": "GSM 900 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Ethiopia", + "countryCode": "ET", + "mcc": "636", + "mnc": "01", + "brand": "MTN", + "operator": "Ethio Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "French Departments and Territories in the Indian Ocean (France)", + "countryCode": "YT/RE", + "mcc": "647", + "mnc": "00", + "brand": "Orange", + "operator": "Orange La Réunion", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 3500", + "notes": "Mayotte, Réunion" + }, + { + "type": "National", + "countryName": "French Departments and Territories in the Indian Ocean (France)", + "countryCode": "YT/RE", + "mcc": "647", + "mnc": "01", + "brand": "Maoré Mobile", + "operator": "BJT Partners", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 1800", + "notes": "Mayotte" + }, + { + "type": "National", + "countryName": "French Departments and Territories in the Indian Ocean (France)", + "countryCode": "YT/RE", + "mcc": "647", + "mnc": "02", + "brand": "Only", + "operator": "Telco OI", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "Mayotte" + }, + { + "type": "National", + "countryName": "French Departments and Territories in the Indian Ocean (France)", + "countryCode": "YT/RE", + "mcc": "647", + "mnc": "03", + "brand": "Free", + "operator": "Telco OI", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "Réunion\nFormer Only" + }, + { + "type": "National", + "countryName": "French Departments and Territories in the Indian Ocean (France)", + "countryCode": "YT/RE", + "mcc": "647", + "mnc": "04", + "brand": "Zeop", + "operator": "Zeop mobile", + "status": "Unknown", + "bands": "LTE 1800 / LTE 2100 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "French Departments and Territories in the Indian Ocean (France)", + "countryCode": "YT/RE", + "mcc": "647", + "mnc": "10", + "brand": "SFR Réunion", + "operator": "Société Réunionnaise du Radiotéléphone", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Mayotte, Réunion; LTE bands 20 / 3 / 7" + }, + { + "type": "National", + "countryName": "Gabon", + "countryCode": "GA", + "mcc": "628", + "mnc": "01", + "brand": "Libertis", + "operator": "Gabon Telecom S.A.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Gabon", + "countryCode": "GA", + "mcc": "628", + "mnc": "02", + "brand": "Moov", + "operator": "Gabon Telecom S.A.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Former Atlantique Télécom (Etisalat Group), merged with Gabon Telecom in 2016" + }, + { + "type": "National", + "countryName": "Gabon", + "countryCode": "GA", + "mcc": "628", + "mnc": "03", + "brand": "Airtel", + "operator": "Airtel Gabon S.A.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Gabon", + "countryCode": "GA", + "mcc": "628", + "mnc": "04", + "brand": "Azur", + "operator": "USAN Gabon S.A.", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "Shut down 2018" + }, + { + "type": "National", + "countryName": "Gabon", + "countryCode": "GA", + "mcc": "628", + "mnc": "05", + "brand": "RAG", + "operator": "Réseau de l’Administration Gabonaise", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Gambia", + "countryCode": "GM", + "mcc": "607", + "mnc": "01", + "brand": "Gamcel", + "operator": "Gamcel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Gambia", + "countryCode": "GM", + "mcc": "607", + "mnc": "02", + "brand": "Africell", + "operator": "Africell", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Gambia", + "countryCode": "GM", + "mcc": "607", + "mnc": "03", + "brand": "Comium", + "operator": "Comium", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Gambia", + "countryCode": "GM", + "mcc": "607", + "mnc": "04", + "brand": "QCell", + "operator": "QCell Gambia", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Gambia", + "countryCode": "GM", + "mcc": "607", + "mnc": "05", + "brand": null, + "operator": "Gamtel-Ecowan", + "status": "Unknown", + "bands": "WiMAX / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Gambia", + "countryCode": "GM", + "mcc": "607", + "mnc": "06", + "brand": null, + "operator": "NETPAGE", + "status": "Operational", + "bands": "TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "01", + "brand": "MTN", + "operator": "MTN Group", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 2600", + "notes": "former spacefon" + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "02", + "brand": "Vodafone", + "operator": "Vodafone Group", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800", + "notes": "former Onetouch, Ghana Telecom" + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "03", + "brand": "AirtelTigo", + "operator": "Millicom Ghana", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "former MOBITEL, Tigo" + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "04", + "brand": "Expresso", + "operator": "Kasapa / Hutchison Telecom", + "status": "Operational", + "bands": "CDMA2000 850", + "notes": "former Kasapa" + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "05", + "brand": null, + "operator": "National Security", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "06", + "brand": "AirtelTigo", + "operator": "Airtel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "former Zain, Airtel" + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "07", + "brand": "Globacom", + "operator": "Globacom Group", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "08", + "brand": "Surfline", + "operator": "Surfline Communications Ltd", + "status": "Not operational", + "bands": "LTE 2600", + "notes": "LTE band 7; shut down Oct 2018" + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "09", + "brand": "NITA", + "operator": "National Information Technology Agency", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "10", + "brand": "Blu", + "operator": "Blu Telecommunications", + "status": "Operational", + "bands": "TD-LTE 2500", + "notes": "LTE band 41" + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "11", + "brand": null, + "operator": "Netafrique Dot Com Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "12", + "brand": null, + "operator": "BTL", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "13", + "brand": null, + "operator": "Goldkey", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "14", + "brand": "busy", + "operator": "BusyInternet", + "status": "Operational", + "bands": "TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "15", + "brand": null, + "operator": "Lebara", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "16", + "brand": null, + "operator": "Telesol", + "status": "Operational", + "bands": "LTE 1800", + "notes": "data only" + }, + { + "type": "National", + "countryName": "Ghana", + "countryCode": "GH", + "mcc": "620", + "mnc": "17", + "brand": null, + "operator": "iBurst Africa", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Guinea", + "countryCode": "GN", + "mcc": "611", + "mnc": "01", + "brand": "Orange", + "operator": "Orange S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE", + "notes": "former Spacetel" + }, + { + "type": "National", + "countryName": "Guinea", + "countryCode": "GN", + "mcc": "611", + "mnc": "02", + "brand": "Sotelgui", + "operator": "Sotelgui Lagui", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Guinea", + "countryCode": "GN", + "mcc": "611", + "mnc": "03", + "brand": "Intercel", + "operator": "Intercel Guinée", + "status": "Not operational", + "bands": "GSM 900", + "notes": "former Telecel; license revoked Oct 2018" + }, + { + "type": "National", + "countryName": "Guinea", + "countryCode": "GN", + "mcc": "611", + "mnc": "04", + "brand": "MTN", + "operator": "Areeba Guinea", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Guinea", + "countryCode": "GN", + "mcc": "611", + "mnc": "05", + "brand": "Cellcom", + "operator": "Cellcom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Guinea-Bissau", + "countryCode": "GW", + "mcc": "632", + "mnc": "01", + "brand": "Guinetel", + "operator": "Guinétel S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Guinea-Bissau", + "countryCode": "GW", + "mcc": "632", + "mnc": "02", + "brand": "MTN Areeba", + "operator": "Spacetel Guiné-Bissau S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Guinea-Bissau", + "countryCode": "GW", + "mcc": "632", + "mnc": "03", + "brand": "Orange", + "operator": null, + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Guinea-Bissau", + "countryCode": "GW", + "mcc": "632", + "mnc": "07", + "brand": "Guinetel", + "operator": "Guinétel S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Ivory Coast", + "countryCode": "CI", + "mcc": "612", + "mnc": "01", + "brand": null, + "operator": "Cora de Comstar", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Ivory Coast", + "countryCode": "CI", + "mcc": "612", + "mnc": "02", + "brand": "Moov", + "operator": "Atlantique Cellulaire", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Ivory Coast", + "countryCode": "CI", + "mcc": "612", + "mnc": "03", + "brand": "Orange", + "operator": "Orange", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Ivory Coast", + "countryCode": "CI", + "mcc": "612", + "mnc": "04", + "brand": "KoZ", + "operator": "Comium Ivory Coast Inc", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Ivory Coast", + "countryCode": "CI", + "mcc": "612", + "mnc": "05", + "brand": "MTN", + "operator": "Loteny Telecom", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Ivory Coast", + "countryCode": "CI", + "mcc": "612", + "mnc": "06", + "brand": "GreenN", + "operator": "Oricel", + "status": "Operational", + "bands": "GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Ivory Coast", + "countryCode": "CI", + "mcc": "612", + "mnc": "07", + "brand": "café", + "operator": "Aircomm", + "status": "Operational", + "bands": "GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Ivory Coast", + "countryCode": "CI", + "mcc": "612", + "mnc": "18", + "brand": null, + "operator": "YooMee", + "status": "Operational", + "bands": "TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "01", + "brand": "Safaricom", + "operator": "Safaricom Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "02", + "brand": "Safaricom", + "operator": "Safaricom Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 2500", + "notes": null + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "03", + "brand": "Airtel", + "operator": "Bharti Airtel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800", + "notes": "Former Celtel, then Zain" + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "04", + "brand": null, + "operator": "Mobile Pay Kenya Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "05", + "brand": "Airtel", + "operator": "Bharti Airtel", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Econet Wireless, Essar Telecom; network sold to Safaricom in 2014, subscribers moved to Airtel" + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "06", + "brand": null, + "operator": "Finserve Africa Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "07", + "brand": "Telkom", + "operator": "Telkom Kenya", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800", + "notes": "Former Orange Kenya; CDMA 850 MHz shut down in Mar 2015" + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "08", + "brand": null, + "operator": "Wetribe Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Sema Mobile Services Ltd (MVNO)" + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "09", + "brand": null, + "operator": "Homeland Media Group Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "10", + "brand": "Faiba 4G", + "operator": "Jamii Telecommunications Limited", + "status": "Operational", + "bands": "LTE 700", + "notes": "LTE band 28" + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "11", + "brand": null, + "operator": "Jambo Telcoms Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former WiAfrica Kenya Ltd." + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "12", + "brand": null, + "operator": "Infura Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "13", + "brand": null, + "operator": "Hidiga Investments Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Kenya", + "countryCode": "KE", + "mcc": "639", + "mnc": "14", + "brand": null, + "operator": "NRG Media Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Lesotho", + "countryCode": "LS", + "mcc": "651", + "mnc": "01", + "brand": "Vodacom", + "operator": "Vodacom Lesotho (Pty) Ltd", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Lesotho", + "countryCode": "LS", + "mcc": "651", + "mnc": "02", + "brand": "Econet Telecom", + "operator": "Econet Ezi-cel", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Lesotho", + "countryCode": "LS", + "mcc": "651", + "mnc": "10", + "brand": "Vodacom", + "operator": "Vodacom Lesotho (Pty) Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Liberia", + "countryCode": "LR", + "mcc": "618", + "mnc": "01", + "brand": "Lonestar Cell MTN", + "operator": "Lonestar Communications Corporation", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Liberia", + "countryCode": "LR", + "mcc": "618", + "mnc": "02", + "brand": "Libercell", + "operator": "Atlantic Wireless (Liberia) Inc.", + "status": "Not operational", + "bands": "Unknown", + "notes": "Shut down in 2012" + }, + { + "type": "National", + "countryName": "Liberia", + "countryCode": "LR", + "mcc": "618", + "mnc": "04", + "brand": "Novafone", + "operator": "Novafone Inc.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Former Comium" + }, + { + "type": "National", + "countryName": "Liberia", + "countryCode": "LR", + "mcc": "618", + "mnc": "07", + "brand": "Orange LBR", + "operator": "Orange Liberia", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Cellcom" + }, + { + "type": "National", + "countryName": "Liberia", + "countryCode": "LR", + "mcc": "618", + "mnc": "20", + "brand": "LIBTELCO", + "operator": "Liberia Telecommunications Corporation", + "status": "Operational", + "bands": "CDMA2000", + "notes": null + }, + { + "type": "National", + "countryName": "Libya", + "countryCode": "LY", + "mcc": "606", + "mnc": "00", + "brand": "Libyana", + "operator": "Libyana", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Libya", + "countryCode": "LY", + "mcc": "606", + "mnc": "01", + "brand": "Madar", + "operator": "Al-Madar Al-Jadeed", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Libya", + "countryCode": "LY", + "mcc": "606", + "mnc": "02", + "brand": "Al-Jeel Phone", + "operator": "Al-Jeel Al-Jadeed", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Al-Madar" + }, + { + "type": "National", + "countryName": "Libya", + "countryCode": "LY", + "mcc": "606", + "mnc": "03", + "brand": "Libya Phone", + "operator": "Libya Telecom & Technology (LTT)", + "status": "Operational", + "bands": "MVNO / LTE 800", + "notes": "Uses Libyana; LTE for fixed wireless broadband" + }, + { + "type": "National", + "countryName": "Libya", + "countryCode": "LY", + "mcc": "606", + "mnc": "06", + "brand": "Hatef Libya", + "operator": "Hatef Libya", + "status": "Operational", + "bands": "CDMA2000", + "notes": "Fixed wireless" + }, + { + "type": "National", + "countryName": "Madagascar", + "countryCode": "MG", + "mcc": "646", + "mnc": "01", + "brand": "Airtel", + "operator": "Bharti Airtel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800", + "notes": "Former Celtel (Zain), Madacom" + }, + { + "type": "National", + "countryName": "Madagascar", + "countryCode": "MG", + "mcc": "646", + "mnc": "02", + "brand": "Orange", + "operator": "Orange Madagascar S.A.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Madagascar", + "countryCode": "MG", + "mcc": "646", + "mnc": "03", + "brand": "Sacel", + "operator": "Sacel Madagascar S.A.", + "status": "Not operational", + "bands": "GSM 900", + "notes": "license withdrawn in 2001" + }, + { + "type": "National", + "countryName": "Madagascar", + "countryCode": "MG", + "mcc": "646", + "mnc": "04", + "brand": "Telma", + "operator": "Telma Mobile S.A.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Madagascar", + "countryCode": "MG", + "mcc": "646", + "mnc": "05", + "brand": "BIP / blueline", + "operator": "Gulfsat Madagascar S.A.", + "status": "Operational", + "bands": "LTE 2100 / TD-LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Malawi", + "countryCode": "MW", + "mcc": "650", + "mnc": "01", + "brand": "TNM", + "operator": "Telecom Network Malawi", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / TD-LTE 2500", + "notes": null + }, + { + "type": "National", + "countryName": "Malawi", + "countryCode": "MW", + "mcc": "650", + "mnc": "02", + "brand": "Access", + "operator": "Access Communications Ltd", + "status": "Operational", + "bands": "CDMA / LTE 850", + "notes": null + }, + { + "type": "National", + "countryName": "Malawi", + "countryCode": "MW", + "mcc": "650", + "mnc": "03", + "brand": "MTL", + "operator": "Malawi Telecommunications Limited", + "status": "Operational", + "bands": "LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Malawi", + "countryCode": "MW", + "mcc": "650", + "mnc": "10", + "brand": "Airtel", + "operator": "Airtel Malawi Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 1800", + "notes": "Former Celtel (Zain)" + }, + { + "type": "National", + "countryName": "Mali", + "countryCode": "ML", + "mcc": "610", + "mnc": "01", + "brand": "Malitel", + "operator": "Malitel SA", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Mali", + "countryCode": "ML", + "mcc": "610", + "mnc": "02", + "brand": "Orange", + "operator": "Orange Mali SA", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Mali", + "countryCode": "ML", + "mcc": "610", + "mnc": "03", + "brand": "Telecel", + "operator": "Alpha Telecommunication Mali S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Mauritania", + "countryCode": "MR", + "mcc": "609", + "mnc": "01", + "brand": "Mattel", + "operator": "Mattel", + "status": "Operational", + "bands": "GSM 900 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Mauritania", + "countryCode": "MR", + "mcc": "609", + "mnc": "02", + "brand": "Chinguitel", + "operator": "Chinguitel", + "status": "Operational", + "bands": "CDMA / GSM 900 / GSM 1800 / UMTS 2100 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Mauritania", + "countryCode": "MR", + "mcc": "609", + "mnc": "10", + "brand": "Moov", + "operator": "Mauritel Mobiles", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Mauritius", + "countryCode": "MU", + "mcc": "617", + "mnc": "01", + "brand": "my.t", + "operator": "Cellplus Mobile Communications Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 3500", + "notes": "Former Orange" + }, + { + "type": "National", + "countryName": "Mauritius", + "countryCode": "MU", + "mcc": "617", + "mnc": "02", + "brand": "MOKOZE / AZU", + "operator": "Mahanagar Telephone Mauritius Limited (MTML)", + "status": "Operational", + "bands": "CDMA2000", + "notes": null + }, + { + "type": "National", + "countryName": "Mauritius", + "countryCode": "MU", + "mcc": "617", + "mnc": "03", + "brand": "CHILI", + "operator": "Mahanagar Telephone Mauritius Limited (MTML)", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Mauritius", + "countryCode": "MU", + "mcc": "617", + "mnc": "10", + "brand": "Emtel", + "operator": "Emtel Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G", + "notes": null + }, + { + "type": "National", + "countryName": "Morocco", + "countryCode": "MA", + "mcc": "604", + "mnc": "00", + "brand": "Orange Morocco", + "operator": "Médi Télécom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "Former Méditel" + }, + { + "type": "National", + "countryName": "Morocco", + "countryCode": "MA", + "mcc": "604", + "mnc": "01", + "brand": "IAM", + "operator": "Ittissalat Al-Maghrib (Maroc Telecom)", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Morocco", + "countryCode": "MA", + "mcc": "604", + "mnc": "02", + "brand": "INWI", + "operator": "Wana Corporate", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Morocco", + "countryCode": "MA", + "mcc": "604", + "mnc": "04", + "brand": null, + "operator": "Al Houria Telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Morocco", + "countryCode": "MA", + "mcc": "604", + "mnc": "05", + "brand": "INWI", + "operator": "Wana Corporate", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Morocco", + "countryCode": "MA", + "mcc": "604", + "mnc": "06", + "brand": "IAM", + "operator": "Ittissalat Al-Maghrib (Maroc Telecom)", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Morocco", + "countryCode": "MA", + "mcc": "604", + "mnc": "99", + "brand": null, + "operator": "Al Houria Telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Mozambique", + "countryCode": "MZ", + "mcc": "643", + "mnc": "01", + "brand": "mCel", + "operator": "Mocambique Celular S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / 5G", + "notes": null + }, + { + "type": "National", + "countryName": "Mozambique", + "countryCode": "MZ", + "mcc": "643", + "mnc": "03", + "brand": "Movitel", + "operator": "Movitel, SA", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800", + "notes": null + }, + { + "type": "National", + "countryName": "Mozambique", + "countryCode": "MZ", + "mcc": "643", + "mnc": "04", + "brand": "Vodacom", + "operator": "Vodacom Mozambique, S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Namibia", + "countryCode": "NA", + "mcc": "649", + "mnc": "01", + "brand": "MTC", + "operator": "MTC Namibia", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Namibia", + "countryCode": "NA", + "mcc": "649", + "mnc": "02", + "brand": "switch", + "operator": "Telecom Namibia", + "status": "Operational", + "bands": "CDMA2000 800", + "notes": null + }, + { + "type": "National", + "countryName": "Namibia", + "countryCode": "NA", + "mcc": "649", + "mnc": "03", + "brand": "TN Mobile", + "operator": "Telecom Namibia", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / TD-LTE 2600", + "notes": "former Cell One" + }, + { + "type": "National", + "countryName": "Namibia", + "countryCode": "NA", + "mcc": "649", + "mnc": "04", + "brand": null, + "operator": "Paratus Telecommunications (Pty)", + "status": "Operational", + "bands": "WiMAX 2500 / TD-LTE", + "notes": "former ITN/WTN" + }, + { + "type": "National", + "countryName": "Namibia", + "countryCode": "NA", + "mcc": "649", + "mnc": "05", + "brand": null, + "operator": "Demshi Investments CC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Namibia", + "countryCode": "NA", + "mcc": "649", + "mnc": "06", + "brand": null, + "operator": "MTN Namibia", + "status": "Operational", + "bands": "LTE", + "notes": "LTE fixed wireless, MVNO" + }, + { + "type": "National", + "countryName": "Namibia", + "countryCode": "NA", + "mcc": "649", + "mnc": "07", + "brand": null, + "operator": "Capricorn Connect", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Niger", + "countryCode": "NE", + "mcc": "614", + "mnc": "01", + "brand": "SahelCom", + "operator": "La Société Sahélienne de Télécommunications (SahelCom)", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Niger", + "countryCode": "NE", + "mcc": "614", + "mnc": "02", + "brand": "Airtel", + "operator": "Bharti Airtel Limited", + "status": "Operational", + "bands": "GSM 900 / LTE", + "notes": "formerly Zain, Celtel" + }, + { + "type": "National", + "countryName": "Niger", + "countryCode": "NE", + "mcc": "614", + "mnc": "03", + "brand": "Moov", + "operator": "Atlantique Telecom (subsidiary of Etisalat)", + "status": "Operational", + "bands": "GSM 900", + "notes": "Former Telecel" + }, + { + "type": "National", + "countryName": "Niger", + "countryCode": "NE", + "mcc": "614", + "mnc": "04", + "brand": "Orange", + "operator": "Orange Niger", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Nigeria", + "countryCode": "NG", + "mcc": "621", + "mnc": "00", + "brand": null, + "operator": "Capcom", + "status": "Not operational", + "bands": "LTE 1900", + "notes": "Former Starcomms, MultiLinks, and MTS First Wireless" + }, + { + "type": "National", + "countryName": "Nigeria", + "countryCode": "NG", + "mcc": "621", + "mnc": "20", + "brand": "Airtel", + "operator": "Bharti Airtel Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Former Zain, V-Mobile" + }, + { + "type": "National", + "countryName": "Nigeria", + "countryCode": "NG", + "mcc": "621", + "mnc": "22", + "brand": "InterC", + "operator": "InterC Network Ltd.", + "status": "Operational", + "bands": "LTE 800", + "notes": "Former Intercellular; LTE band 20" + }, + { + "type": "National", + "countryName": "Nigeria", + "countryCode": "NG", + "mcc": "621", + "mnc": "24", + "brand": null, + "operator": "Spectranet", + "status": "Operational", + "bands": "TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Nigeria", + "countryCode": "NG", + "mcc": "621", + "mnc": "25", + "brand": "Visafone", + "operator": "Visafone Communications Ltd.", + "status": "Not operational", + "bands": "CDMA2000 800 / CDMA2000 1900", + "notes": "Acquired by MTN" + }, + { + "type": "National", + "countryName": "Nigeria", + "countryCode": "NG", + "mcc": "621", + "mnc": "26", + "brand": null, + "operator": "Swift", + "status": "Operational", + "bands": "TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Nigeria", + "countryCode": "NG", + "mcc": "621", + "mnc": "27", + "brand": "Smile", + "operator": "Smile Communications Nigeria", + "status": "Operational", + "bands": "LTE 800", + "notes": "LTE band 20" + }, + { + "type": "National", + "countryName": "Nigeria", + "countryCode": "NG", + "mcc": "621", + "mnc": "30", + "brand": "MTN", + "operator": "MTN Nigeria Communications Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 2600 / TD-LTE 3500 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Nigeria", + "countryCode": "NG", + "mcc": "621", + "mnc": "40", + "brand": "Ntel", + "operator": "Nigerian Mobile Telecommunications Limited", + "status": "Operational", + "bands": "LTE 900 / LTE 1800", + "notes": "Former M-Tel; LTE bands 8 / 3" + }, + { + "type": "National", + "countryName": "Nigeria", + "countryCode": "NG", + "mcc": "621", + "mnc": "50", + "brand": "Glo", + "operator": "Globacom Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700", + "notes": "LTE band 28" + }, + { + "type": "National", + "countryName": "Nigeria", + "countryCode": "NG", + "mcc": "621", + "mnc": "60", + "brand": "9mobile", + "operator": "Emerging Markets Telecommunication Services Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": "Until 2017, Etisalat" + }, + { + "type": "National", + "countryName": "Rwanda", + "countryCode": "RW", + "mcc": "635", + "mnc": "10", + "brand": "MTN", + "operator": "MTN Rwandacell SARL", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Rwanda", + "countryCode": "RW", + "mcc": "635", + "mnc": "11", + "brand": "Rwandatel", + "operator": "Rwandatel S.A.", + "status": "Not operational", + "bands": "CDMA", + "notes": "Licence revoked in April 2011" + }, + { + "type": "National", + "countryName": "Rwanda", + "countryCode": "RW", + "mcc": "635", + "mnc": "12", + "brand": "Rwandatel", + "operator": "Rwandatel S.A.", + "status": "Not operational", + "bands": "GSM", + "notes": "Licence revoked in April 2011" + }, + { + "type": "National", + "countryName": "Rwanda", + "countryCode": "RW", + "mcc": "635", + "mnc": "13", + "brand": "Airtel", + "operator": "Airtel RWANDA", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Former Tigo" + }, + { + "type": "National", + "countryName": "Rwanda", + "countryCode": "RW", + "mcc": "635", + "mnc": "14", + "brand": "Airtel", + "operator": "Airtel RWANDA", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Merged with Tigo; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Rwanda", + "countryCode": "RW", + "mcc": "635", + "mnc": "17", + "brand": "Olleh", + "operator": "Olleh Rwanda Networks", + "status": "Operational", + "bands": "LTE 800 / LTE 1800", + "notes": "LTE band 20 / 3; wholesale network used by Airtel, MTN, Tigo" + }, + { + "type": "National", + "countryName": "Saint Helena, Ascension and Tristan da Cunha", + "countryCode": "SH", + "mcc": "658", + "mnc": "01", + "brand": "Sure", + "operator": "Sure South Atlantic Ltd.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "São Tomé and Príncipe", + "countryCode": "ST", + "mcc": "626", + "mnc": "01", + "brand": "CSTmovel", + "operator": "Companhia Santomense de Telecomunicações", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "São Tomé and Príncipe", + "countryCode": "ST", + "mcc": "626", + "mnc": "02", + "brand": "Unitel STP", + "operator": "Unitel São Tomé and Príncipe", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Senegal", + "countryCode": "SN", + "mcc": "608", + "mnc": "01", + "brand": "Orange", + "operator": "Sonatel", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Senegal", + "countryCode": "SN", + "mcc": "608", + "mnc": "02", + "brand": "Free", + "operator": "Saga Africa Holdings Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": "Former Hello, Tigo" + }, + { + "type": "National", + "countryName": "Senegal", + "countryCode": "SN", + "mcc": "608", + "mnc": "03", + "brand": "Expresso", + "operator": "Expresso Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Senegal", + "countryCode": "SN", + "mcc": "608", + "mnc": "04", + "brand": null, + "operator": "CSU-SA", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Seychelles", + "countryCode": "SC", + "mcc": "633", + "mnc": "01", + "brand": "Cable & Wireless", + "operator": "Cable & Wireless Seychelles", + "status": "Operational", + "bands": "GSM 900 / UMTS / 5G", + "notes": null + }, + { + "type": "National", + "countryName": "Seychelles", + "countryCode": "SC", + "mcc": "633", + "mnc": "02", + "brand": "Mediatech", + "operator": "Mediatech International", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "License and MNC withdrawn" + }, + { + "type": "National", + "countryName": "Seychelles", + "countryCode": "SC", + "mcc": "633", + "mnc": "05", + "brand": null, + "operator": "Intelvision Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Seychelles", + "countryCode": "SC", + "mcc": "633", + "mnc": "10", + "brand": "Airtel", + "operator": "Telecom Seychelles Ltd", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800", + "notes": null + }, + { + "type": "National", + "countryName": "Sierra Leone", + "countryCode": "SL", + "mcc": "619", + "mnc": "01", + "brand": "Orange", + "operator": "Orange SL Limited", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE", + "notes": "Former Zain, Celtel, Bharti Airtel" + }, + { + "type": "National", + "countryName": "Sierra Leone", + "countryCode": "SL", + "mcc": "619", + "mnc": "02", + "brand": "Africell", + "operator": "Lintel Sierra Leone Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Millicom, Tigo" + }, + { + "type": "National", + "countryName": "Sierra Leone", + "countryCode": "SL", + "mcc": "619", + "mnc": "03", + "brand": "Africell", + "operator": "Lintel Sierra Leone Limited", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Sierra Leone", + "countryCode": "SL", + "mcc": "619", + "mnc": "04", + "brand": "Comium", + "operator": "Comium (Sierra Leone) Ltd.", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Sierra Leone", + "countryCode": "SL", + "mcc": "619", + "mnc": "05", + "brand": "Africell", + "operator": "Lintel Sierra Leone Limited", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Sierra Leone", + "countryCode": "SL", + "mcc": "619", + "mnc": "06", + "brand": "SierraTel", + "operator": "Sierra Leone Telephony", + "status": "Operational", + "bands": "CDMA 800 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Sierra Leone", + "countryCode": "SL", + "mcc": "619", + "mnc": "07", + "brand": null, + "operator": "Qcell Sierra Leone", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sierra Leone", + "countryCode": "SL", + "mcc": "619", + "mnc": "09", + "brand": "Smart Mobile", + "operator": "InterGroup Telecom SL", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Sierra Leone", + "countryCode": "SL", + "mcc": "619", + "mnc": "25", + "brand": "Mobitel", + "operator": "Mobitel", + "status": "Reserved", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sierra Leone", + "countryCode": "SL", + "mcc": "619", + "mnc": "40", + "brand": null, + "operator": "Datatel (SL) Ltd.", + "status": "Unknown", + "bands": "GSM", + "notes": null + }, + { + "type": "National", + "countryName": "Sierra Leone", + "countryCode": "SL", + "mcc": "619", + "mnc": "50", + "brand": null, + "operator": "Datatel (SL) Ltd.", + "status": "Unknown", + "bands": "CDMA", + "notes": null + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "01", + "brand": "Telesom", + "operator": "Telesom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "04", + "brand": "Somafone", + "operator": "Somafone FZLLC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "10", + "brand": "Nationlink", + "operator": "NationLink Telecom", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "20", + "brand": "SOMNET", + "operator": "SOMNET", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800", + "notes": "Uncertain bands" + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "50", + "brand": "Hormuud", + "operator": "Hormuud Telecom Somalia Inc", + "status": "Operational", + "bands": "GSM 900 / UMTS", + "notes": "Uncertain MNC number, maybe (also) 25" + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "30", + "brand": "Golis", + "operator": "Golis Telecom Somalia", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "57", + "brand": "UNITEL", + "operator": "UNITEL S.a.r.l.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "60", + "brand": "Nationlink", + "operator": "Nationlink Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "67", + "brand": "Horntel Group", + "operator": "HTG Group Somalia", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "70", + "brand": null, + "operator": "Onkod Telecom Ltd.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "71", + "brand": "Somtel", + "operator": "Somtel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800", + "notes": null + }, + { + "type": "National", + "countryName": "Somalia", + "countryCode": "SO", + "mcc": "637", + "mnc": "82", + "brand": "Telcom", + "operator": "Telcom Somalia", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / CDMA2000 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "01", + "brand": "Vodacom", + "operator": "Vodacom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / LTE 5200 / LTE 5800 / 5G 700 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "02", + "brand": "Telkom", + "operator": "Telkom SA SOC Ltd", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / TD-LTE 2300 / 5G 3500", + "notes": "Formerly Telkom Mobile, 8ta" + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "03", + "brand": "Telkom", + "operator": "Telkom SA SOC Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "04", + "brand": null, + "operator": "Sasol (Pty) Ltd.", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "05", + "brand": null, + "operator": "Telkom SA Ltd", + "status": "Unknown", + "bands": "Unknown 3G", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "06", + "brand": null, + "operator": "Sentech (Pty) Ltd", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "07", + "brand": "Cell C", + "operator": "Cell C (Pty) Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "10", + "brand": "MTN", + "operator": "MTN Group", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900 / LTE 1800 / LTE 2100 / 5G 700 / 5G 1800 / 5G 2100 / 5G 3500 / 5G 28000", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "11", + "brand": null, + "operator": "South African Police Service Gauteng", + "status": "Not operational", + "bands": "TETRA 410", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "12", + "brand": "MTN", + "operator": "MTN Group", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "13", + "brand": "Neotel", + "operator": "Neotel Pty Ltd", + "status": "Not operational", + "bands": "CDMA 800", + "notes": "Shut down May 2019" + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "14", + "brand": "Neotel", + "operator": "Neotel Pty Ltd", + "status": "Operational", + "bands": "LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "16", + "brand": null, + "operator": "Phoenix System Integration (Pty) Ltd", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "17", + "brand": null, + "operator": "Sishen Iron Ore Company (Ltd) Pty", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "19", + "brand": "rain", + "operator": "Wireless Business Solutions (Pty) Ltd", + "status": "Operational", + "bands": "LTE 1800 / TD-LTE 2600 / TD-5G 2600", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "21", + "brand": null, + "operator": "Cape Town Metropolitan Council", + "status": "Not operational", + "bands": "TETRA 410", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "24", + "brand": null, + "operator": "SMSPortal (Pty) Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "25", + "brand": null, + "operator": "Wirels Connect", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "27", + "brand": null, + "operator": "A to Z Vaal Industrial Supplies Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "28", + "brand": null, + "operator": "Hymax Talking Solutions (Pty) Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "30", + "brand": null, + "operator": "Bokamoso Consortium", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "31", + "brand": null, + "operator": "Karabo Telecoms (Pty) Ltd.", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "32", + "brand": null, + "operator": "Ilizwi Telecommunications", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "33", + "brand": null, + "operator": "Thinta Thinta Telecommunications Pty Ltd", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "34", + "brand": null, + "operator": "Bokone Telecoms Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "35", + "brand": null, + "operator": "Kingdom Communications Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "36", + "brand": null, + "operator": "Amatole Telecommunications Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "38", + "brand": "rain", + "operator": "Wireless Business Solutions (Pty) Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former iBurst" + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "41", + "brand": null, + "operator": "South African Police Service", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "46", + "brand": null, + "operator": "SMS Cellular Services (Pty) Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "50", + "brand": null, + "operator": "Ericsson South Africa (Pty) Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "51", + "brand": null, + "operator": "Integrat (Pty) Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "53", + "brand": "Lycamobile", + "operator": "Lycamobile (Pty) Ltd", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "65", + "brand": null, + "operator": "Vodacom Pty Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "73", + "brand": "rain", + "operator": "Wireless Business Solutions (Pty) Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former iBurst" + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "74", + "brand": "rain", + "operator": "Wireless Business Solutions (Pty) Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former iBurst" + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "75", + "brand": "ACSA", + "operator": "Airports Company South Africa", + "status": "Not operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "76", + "brand": null, + "operator": "Comsol Networks (Pty) Ltd", + "status": "Operational", + "bands": "WiMAX / 28000", + "notes": null + }, + { + "type": "National", + "countryName": "South Africa", + "countryCode": "ZA", + "mcc": "655", + "mnc": "77", + "brand": "Umoja Connect", + "operator": "One Telecom (Pty) Ltd", + "status": "Unknown", + "bands": "5G", + "notes": null + }, + { + "type": "National", + "countryName": "South Sudan", + "countryCode": "SS", + "mcc": "659", + "mnc": "02", + "brand": "MTN", + "operator": "MTN South Sudan", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "South Sudan", + "countryCode": "SS", + "mcc": "659", + "mnc": "03", + "brand": "Gemtel", + "operator": "Gemtel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800", + "notes": null + }, + { + "type": "National", + "countryName": "South Sudan", + "countryCode": "SS", + "mcc": "659", + "mnc": "04", + "brand": "Vivacell", + "operator": "Network of the World (NOW)", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800", + "notes": "shut down Mar 2018" + }, + { + "type": "National", + "countryName": "South Sudan", + "countryCode": "SS", + "mcc": "659", + "mnc": "06", + "brand": "Zain", + "operator": "Zain South Sudan", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "South Sudan", + "countryCode": "SS", + "mcc": "659", + "mnc": "07", + "brand": "Sudani", + "operator": "Sudani", + "status": "Operational", + "bands": "CDMA", + "notes": null + }, + { + "type": "National", + "countryName": "Sudan", + "countryCode": "SD", + "mcc": "634", + "mnc": "01", + "brand": "Zain SD", + "operator": "Zain Group - Sudan", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800", + "notes": "Former, Mobitel" + }, + { + "type": "National", + "countryName": "Sudan", + "countryCode": "SD", + "mcc": "634", + "mnc": "02", + "brand": "MTN", + "operator": "MTN Sudan", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Sudan", + "countryCode": "SD", + "mcc": "634", + "mnc": "03", + "brand": "MTN", + "operator": "MTN Sudan", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Sudan", + "countryCode": "SD", + "mcc": "634", + "mnc": "05", + "brand": "canar", + "operator": "Canar Telecom", + "status": "Operational", + "bands": "CDMA2000 450", + "notes": null + }, + { + "type": "National", + "countryName": "Sudan", + "countryCode": "SD", + "mcc": "634", + "mnc": "07", + "brand": "Sudani One", + "operator": "Sudatel Group", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / CDMA2000 800", + "notes": null + }, + { + "type": "National", + "countryName": "Sudan", + "countryCode": "SD", + "mcc": "634", + "mnc": "09", + "brand": "khartoum INC", + "operator": "NEC", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "01", + "brand": null, + "operator": "Shared Network Tanzania Limited", + "status": "Not operational", + "bands": "UMTS 900", + "notes": "Former Rural NetCo Limited; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "02", + "brand": "tiGO", + "operator": "MIC Tanzania Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800 / 5G 2500", + "notes": "Former Mobitel and Buzz" + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "03", + "brand": "Zantel", + "operator": "Zanzibar Telecom Ltd", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "04", + "brand": "Vodacom", + "operator": "Vodacom Tanzania Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G 700 / 5G 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "05", + "brand": "Airtel", + "operator": "Bharti Airtel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 2100", + "notes": "Former Celtel (Zain); LTE bands 28 / 1" + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "06", + "brand": null, + "operator": "WIA Company Limited", + "status": "Operational", + "bands": "WiMAX / LTE", + "notes": "Former Sasatel (Dovetel); fixed wireless" + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "07", + "brand": "TTCL Mobile", + "operator": "Tanzania Telecommunication Company LTD (TTCL)", + "status": "Operational", + "bands": "CDMA 800 / UMTS 2100 / LTE 1800 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "08", + "brand": "Smart", + "operator": "Benson Informatics Limited", + "status": "Not operational", + "bands": "TD-LTE 2300", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "09", + "brand": "Halotel", + "operator": "Viettel Tanzania Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Former ExcellentCom Tanzania Limited (Hits)" + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "11", + "brand": "SmileCom", + "operator": "Smile Telecoms Holdings Ltd.", + "status": "Operational", + "bands": "LTE 800", + "notes": null + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "12", + "brand": null, + "operator": "MyCell Limited", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "13", + "brand": "Cootel", + "operator": "Wiafrica Tanzania Limited", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Tanzania", + "countryCode": "TZ", + "mcc": "640", + "mnc": "14", + "brand": null, + "operator": "MO Mobile Holding Limited", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Togo", + "countryCode": "TG", + "mcc": "615", + "mnc": "01", + "brand": "Togo Cell", + "operator": "Togo Telecom", + "status": "Operational", + "bands": "GSM 900 / LTE / 5G", + "notes": null + }, + { + "type": "National", + "countryName": "Togo", + "countryCode": "TG", + "mcc": "615", + "mnc": "03", + "brand": "Moov", + "operator": "Moov Togo", + "status": "Operational", + "bands": "GSM 900 / LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Tunisia", + "countryCode": "TN", + "mcc": "605", + "mnc": "01", + "brand": "Orange", + "operator": "Orange Tunisie", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Tunisia", + "countryCode": "TN", + "mcc": "605", + "mnc": "02", + "brand": "Tunicell", + "operator": "Tunisie Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Tunisia", + "countryCode": "TN", + "mcc": "605", + "mnc": "03", + "brand": "Ooredoo", + "operator": "Ooredoo Tunisiana", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / UMTS 2100 / LTE 800 / LTE 1800", + "notes": "former Orascom Telecom Tunisie" + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "01", + "brand": "Airtel", + "operator": "Bharti Airtel", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": "Former Zain, Celtel" + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "04", + "brand": null, + "operator": "Tangerine Uganda Limited", + "status": "Operational", + "bands": "LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "06", + "brand": "Vodafone", + "operator": "Afrimax Uganda", + "status": "Not operational", + "bands": "TD-LTE 2600", + "notes": "shut down May 2018; MNC withdrawn" + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "10", + "brand": "MTN", + "operator": "MTN Uganda", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 2600", + "notes": "LTE band 7" + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "11", + "brand": "Uganda Telecom", + "operator": "Uganda Telecom Ltd.", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "14", + "brand": "Africell", + "operator": "Africell Uganda", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS / LTE 800", + "notes": "Former Orange, HiTS Telecom; LTE band 20" + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "16", + "brand": null, + "operator": "SimbaNET Uganda Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "18", + "brand": "Smart", + "operator": "Suretelecom Uganda Ltd.", + "status": "Not operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "20", + "brand": null, + "operator": "Hamilton Telecom Limited", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "22", + "brand": "Airtel", + "operator": "Bharti Airtel", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS", + "notes": "Former Warid Telecom" + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "26", + "brand": "Lycamobile", + "operator": "Lycamobile Network Services Uganda Limited", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "30", + "brand": null, + "operator": "Anupam Global Soft Uganda Limited", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "33", + "brand": "Smile", + "operator": "Smile Communications Uganda Limited", + "status": "Operational", + "bands": "LTE 800", + "notes": "LTE band 20" + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "40", + "brand": null, + "operator": "Civil Aviation Authority (CAA)", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "44", + "brand": "K2", + "operator": "K2 Telecom Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Uganda", + "countryCode": "UG", + "mcc": "641", + "mnc": "66", + "brand": "i-Tel", + "operator": "i-Tel Ltd", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Zambia", + "countryCode": "ZM", + "mcc": "645", + "mnc": "01", + "brand": "Airtel", + "operator": "Bharti Airtel", + "status": "Operational", + "bands": "GSM 900 / UMTS 900 / UMTS 2100 / LTE 900", + "notes": "Former Celtel (Zain)" + }, + { + "type": "National", + "countryName": "Zambia", + "countryCode": "ZM", + "mcc": "645", + "mnc": "02", + "brand": "MTN", + "operator": "MTN Group", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 1800 / 5G 2600", + "notes": "Former Telecel" + }, + { + "type": "National", + "countryName": "Zambia", + "countryCode": "ZM", + "mcc": "645", + "mnc": "03", + "brand": "ZAMTEL", + "operator": "Zambia Telecommunications Company Ltd", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / TD-LTE 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Zambia", + "countryCode": "ZM", + "mcc": "645", + "mnc": "07", + "brand": null, + "operator": "Liquid Telecom Zambia Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Zimbabwe", + "countryCode": "ZW", + "mcc": "648", + "mnc": "01", + "brand": "Net*One", + "operator": "Net*One Cellular (Pvt) Ltd", + "status": "Operational", + "bands": "GSM 900 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Zimbabwe", + "countryCode": "ZW", + "mcc": "648", + "mnc": "03", + "brand": "Telecel", + "operator": "Telecel Zimbabwe (PVT) Ltd", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Zimbabwe", + "countryCode": "ZW", + "mcc": "648", + "mnc": "04", + "brand": "Econet", + "operator": "Econet Wireless", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 1800 / 5G", + "notes": null + }, + { + "type": "National", + "countryName": "Argentina", + "countryCode": "AR", + "mcc": "722", + "mnc": "010", + "brand": "Movistar", + "operator": "Telefónica Móviles Argentina S.A.", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Argentina", + "countryCode": "AR", + "mcc": "722", + "mnc": "020", + "brand": "Nextel", + "operator": "NII Holdings", + "status": "Not operational", + "bands": "iDEN 800", + "notes": "Shut down June 2019" + }, + { + "type": "National", + "countryName": "Argentina", + "countryCode": "AR", + "mcc": "722", + "mnc": "034", + "brand": "Personal", + "operator": "Telecom Personal S.A.", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Argentina", + "countryCode": "AR", + "mcc": "722", + "mnc": "040", + "brand": "Globalstar", + "operator": "TE.SA.M Argentina S.A.", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Argentina", + "countryCode": "AR", + "mcc": "722", + "mnc": "070", + "brand": "Movistar", + "operator": "Telefónica Móviles Argentina S.A.", + "status": "Operational", + "bands": "GSM 1900", + "notes": "Also uses or had used MNC 07" + }, + { + "type": "National", + "countryName": "Argentina", + "countryCode": "AR", + "mcc": "722", + "mnc": "310", + "brand": "Claro", + "operator": "AMX Argentina S.A.", + "status": "Operational", + "bands": "GSM 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Argentina", + "countryCode": "AR", + "mcc": "722", + "mnc": "320", + "brand": "Claro", + "operator": "AMX Argentina S.A.", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Argentina", + "countryCode": "AR", + "mcc": "722", + "mnc": "330", + "brand": "Claro", + "operator": "AMX Argentina S.A.", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Argentina", + "countryCode": "AR", + "mcc": "722", + "mnc": "341", + "brand": "Personal", + "operator": "Telecom Personal S.A.", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 2600 / 5G 2600", + "notes": "LTE bands 28 / 4 / 7" + }, + { + "type": "National", + "countryName": "Argentina", + "countryCode": "AR", + "mcc": "722", + "mnc": "350", + "brand": "PORT-HABLE", + "operator": "Hutchison Telecommunications Argentina S.A.", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Acquired by Claro" + }, + { + "type": "National", + "countryName": "Belize", + "countryCode": "BZ", + "mcc": "702", + "mnc": "67", + "brand": "DigiCell", + "operator": "Belize Telemedia Limited (BTL)", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1900", + "notes": "LTE bands 17 / 2" + }, + { + "type": "National", + "countryName": "Belize", + "countryCode": "BZ", + "mcc": "702", + "mnc": "68", + "brand": "INTELCO", + "operator": "International Telecommunications Ltd.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Belize", + "countryCode": "BZ", + "mcc": "702", + "mnc": "69", + "brand": "SMART", + "operator": "Speednet Communications Limited", + "status": "Operational", + "bands": "CDMA2000 850 / UMTS 850 / LTE 700", + "notes": "LTE band 13" + }, + { + "type": "National", + "countryName": "Belize", + "countryCode": "BZ", + "mcc": "702", + "mnc": "99", + "brand": "SMART", + "operator": "Speednet Communications Limited", + "status": "Operational", + "bands": "CDMA2000 850", + "notes": null + }, + { + "type": "National", + "countryName": "Bolivia", + "countryCode": "BO", + "mcc": "736", + "mnc": "01", + "brand": "Viva", + "operator": "Nuevatel PCS De Bolivia SA", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Bolivia", + "countryCode": "BO", + "mcc": "736", + "mnc": "02", + "brand": "Entel", + "operator": "Entel SA", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Bolivia", + "countryCode": "BO", + "mcc": "736", + "mnc": "03", + "brand": "Tigo", + "operator": "Telefónica Celular De Bolivia S.A", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700", + "notes": "Aka. Telecel Bolivia" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "00", + "brand": "Nextel", + "operator": "NII Holdings, Inc.", + "status": "Not operational", + "bands": "iDEN 850", + "notes": "Defunct since March 2018" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "01", + "brand": null, + "operator": "SISTEER DO BRASIL TELECOMUNICAÇÔES", + "status": "Unknown", + "bands": "MVNO", + "notes": "Through Vivo S.A. network" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "02", + "brand": "TIM", + "operator": "Telecom Italia Mobile", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2300 / 5G 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "03", + "brand": "TIM", + "operator": "Telecom Italia Mobile", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2300 / 5G 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "04", + "brand": "TIM", + "operator": "Telecom Italia Mobile", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 900 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2300 / 5G 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "05", + "brand": "Claro", + "operator": "Claro", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600 / 5G 2300 / 5G 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "06", + "brand": "Vivo", + "operator": "Telefônica Brasil S.A.", + "status": "Operational", + "bands": "GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2300 / 5G 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "10", + "brand": "Vivo", + "operator": "Telefônica Brasil S.A.", + "status": "Operational", + "bands": "GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2300 / 5G 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "11", + "brand": "Vivo", + "operator": "Telefônica Brasil S.A.", + "status": "Operational", + "bands": "GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1800 / LTE 2600 / 5G 700 / 5G 1800 / 5G 2300 / 5G 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "12", + "brand": "Claro", + "operator": "Claro", + "status": "Unknown", + "bands": "Unknown", + "notes": "Unknown" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "15", + "brand": "Sercomtel", + "operator": "Sercomtel Celular", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 850", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "16", + "brand": "Brasil Telecom GSM", + "operator": "Brasil Telecom GSM", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100", + "notes": "acquired by Oi, MNC used for existing Brasil Telecom SIM Cards only" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "17", + "brand": "Surf Telecom", + "operator": "Correios Celula", + "status": "Operational", + "bands": "MVNO", + "notes": "Through TIM network" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "18", + "brand": "datora", + "operator": "Datora (Vodafone)", + "status": "Operational", + "bands": "MVNO", + "notes": "Through TIM network" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "21", + "brand": "LIGUE", + "operator": "Ligue Telecom", + "status": "Operational", + "bands": "LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "23", + "brand": "Vivo", + "operator": "Telefônica Brasil S.A.", + "status": "Operational", + "bands": "GSM 850 / GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800 / LTE 2600", + "notes": "formerly used by the acquired Telemig Celular" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "24", + "brand": null, + "operator": "Amazonia Celular", + "status": "Unknown", + "bands": "Unknown", + "notes": "acquired by Oi" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "28", + "brand": "No name", + "operator": null, + "status": "Operational", + "bands": "Unknown", + "notes": "Used for RanSharing control and roaming between Vivo and Claro" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "29", + "brand": "Unifique", + "operator": "Unifique Telecomunicações S/A", + "status": "Operational", + "bands": "5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "30", + "brand": "Oi", + "operator": "TNL PCS Oi", + "status": "Not operational", + "bands": "Unknown", + "notes": "Liquidated Apr 2022" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "31", + "brand": "Oi", + "operator": "TNL PCS Oi", + "status": "Not operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800 / LTE 2100 / LTE 2600 / 5G 2100", + "notes": "Liquidated Apr 2022" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "32", + "brand": "Algar Telecom", + "operator": "Algar Telecom S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / 5G 2300", + "notes": "LTE bands 28 / 3" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "33", + "brand": "Algar Telecom", + "operator": "Algar Telecom S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / 5G 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "34", + "brand": "Algar Telecom", + "operator": "Algar Telecom S.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / 5G 2300", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "35", + "brand": null, + "operator": "Telcom Telecomunicações", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "36", + "brand": null, + "operator": "Options Telecomunicações", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "37", + "brand": "aeiou", + "operator": "Unicel", + "status": "Not operational", + "bands": "Unknown", + "notes": "Bankruptcy in 2011" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "38", + "brand": "Claro", + "operator": "Claro", + "status": "Operational", + "bands": "GSM 1900", + "notes": "Inherited from the old Vesper's WLL licenses. In use for fixed wireless phones." + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "39", + "brand": "Nextel", + "operator": "NII Holdings, Inc.", + "status": "Operational", + "bands": "UMTS 2100 / LTE 1800 / LTE 2100", + "notes": null + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "54", + "brand": "Conecta", + "operator": "PORTO SEGURO TELECOMUNICAÇÔES", + "status": "Operational", + "bands": "MVNO", + "notes": "Through TIM network" + }, + { + "type": "National", + "countryName": "Brazil", + "countryCode": "BR", + "mcc": "724", + "mnc": "99", + "brand": "Local", + "operator": null, + "status": "Operational", + "bands": "Unknown", + "notes": "Used for RanSharing control and roaming between TIM and Oi" + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "01", + "brand": "entel", + "operator": "Entel Telefonía Móvil S.A.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 700 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "02", + "brand": "Movistar", + "operator": "Telefónica Móvil de Chile", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 2600 / 5G 3500", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "03", + "brand": "CLARO CL", + "operator": "Claro Chile S.A.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 700 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "04", + "brand": "WOM", + "operator": "Novator Partners", + "status": "Operational", + "bands": "iDEN 800", + "notes": "Former Nextel" + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "05", + "brand": null, + "operator": "Multikom S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "06", + "brand": "Telsur", + "operator": "Blue Two Chile S.A.", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "07", + "brand": "Movistar", + "operator": "Telefónica Móvil de Chile", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "08", + "brand": "VTR Móvil", + "operator": "VTR S.A.", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Movistar" + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "09", + "brand": "WOM", + "operator": "Novator Partners", + "status": "Operational", + "bands": "UMTS 1700 / LTE 1700 / 5G 3500", + "notes": "Former Nextel; roaming with entel and Claro networks (GSM / UMTS)" + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "10", + "brand": "entel", + "operator": "Entel Telefonía Móvil S.A.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "11", + "brand": null, + "operator": "Celupago S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "12", + "brand": "Colo-Colo MóvilWanderers Móvil", + "operator": "Telestar Móvil S.A.", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Movistar" + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "13", + "brand": "Virgin Mobile", + "operator": "Tribe Mobile Chile SPA", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Movistar" + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "14", + "brand": null, + "operator": "Netline Telefónica Móvil Ltda", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "15", + "brand": null, + "operator": "Cibeles Telecom S.A.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "16", + "brand": null, + "operator": "Nomade Telecomunicaciones S.A.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "17", + "brand": null, + "operator": "COMPATEL Chile Limitada", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "18", + "brand": null, + "operator": "Empresas Bunker S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "19", + "brand": "móvil Falabella", + "operator": "Sociedad Falabella Móvil SPA", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses entel" + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "20", + "brand": null, + "operator": "Inversiones Santa Fe Limitada", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "22", + "brand": null, + "operator": "Cellplus SpA", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "23", + "brand": null, + "operator": "Claro Servicios Empresariales S. A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "26", + "brand": null, + "operator": "WILL S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "27", + "brand": null, + "operator": "Cibeles Telecom S.A.", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "National", + "countryName": "Chile", + "countryCode": "CL", + "mcc": "730", + "mnc": "99", + "brand": "Will", + "operator": "WILL Telefonía", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900", + "notes": "Wireless local loop" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "001", + "brand": "Movistar", + "operator": "Colombia Telecomunicaciones S.A. ESP", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "002", + "brand": "Edatel", + "operator": "Edatel S.A. ESP", + "status": "Unknown", + "bands": "Unknown", + "notes": "Fixed wireless" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "003", + "brand": null, + "operator": "LLEIDA S.A.S.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "004", + "brand": null, + "operator": "COMPATEL COLOMBIA SAS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "020", + "brand": "Tigo", + "operator": "Une EPM Telecomunicaciones S.A. E.S.P.", + "status": "Operational", + "bands": "LTE 2600", + "notes": "Former Une-EPM; Former Emtelsa; merged with Tigo" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "099", + "brand": "EMCALI", + "operator": "Empresas Municipales de Cali", + "status": "Operational", + "bands": "GSM 900", + "notes": "Fixed wireless" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "100", + "brand": "Claro", + "operator": "Comunicacion Celular S.A. (Comcel)", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "101", + "brand": "Claro", + "operator": "Comunicacion Celular S.A. (Comcel)", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1700 / LTE 2600", + "notes": "GSM to shut down Feb 2023" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "102", + "brand": null, + "operator": "Bellsouth Colombia", + "status": "Not operational", + "bands": "GSM 850 / GSM 1900 / CDMA 850", + "notes": "MNC withdrawn; network acquired by Movistar" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "103", + "brand": "Tigo", + "operator": "Colombia Móvil S.A. ESP", + "status": "Operational", + "bands": "UMTS 2100 / LTE 700 / LTE 1700 / LTE 2600", + "notes": "GSM shut down Nov 2022" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "111", + "brand": "Tigo", + "operator": "Colombia Móvil S.A. ESP", + "status": "Operational", + "bands": "UMTS 2100 / LTE 700 / LTE 1700 / LTE 2600", + "notes": "GSM shut down Nov 2022" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "123", + "brand": "Movistar", + "operator": "Colombia Telecomunicaciones S.A. ESP", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 850 / LTE 1700 / LTE 1900", + "notes": "CDMA shut down" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "124", + "brand": "Movistar", + "operator": "Colombia Telecomunicaciones S.A. ESP", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "130", + "brand": "AVANTEL", + "operator": "Avantel S.A.S", + "status": "Operational", + "bands": "UMTS 1700 / LTE 1700", + "notes": "owned by Novator Partners; iDEN shut down in 2021" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "142", + "brand": null, + "operator": "Une EPM Telecomunicaciones S.A. E.S.P.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "154", + "brand": "Virgin Mobile", + "operator": "Virgin Mobile Colombia S.A.S.", + "status": "Operational", + "bands": "MVNO", + "notes": "Uses Movistar" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "165", + "brand": null, + "operator": "Colombia Móvil S.A. ESP", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "176", + "brand": null, + "operator": "DirecTV Colombia Ltda", + "status": "Operational", + "bands": "LTE 2600 / TD-5G 2600", + "notes": "Fixed wireless; acquired by Movistar" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "187", + "brand": "eTb", + "operator": "Empresa de Telecomunicaciones de Bogotá S.A. ESP", + "status": "Operational", + "bands": "LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "199", + "brand": null, + "operator": "SUMA Movil SAS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "208", + "brand": null, + "operator": "UFF Movil SAS", + "status": "Not operational", + "bands": "LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "210", + "brand": null, + "operator": "Hablame Colombia SAS ESP", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "220", + "brand": null, + "operator": "Libre Tecnologias SAS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "230", + "brand": null, + "operator": "Setroc Mobile Group SAS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "240", + "brand": null, + "operator": "Logistica Flash Colombia SAS", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "250", + "brand": null, + "operator": "Plintron Colombia SAS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "360", + "brand": "WOM", + "operator": "Partners Telecom Colombia SAS", + "status": "Operational", + "bands": "LTE 700 / LTE 2600", + "notes": "owned by Novator Partners" + }, + { + "type": "National", + "countryName": "Colombia", + "countryCode": "CO", + "mcc": "732", + "mnc": "666", + "brand": "Claro", + "operator": "Comunicacion Celular S.A. (Comcel)", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Costa Rica", + "countryCode": "CR", + "mcc": "712", + "mnc": "01", + "brand": "Kölbi ICE", + "operator": "Instituto Costarricense de Electricidad", + "status": "Operational", + "bands": "GSM 1800 / UMTS 850 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Costa Rica", + "countryCode": "CR", + "mcc": "712", + "mnc": "02", + "brand": "Kölbi ICE", + "operator": "Instituto Costarricense de Electricidad", + "status": "Operational", + "bands": "GSM 1800 / UMTS 850 / LTE 1800 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Costa Rica", + "countryCode": "CR", + "mcc": "712", + "mnc": "03", + "brand": "Claro", + "operator": "Claro CR Telecomunicaciones (Aló)", + "status": "Operational", + "bands": "GSM 1800 / UMTS 2100 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Costa Rica", + "countryCode": "CR", + "mcc": "712", + "mnc": "04", + "brand": "Liberty", + "operator": "Liberty Latin America", + "status": "Operational", + "bands": "GSM 1800 / UMTS 850 / UMTS 2100 / LTE 1800", + "notes": "Former Telefónica Móviles Costa Rica" + }, + { + "type": "National", + "countryName": "Costa Rica", + "countryCode": "CR", + "mcc": "712", + "mnc": "20", + "brand": "fullmóvil", + "operator": "Virtualis S.A.", + "status": "Not operational", + "bands": "MVNO", + "notes": "Closed on 6 February 2019" + }, + { + "type": "National", + "countryName": "Ecuador", + "countryCode": "EC", + "mcc": "740", + "mnc": "00", + "brand": "Movistar", + "operator": "Otecel S.A.", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1900", + "notes": "Former BellSouth" + }, + { + "type": "National", + "countryName": "Ecuador", + "countryCode": "EC", + "mcc": "740", + "mnc": "01", + "brand": "Claro", + "operator": "CONECEL S.A.", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 1700", + "notes": "Former Porta" + }, + { + "type": "National", + "countryName": "Ecuador", + "countryCode": "EC", + "mcc": "740", + "mnc": "02", + "brand": "CNT Mobile", + "operator": "Corporación Nacional de Telecomunicaciones (CNT EP)", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 1700", + "notes": "Former Alegro / Telecsa; CDMA 1900 shut down in 2014" + }, + { + "type": "National", + "countryName": "Ecuador", + "countryCode": "EC", + "mcc": "740", + "mnc": "03", + "brand": "Tuenti", + "operator": "Otecel S.A.", + "status": "Operational", + "bands": "MVNO", + "notes": "Runs on Movistar's Network" + }, + { + "type": "National", + "countryName": "El Salvador", + "countryCode": "SV", + "mcc": "706", + "mnc": "01", + "brand": "Claro", + "operator": "CTE Telecom Personal, S.A. de C.V.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900", + "notes": "owned by América Móvil" + }, + { + "type": "National", + "countryName": "El Salvador", + "countryCode": "SV", + "mcc": "706", + "mnc": "02", + "brand": "Digicel", + "operator": "Digicel, S.A. de C.V.", + "status": "Operational", + "bands": "GSM 900 / UMTS 900", + "notes": null + }, + { + "type": "National", + "countryName": "El Salvador", + "countryCode": "SV", + "mcc": "706", + "mnc": "03", + "brand": "Tigo", + "operator": "Telemovil El Salvador S.A.", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / LTE 850 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "El Salvador", + "countryCode": "SV", + "mcc": "706", + "mnc": "04", + "brand": "Movistar", + "operator": "Telefónica Móviles El Salvador", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1900", + "notes": null + }, + { + "type": "National", + "countryName": "El Salvador", + "countryCode": "SV", + "mcc": "706", + "mnc": "05", + "brand": "RED", + "operator": "INTELFON, S.A. de C.V.", + "status": "Operational", + "bands": "iDEN", + "notes": null + }, + { + "type": "National", + "countryName": "Falkland Islands (United Kingdom)", + "countryCode": "FK", + "mcc": "750", + "mnc": "001", + "brand": "Sure", + "operator": "Sure South Atlantic Ltd.", + "status": "Operational", + "bands": "GSM 900 / LTE 1800 / WiMAX 2400 / WiMAX 3500", + "notes": "formerly Cable & Wireless Communications Touch" + }, + { + "type": "National", + "countryName": "French Guiana (France)", + "countryCode": "GF", + "mcc": "340", + "mnc": "01", + "brand": "Orange", + "operator": "Orange Caraïbe Mobiles", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": "French Antilles MCC" + }, + { + "type": "National", + "countryName": "French Guiana (France)", + "countryCode": "GF", + "mcc": "340", + "mnc": "02", + "brand": "SFR Caraïbe", + "operator": "Outremer Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 800 / LTE 1800 / LTE 2600", + "notes": "French Antilles MCC; former Only" + }, + { + "type": "National", + "countryName": "French Guiana (France)", + "countryCode": "GF", + "mcc": "340", + "mnc": "11", + "brand": null, + "operator": "Guyane Téléphone Mobile", + "status": "Not operational", + "bands": "Unknown", + "notes": "French Antilles MCC; MNC withdrawn" + }, + { + "type": "National", + "countryName": "French Guiana (France)", + "countryCode": "GF", + "mcc": "340", + "mnc": "20", + "brand": "Digicel", + "operator": "DIGICEL Antilles Française Guyane", + "status": "Operational", + "bands": "GSM 900 / UMTS 2100 / LTE 800", + "notes": "French Antilles MCC; former Bouygues Telecom Caraïbes" + }, + { + "type": "National", + "countryName": "French Guiana (France)", + "countryCode": "GF", + "mcc": "742", + "mnc": "04", + "brand": "Free", + "operator": "Free Caraïbe", + "status": "Unknown", + "bands": "UMTS 900 / UMTS 2100 / LTE 1800 / LTE 2100 / LTE 2600", + "notes": null + }, + { + "type": "National", + "countryName": "Guatemala", + "countryCode": "GT", + "mcc": "704", + "mnc": "01", + "brand": "Claro", + "operator": "Telecomunicaciones de Guatemala, S.A.", + "status": "Operational", + "bands": "CDMA 1900 / GSM 900 / UMTS 1900 / LTE 1900 / 5G 3500", + "notes": "former Servicios de Comunicaciones Personales Inalambricas (SERCOM)" + }, + { + "type": "National", + "countryName": "Guatemala", + "countryCode": "GT", + "mcc": "704", + "mnc": "02", + "brand": "Tigo", + "operator": "Millicom / Local partners", + "status": "Operational", + "bands": "TDMA 800 / GSM 850 / UMTS 850 / LTE 850 / 5G 3500", + "notes": "former COMCEL" + }, + { + "type": "National", + "countryName": "Guatemala", + "countryCode": "GT", + "mcc": "704", + "mnc": "03", + "brand": "Claro", + "operator": "Telecomunicaciones de Guatemala, S.A.", + "status": "Operational", + "bands": "CDMA 1900 / GSM 1900 / UMTS 1900 / LTE 1900", + "notes": "former Movistar" + }, + { + "type": "National", + "countryName": "Guatemala", + "countryCode": "GT", + "mcc": "704", + "mnc": "?", + "brand": "digicel", + "operator": "Digicel Group", + "status": "Reserved", + "bands": "GSM 900", + "notes": null + }, + { + "type": "National", + "countryName": "Guatemala", + "countryCode": "GT", + "mcc": "704", + "mnc": "?", + "brand": "RED/INTELFON", + "operator": "INTELFON Guatemala", + "status": "Operational", + "bands": "iDEN 800", + "notes": "INTELFON GUATEMALA owned by INTELFON El Salvador" + }, + { + "type": "National", + "countryName": "Guyana", + "countryCode": "GY", + "mcc": "738", + "mnc": "00", + "brand": "E-Networks", + "operator": "E-Networks Inc.", + "status": "Operational", + "bands": "WiMAX / LTE 700 / 5G", + "notes": "Fixed wireless" + }, + { + "type": "National", + "countryName": "Guyana", + "countryCode": "GY", + "mcc": "738", + "mnc": "01", + "brand": "Digicel", + "operator": "U-Mobile (Cellular) Inc.", + "status": "Operational", + "bands": "GSM 900 / UMTS 850 / LTE 700", + "notes": null + }, + { + "type": "National", + "countryName": "Guyana", + "countryCode": "GY", + "mcc": "738", + "mnc": "002", + "brand": "GT&T Cellink Plus", + "operator": "Guyana Telephone & Telegraph Co.", + "status": "Operational", + "bands": "GSM 900 / UMTS 850 / LTE 700", + "notes": "LTE band 28" + }, + { + "type": "National", + "countryName": "Guyana", + "countryCode": "GY", + "mcc": "738", + "mnc": "003", + "brand": null, + "operator": "Quark Communications Inc.", + "status": "Operational", + "bands": "TD-LTE", + "notes": null + }, + { + "type": "National", + "countryName": "Guyana", + "countryCode": "GY", + "mcc": "738", + "mnc": "040", + "brand": "E-Networks", + "operator": "E-Networks Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Guyana", + "countryCode": "GY", + "mcc": "738", + "mnc": "05", + "brand": null, + "operator": "eGovernment Unit, Ministry of the Presidency", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Honduras", + "countryCode": "HN", + "mcc": "708", + "mnc": "001", + "brand": "Claro", + "operator": "Servicios de Comunicaciones de Honduras S.A. de C.V.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Honduras", + "countryCode": "HN", + "mcc": "708", + "mnc": "002", + "brand": "Tigo", + "operator": "Celtel", + "status": "Operational", + "bands": "CDMA 850 / GSM 850 / UMTS 850 / LTE 1700", + "notes": "also uses or has used MNC 02" + }, + { + "type": "National", + "countryName": "Honduras", + "countryCode": "HN", + "mcc": "708", + "mnc": "030", + "brand": "Hondutel", + "operator": "Empresa Hondureña de Telecomunicaciones", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Honduras", + "countryCode": "HN", + "mcc": "708", + "mnc": "040", + "brand": "Digicel", + "operator": "Digicel de Honduras", + "status": "Not operational", + "bands": "GSM 1900", + "notes": "Sold to Claro in 2011" + }, + { + "type": "National", + "countryName": "Nicaragua", + "countryCode": "NI", + "mcc": "710", + "mnc": "21", + "brand": "Claro", + "operator": "Empresa Nicaragüense de Telecomunicaciones, S.A. (ENITEL) (América Móvil)", + "status": "Operational", + "bands": "GSM 1900 / UMTS 850 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Nicaragua", + "countryCode": "NI", + "mcc": "710", + "mnc": "300", + "brand": "Tigo", + "operator": "Telefonía Celular de Nicaragua, S.A.", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1900", + "notes": "Former Movistar; CDMA 800, TDMA 800, and NAMPS 800 have been shut down" + }, + { + "type": "National", + "countryName": "Nicaragua", + "countryCode": "NI", + "mcc": "710", + "mnc": "73", + "brand": "Claro", + "operator": "Servicios de Comunicaciones S.A.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 850", + "notes": "Former SERCOM (Merged with ENITEL in 2004 and became Claro in 2009)" + }, + { + "type": "National", + "countryName": "Panama", + "countryCode": "PA", + "mcc": "714", + "mnc": "01", + "brand": "Cable & Wireless", + "operator": "Cable & Wireless Panama S.A.", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / LTE 700 / LTE 1900", + "notes": "LTE band 28 / 2" + }, + { + "type": "National", + "countryName": "Panama", + "countryCode": "PA", + "mcc": "714", + "mnc": "02", + "brand": "Tigo", + "operator": "Grupo de Comunicaciones Digitales, S.A.", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700 / LTE 1900", + "notes": "Former Movistar, Bell South Corp. (BSC); CDMA 800, TDMA 800 and NAMPS 800 are closed." + }, + { + "type": "National", + "countryName": "Panama", + "countryCode": "PA", + "mcc": "714", + "mnc": "020", + "brand": "Tigo", + "operator": "Grupo de Comunicaciones Digitales, S.A.", + "status": "Operational", + "bands": "GSM 850 / LTE 700", + "notes": "Former Movistar" + }, + { + "type": "National", + "countryName": "Panama", + "countryCode": "PA", + "mcc": "714", + "mnc": "03", + "brand": "Claro", + "operator": "América Móvil", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 700 / LTE 1900", + "notes": "Being acquired by C&W; LTE bands 28 / 2" + }, + { + "type": "National", + "countryName": "Panama", + "countryCode": "PA", + "mcc": "714", + "mnc": "04", + "brand": "Digicel", + "operator": "Digicel Group", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 700 / LTE 1900", + "notes": "LTE bands 28 / 2" + }, + { + "type": "National", + "countryName": "Panama", + "countryCode": "PA", + "mcc": "714", + "mnc": "05", + "brand": "Cable & Wireless", + "operator": "Cable & Wireless Panama S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Paraguay", + "countryCode": "PY", + "mcc": "744", + "mnc": "01", + "brand": "VOX", + "operator": "Hola Paraguay S.A.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 900 / UMTS 1900 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Paraguay", + "countryCode": "PY", + "mcc": "744", + "mnc": "02", + "brand": "Claro", + "operator": "AMX Paraguay S.A.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 1700", + "notes": "Former Hutchison, Port Hable, CTI Móvil" + }, + { + "type": "National", + "countryName": "Paraguay", + "countryCode": "PY", + "mcc": "744", + "mnc": "03", + "brand": null, + "operator": "Compañia Privada de Comunicaciones S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Paraguay", + "countryCode": "PY", + "mcc": "744", + "mnc": "04", + "brand": "Tigo", + "operator": "Telefónica Celular Del Paraguay S.A. (Telecel)", + "status": "Operational", + "bands": "GSM 850 / UMTS 850 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Paraguay", + "countryCode": "PY", + "mcc": "744", + "mnc": "05", + "brand": "Personal", + "operator": "Núcleo S.A. (TIM)", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 1900", + "notes": null + }, + { + "type": "National", + "countryName": "Paraguay", + "countryCode": "PY", + "mcc": "744", + "mnc": "06", + "brand": "Copaco", + "operator": "Copaco S.A.", + "status": "Operational", + "bands": "GSM 1800 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Peru", + "countryCode": "PE", + "mcc": "716", + "mnc": "06", + "brand": "Movistar", + "operator": "Telefónica del Perú S.A.A.", + "status": "Operational", + "bands": "CDMA2000 850 / GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900 / LTE 700 / LTE 1700", + "notes": null + }, + { + "type": "National", + "countryName": "Peru", + "countryCode": "PE", + "mcc": "716", + "mnc": "07", + "brand": "Entel", + "operator": "Entel Perú S.A.", + "status": "Operational", + "bands": "iDEN", + "notes": "Former Nextel" + }, + { + "type": "National", + "countryName": "Peru", + "countryCode": "PE", + "mcc": "716", + "mnc": "10", + "brand": "Claro", + "operator": "América Móvil Perú", + "status": "Operational", + "bands": "GSM 1900 / UMTS 850 / LTE 700 / LTE 1900 / TD-LTE 3500 / 5G 3500 / 5G 39000", + "notes": "Former TIM" + }, + { + "type": "National", + "countryName": "Peru", + "countryCode": "PE", + "mcc": "716", + "mnc": "15", + "brand": "Bitel", + "operator": "Viettel Peru S.A.C.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 900", + "notes": null + }, + { + "type": "National", + "countryName": "Peru", + "countryCode": "PE", + "mcc": "716", + "mnc": "17", + "brand": "Entel", + "operator": "Entel Perú S.A.", + "status": "Operational", + "bands": "UMTS 1900 / LTE 1700 / TD-LTE 2300 / 5G 3500", + "notes": "Former Nextel" + }, + { + "type": "National", + "countryName": "Suriname", + "countryCode": "SR", + "mcc": "746", + "mnc": "02", + "brand": "Telesur", + "operator": "Telecommunications Company Suriname (Telesur)", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100 / LTE 700 / LTE 1800 / 5G 3700", + "notes": "LTE bands 28, 3" + }, + { + "type": "National", + "countryName": "Suriname", + "countryCode": "SR", + "mcc": "746", + "mnc": "03", + "brand": "Digicel", + "operator": "Digicel Group Limited", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 850 / LTE 1800", + "notes": null + }, + { + "type": "National", + "countryName": "Suriname", + "countryCode": "SR", + "mcc": "746", + "mnc": "04", + "brand": "Digicel", + "operator": "Digicel Group Limited", + "status": "Not operational", + "bands": "GSM 900 / UMTS", + "notes": "Former Uniqa (Intelsur N.V. / UTS N.V.); MNC withdrawn" + }, + { + "type": "National", + "countryName": "Suriname", + "countryCode": "SR", + "mcc": "746", + "mnc": "05", + "brand": "Telesur", + "operator": "Telecommunications Company Suriname (Telesur)", + "status": "Unknown", + "bands": "CDMA 450", + "notes": null + }, + { + "type": "National", + "countryName": "Uruguay", + "countryCode": "UY", + "mcc": "748", + "mnc": "00", + "brand": "Antel", + "operator": "Administración Nacional de Telecomunicaciones", + "status": "Not operational", + "bands": "TDMA", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Uruguay", + "countryCode": "UY", + "mcc": "748", + "mnc": "01", + "brand": "Antel", + "operator": "Administración Nacional de Telecomunicaciones", + "status": "Operational", + "bands": "GSM 1800 / UMTS 850 / UMTS 2100 / LTE 700 / LTE 1700 / 5G 28000", + "notes": "Former brand Ancel; LTE bands 28 / 4" + }, + { + "type": "National", + "countryName": "Uruguay", + "countryCode": "UY", + "mcc": "748", + "mnc": "03", + "brand": "Antel", + "operator": "Administración Nacional de Telecomunicaciones", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "National", + "countryName": "Uruguay", + "countryCode": "UY", + "mcc": "748", + "mnc": "07", + "brand": "Movistar", + "operator": "Telefónica Móviles Uruguay", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 850 / LTE 1900", + "notes": "Former Movicom" + }, + { + "type": "National", + "countryName": "Uruguay", + "countryCode": "UY", + "mcc": "748", + "mnc": "10", + "brand": "Claro", + "operator": "AM Wireless Uruguay S.A.", + "status": "Operational", + "bands": "GSM 1900 / UMTS 1900 / LTE 1700", + "notes": "Former CTI Móvil" + }, + { + "type": "National", + "countryName": "Uruguay", + "countryCode": "UY", + "mcc": "748", + "mnc": "15", + "brand": null, + "operator": "ENALUR S.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "National", + "countryName": "Venezuela", + "countryCode": "VE", + "mcc": "734", + "mnc": "01", + "brand": "Digitel", + "operator": "Corporacion Digitel C.A.", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Formerly INFONET" + }, + { + "type": "National", + "countryName": "Venezuela", + "countryCode": "VE", + "mcc": "734", + "mnc": "02", + "brand": "Digitel GSM", + "operator": "Corporacion Digitel C.A.", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 900 / LTE 1800", + "notes": "DIGITEL-DIGICEL-INFONET Merger" + }, + { + "type": "National", + "countryName": "Venezuela", + "countryCode": "VE", + "mcc": "734", + "mnc": "03", + "brand": "DirecTV", + "operator": "Galaxy Entertainment de Venezuela C.A.", + "status": "Unknown", + "bands": "LTE 2600", + "notes": "Formerly DIGICEL" + }, + { + "type": "National", + "countryName": "Venezuela", + "countryCode": "VE", + "mcc": "734", + "mnc": "04", + "brand": "Movistar", + "operator": "Telefónica Móviles Venezuela", + "status": "Operational", + "bands": "GSM 850 / GSM 1900 / UMTS 1900 / LTE 1700", + "notes": "CDMA 850 shut down March 2014" + }, + { + "type": "National", + "countryName": "Venezuela", + "countryCode": "VE", + "mcc": "734", + "mnc": "06", + "brand": "Movilnet", + "operator": "Telecomunicaciones Movilnet", + "status": "Operational", + "bands": "GSM 850 / UMTS 1900 / LTE 1700", + "notes": "CDMA 850 shut down Oct 2020" + }, + { + "type": "Test", + "countryName": null, + "countryCode": null, + "mcc": "001", + "mnc": "01", + "brand": "TEST", + "operator": "Test network", + "status": "Operational", + "bands": "any", + "notes": null + }, + { + "type": "Test", + "countryName": null, + "countryCode": null, + "mcc": "001", + "mnc": "001", + "brand": "TEST", + "operator": "Test network", + "status": "Operational", + "bands": "any", + "notes": null + }, + { + "type": "Test", + "countryName": null, + "countryCode": null, + "mcc": "999", + "mnc": "99", + "brand": null, + "operator": "Internal use", + "status": "Operational", + "bands": "any", + "notes": "Internal use in private networks, no roaming" + }, + { + "type": "Test", + "countryName": null, + "countryCode": null, + "mcc": "999", + "mnc": "999", + "brand": null, + "operator": "Internal use", + "status": "Operational", + "bands": "any", + "notes": "Internal use in private networks, no roaming" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "01", + "brand": "ICO", + "operator": "ICO Satellite Management", + "status": "Not operational", + "bands": "Satellite", + "notes": "MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "02", + "brand": null, + "operator": "Unassigned", + "status": "Returned spare", + "bands": "Unknown", + "notes": "Formerly: Sense Communications International" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "03", + "brand": "Iridium", + "operator": null, + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "04", + "brand": null, + "operator": "Unassigned", + "status": "Returned spare", + "bands": "Satellite", + "notes": "Formerly: Globalstar" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "05", + "brand": null, + "operator": "Thuraya RMSS Network", + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "06", + "brand": null, + "operator": "Thuraya Satellite Telecommunications Company", + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "07", + "brand": null, + "operator": "Unassigned", + "status": "Returned spare", + "bands": "Unknown", + "notes": "Formerly: Ellipso" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "08", + "brand": null, + "operator": "Unassigned", + "status": "Returned spare", + "bands": "Unknown", + "notes": "Formerly: GSM, reserved for station identification where the mobile does not have a subscription IMSI" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "09", + "brand": null, + "operator": "Unassigned", + "status": "Returned spare", + "bands": "Unknown", + "notes": "Formerly: Tele1 Europe" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "10", + "brand": "ACeS", + "operator": null, + "status": "Not operational", + "bands": "Satellite", + "notes": "MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "11", + "brand": "Inmarsat", + "operator": null, + "status": "Operational", + "bands": "Satellite", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "12", + "brand": "Telenor", + "operator": "Telenor Maritime AS", + "status": "Operational", + "bands": "GSM 1800 / LTE 800", + "notes": "Maritime; formerly Maritime Communications Partner (MCP)" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "13", + "brand": "GSM.AQ", + "operator": "BebbiCell AG", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Antarctica +88234 Network; formerly Global Networks Switzerland Inc.; MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "14", + "brand": "AeroMobile", + "operator": "AeroMobile AS", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Air" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "15", + "brand": "OnAir", + "operator": "OnAir Switzerland Sarl", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Air" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "16", + "brand": "Cisco Jasper", + "operator": "Cisco Systems, Inc.", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "17", + "brand": "Navitas", + "operator": "JT Group Limited", + "status": "Not operational", + "bands": "GSM 1800", + "notes": "Maritime; shut down in 2009" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "18", + "brand": "Cellular at Sea", + "operator": "AT&T Mobility", + "status": "Operational", + "bands": "GSM 900 / GSM 1900 / CDMA2000 1900 / UMTS 1900 / LTE 700", + "notes": "Maritime" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "19", + "brand": "Epic Maritime", + "operator": "Monaco Telecom", + "status": "Operational", + "bands": "GSM 900 / GSM 1800 / UMTS 2100", + "notes": "Maritime" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "20", + "brand": null, + "operator": "Intermatica", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "21", + "brand": null, + "operator": "Wins Limited", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Maritime; formerly Seanet Maritime Communications" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "22", + "brand": null, + "operator": "MediaLincc Ltd", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "23", + "brand": null, + "operator": "Unassigned", + "status": "Returned spare", + "bands": "Unknown", + "notes": "Formerly: Beeline" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "24", + "brand": "iNum", + "operator": "Voxbone", + "status": "Unknown", + "bands": "Unknown", + "notes": "+883 iNum" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "25", + "brand": null, + "operator": "Unassigned", + "status": "Returned spare", + "bands": "Unknown", + "notes": "Formerly: In & phone" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "26", + "brand": "TIM@sea", + "operator": "Telecom Italia Mobile", + "status": "Operational", + "bands": "GSM 1800 / GSM 1900", + "notes": "Maritime" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "27", + "brand": "OnMarine", + "operator": "Monaco Telecom", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Maritime" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "28", + "brand": "Vodafone", + "operator": "GDSP (Vodafone's Global Data Service Platform)", + "status": "Operational", + "bands": "Roaming SIM", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "29", + "brand": "Telenor", + "operator": null, + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "30", + "brand": null, + "operator": "Unassigned", + "status": "Returned spare", + "bands": "Unknown", + "notes": "Formerly: Terrestar Networks" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "31", + "brand": "Orange", + "operator": "Orange S.A.", + "status": "Operational", + "bands": "GSM 900", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "32", + "brand": "Sky High", + "operator": "MegaFon", + "status": "Not operational", + "bands": "GSM 900", + "notes": "Air (Aeroflot); MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "33", + "brand": null, + "operator": "Smart Communications", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "34", + "brand": null, + "operator": "tyntec GmbH", + "status": "Unknown", + "bands": "MVNO", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "35", + "brand": null, + "operator": "Globecomm Network Services", + "status": "Operational", + "bands": "GSM 850", + "notes": "Maritime" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "36", + "brand": null, + "operator": "Azerfon", + "status": "Operational", + "bands": "GSM 1800", + "notes": "Air" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "37", + "brand": null, + "operator": "Transatel", + "status": "Operational", + "bands": "MVNO", + "notes": "Global SIM for Data Mobile Broadband and M2M" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "38", + "brand": null, + "operator": "Multiregional TransitTelecom (MTT)", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "39", + "brand": null, + "operator": "MTX Connect Ltd", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "40", + "brand": "1NCE", + "operator": "Deutsche Telekom AG", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "41", + "brand": null, + "operator": "One Network B.V.", + "status": "Operational", + "bands": "MVNO", + "notes": "Former BodyTrace Netherlands B.V." + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "42", + "brand": null, + "operator": "IMC Island Ehf", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former DCN Hub ehf; MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "43", + "brand": null, + "operator": "EMnify GmbH", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "44", + "brand": null, + "operator": "AT&T Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "45", + "brand": null, + "operator": "Advanced Wireless Network Company Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": "subsidiary of Advanced Info Service" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "46", + "brand": null, + "operator": "Telecom26 AG", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "47", + "brand": null, + "operator": "Ooredoo", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "48", + "brand": "Com4", + "operator": "Communication for Devices in Sweden AB", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "49", + "brand": "Zain", + "operator": "Mobile Telecommunications Company K.S.C.P.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "50", + "brand": null, + "operator": "EchoStar Mobile", + "status": "Unknown", + "bands": "Satellite", + "notes": "Also listed as Sawatch Limited" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "51", + "brand": null, + "operator": "VisionNG", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "52", + "brand": null, + "operator": "Manx Telecom Trading Ltd.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "53", + "brand": "European Aviation Network", + "operator": "Inmarsat Ltd.", + "status": "Operational", + "bands": "LTE 2100", + "notes": "Former Deutsche Telekom; LTE band 65; ground-based network for aircraft" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "54", + "brand": null, + "operator": "Teleena Holding B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "55", + "brand": null, + "operator": "Beezz Communication Solutions Ltd.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "56", + "brand": "ETSI", + "operator": "European Telecommunications Standards Institute", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "57", + "brand": null, + "operator": "SAP", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "58", + "brand": "BICS", + "operator": "Belgacom ICS SA", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "59", + "brand": null, + "operator": "MessageBird B.V.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "60", + "brand": null, + "operator": "OneWeb", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "61", + "brand": null, + "operator": "MTN Management Services", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "62", + "brand": null, + "operator": "Twilio Inc.", + "status": "Operational", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "63", + "brand": null, + "operator": "GloTel B.V.", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "64", + "brand": null, + "operator": "Syniverse Technologies, LLC", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "65", + "brand": null, + "operator": "Plintron Global Technology Solutions Pty Ltd", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "66", + "brand": null, + "operator": "Limitless Mobile LLC", + "status": "Operational", + "bands": "LTE", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "67", + "brand": null, + "operator": "1NCE GmbH", + "status": "Operational", + "bands": "MVNO", + "notes": "IoT solutions" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "68", + "brand": null, + "operator": "Maersk Line A/S", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "69", + "brand": null, + "operator": "Legos", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "70", + "brand": null, + "operator": "Clementvale Baltic OÜ", + "status": "Not operational", + "bands": "MVNO", + "notes": "MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "71", + "brand": null, + "operator": "Tampnet AS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "72", + "brand": null, + "operator": "Tele2 Sverige Aktiebolag", + "status": "Unknown", + "bands": "Unknown", + "notes": "Former Tele2 IoT" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "73", + "brand": null, + "operator": "Cubic Telecom Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "74", + "brand": null, + "operator": "Etisalat", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "75", + "brand": null, + "operator": "Podsystem Ltd.", + "status": "Operational", + "bands": "MVNO", + "notes": "IoT solutions" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "76", + "brand": null, + "operator": "A1 Telekom Austria AG", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "77", + "brand": null, + "operator": "Bouygues Telecom", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "78", + "brand": null, + "operator": "Telecom Italia Sparkle S.p.A.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "79", + "brand": null, + "operator": "Nokia Corporation", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "80", + "brand": null, + "operator": "Flo Live Limited", + "status": "Unknown", + "bands": "MVNO", + "notes": "IoT solutions" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "81", + "brand": null, + "operator": "Airnity SAS", + "status": "Unknown", + "bands": "MVNO", + "notes": "IoT solutions" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "82", + "brand": null, + "operator": "Eseye Limited", + "status": "Unknown", + "bands": "MVNO", + "notes": "IoT solutions" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "83", + "brand": null, + "operator": "iBasis Netherlands BV", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "84", + "brand": null, + "operator": "Telefónica Móviles España, S.A. Unipersonal", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "85", + "brand": null, + "operator": "Telefónica Germany GmbH & Co. OHG", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "86", + "brand": null, + "operator": "BJT Partners SAS", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "87", + "brand": null, + "operator": "Cisco Systems, Inc.", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "88", + "brand": null, + "operator": "UN Office for the Coordination of Humanitarian Affairs (OCHA)", + "status": "Not operational", + "bands": "Unknown", + "notes": "MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "89", + "brand": null, + "operator": "DIDWW Ireland Limited", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "90", + "brand": null, + "operator": "Truphone Limited", + "status": "Operational", + "bands": "MVNO", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "91", + "brand": null, + "operator": "World Mobile Group Limited", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "92", + "brand": null, + "operator": "Phonegroup SA", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "93", + "brand": null, + "operator": "SkyFive AG", + "status": "Unknown", + "bands": "Unknown", + "notes": "split off from Nokia; ground-based networks for aircraft" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "94", + "brand": null, + "operator": "Intelsat US LLC", + "status": "Unknown", + "bands": "Satellite", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "95", + "brand": null, + "operator": "HMD Global Oy", + "status": "Unknown", + "bands": "Unknown", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "96", + "brand": null, + "operator": "KORE Wireless", + "status": "Unknown", + "bands": "Unknown", + "notes": "IoT solutions" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "901", + "mnc": "97", + "brand": null, + "operator": "Satelio IoT Services S.L.", + "status": "Unknown", + "bands": "Satellite", + "notes": "IoT solutions" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "902", + "mnc": "01", + "brand": null, + "operator": "MulteFire Alliance", + "status": "Operational", + "bands": "LTE", + "notes": null + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "991", + "mnc": "01", + "brand": null, + "operator": "World's Global Telecom", + "status": "Not operational", + "bands": "Unknown", + "notes": "temporarily assigned until 15 January 2021" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "991", + "mnc": "02", + "brand": "5G Croco", + "operator": "Orange S.A.", + "status": "Not operational", + "bands": "5G", + "notes": "temporarily assigned until 6 August 2022" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "991", + "mnc": "03", + "brand": null, + "operator": "Halys SAS", + "status": "Not operational", + "bands": "Unknown", + "notes": "temporary assignment for trial until 5 April 2022; MNC withdrawn" + }, + { + "type": "International", + "countryName": null, + "countryCode": null, + "mcc": "995", + "mnc": "01", + "brand": "FonePlus", + "operator": "Sure (Diego Garcia) Ltd", + "status": "Operational", + "bands": "GSM 900", + "notes": "There appears to be no officially assigned MCC" + } +] \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/check_status.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/check_status.sh new file mode 100644 index 0000000..409b011 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/check_status.sh @@ -0,0 +1,95 @@ +#!/bin/sh +# Location: /www/cgi-bin/quecmanager/profiles/check_status.cgi + +# Set content type to JSON +echo "Content-type: application/json" +echo "" + +# Configuration +STATUS_FILE="/tmp/quecprofiles_status.json" +TRACK_FILE="/tmp/quecprofiles_active" + +# Function to log messages +log_message() { + local level="${2:-info}" + logger -t quecprofiles -p "daemon.$level" "status_check: $1" +} + +# Function to output default "idle" JSON +output_idle_json() { + cat <>/tmp/list_profiles_error.log +} + +# Function to output JSON error response +output_error() { + local message="$1" + echo "{\"status\":\"error\",\"message\":\"$message\",\"profiles\":[]}" + log_message "$message" "error" + exit 1 +} + +# Function to sanitize string for JSON +sanitize_for_json() { + echo "$1" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g' | sed 's/\t/\\t/g' | tr -d '\r\n' +} + +# Check if UCI command exists +if ! which uci >/dev/null 2>&1; then + output_error "UCI command not found" +fi + +# Function to extract profiles from UCI config +get_profiles() { + log_message "Fetching profiles from UCI config" + + # Check if UCI config exists + if [ ! -f /etc/config/quecprofiles ]; then + log_message "No profiles config found" "warn" + echo "{\"status\":\"success\",\"profiles\":[]}" + return 0 + fi + + # Start JSON output + local json_output="" + local first=1 + local count=0 + + # Get all profile indices - make sure this succeeds + local indices=$(uci -q show quecprofiles | grep -o '@profile\[[0-9]*\]' | sort -u) + + # Debug output + echo "Found indices: $indices" >>/tmp/list_profiles_error.log + + if [ -z "$indices" ]; then + log_message "No profile indices found" "warn" + echo "{\"status\":\"success\",\"profiles\":[]}" + return 0 + fi + + # Process each profile + for idx in $indices; do + log_message "Processing profile index: $idx" + + # Try different UCI get approaches + local name + name=$(uci -q get "quecprofiles.$idx.name" 2>/dev/null) + if [ -z "$name" ]; then + log_message "Failed to get name for $idx, trying alternative method" "warn" + local section=${idx#@profile[} + section=${section%]} + name=$(uci -q get "quecprofiles.@profile[$section].name" 2>/dev/null) + fi + + # Get profile details + local iccid=$(uci -q get "quecprofiles.$idx.iccid" 2>/dev/null) + local imei=$(uci -q get "quecprofiles.$idx.imei" 2>/dev/null) + local apn=$(uci -q get "quecprofiles.$idx.apn" 2>/dev/null) + local pdp_type=$(uci -q get "quecprofiles.$idx.pdp_type" 2>/dev/null) + local lte_bands=$(uci -q get "quecprofiles.$idx.lte_bands" 2>/dev/null) + local sa_nr5g_bands=$(uci -q get "quecprofiles.$idx.sa_nr5g_bands" 2>/dev/null) + local nsa_nr5g_bands=$(uci -q get "quecprofiles.$idx.nsa_nr5g_bands" 2>/dev/null) + local network_type=$(uci -q get "quecprofiles.$idx.network_type" 2>/dev/null) + local ttl=$(uci -q get "quecprofiles.$idx.ttl" 2>/dev/null) + + # Debug output + log_message "Retrieved for $idx: name=$name, iccid=$iccid, apn=$apn" + + # Skip if missing required fields + if [ -z "$name" ] || [ -z "$iccid" ] || [ -z "$apn" ]; then + log_message "Skipping invalid profile: $idx (missing required fields)" "warn" + continue + fi + + # Sanitize all values to ensure valid JSON + name=$(sanitize_for_json "$name") + iccid=$(sanitize_for_json "$iccid") + imei=$(sanitize_for_json "${imei:-""}") + apn=$(sanitize_for_json "$apn") + pdp_type=$(sanitize_for_json "${pdp_type:-"IPV4V6"}") + lte_bands=$(sanitize_for_json "${lte_bands:-""}") + sa_nr5g_bands=$(sanitize_for_json "${sa_nr5g_bands:-""}") + nsa_nr5g_bands=$(sanitize_for_json "${nsa_nr5g_bands:-""}") + network_type=$(sanitize_for_json "${network_type:-"LTE"}") + ttl=$(sanitize_for_json "${ttl:-0}") + + # Create profile JSON + local profile_json="{" + profile_json="${profile_json}\"name\":\"${name}\"," + profile_json="${profile_json}\"iccid\":\"${iccid}\"," + profile_json="${profile_json}\"imei\":\"${imei}\"," + profile_json="${profile_json}\"apn\":\"${apn}\"," + profile_json="${profile_json}\"pdp_type\":\"${pdp_type}\"," + profile_json="${profile_json}\"lte_bands\":\"${lte_bands}\"," + profile_json="${profile_json}\"sa_nr5g_bands\":\"${sa_nr5g_bands}\"," + profile_json="${profile_json}\"nsa_nr5g_bands\":\"${nsa_nr5g_bands}\"," + profile_json="${profile_json}\"network_type\":\"${network_type}\"," + profile_json="${profile_json}\"ttl\":\"${ttl}\"" + profile_json="${profile_json}}" + + # Add comma if not first + if [ $first -eq 0 ]; then + json_output="${json_output}," + else + first=0 + fi + + # Add profile to output + json_output="${json_output}${profile_json}" + count=$((count+1)) + done + + # Complete the JSON response + local response="{\"status\":\"success\",\"profiles\":[${json_output}]}" + + # Save the response for debugging + echo "$response" > /tmp/list_profiles_response.json + + echo "$response" + log_message "Found and returned $count profiles" + return 0 +} + +# Start fresh error log +echo "=== List Profiles Run $(date) ===" > /tmp/list_profiles_error.log + +# Main execution +{ + get_profiles +} || { + # Error handler + output_error "Failed to retrieve profiles" +} \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_create.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_create.sh new file mode 100644 index 0000000..ec4aef9 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_create.sh @@ -0,0 +1,355 @@ +#!/bin/sh +# Location: /www/cgi-bin/quecmanager/profiles/quec_profile_create.sh + +# Set content type to JSON +echo -n "" +echo "Content-type: application/json" +echo "" + +# Function to log messages +log_message() { + local level="${2:-info}" + logger -t quecprofiles -p "daemon.$level" "create: $1" +} + +# Function to output JSON response +output_json() { + local status="$1" + local message="$2" + local data="${3:-{}}" + + printf '{"status":"%s","message":"%s","data":%s}\n' "$status" "$message" "$data" + exit 0 +} + +# Function to sanitize input +sanitize() { + echo "$1" | tr -d '\r\n' | sed 's/[^a-zA-Z0-9,.:_-]//g' +} + +# Function to validate ICCID (simple check) +validate_iccid() { + local iccid="$1" + if [ -z "$iccid" ] || [ ${#iccid} -lt 10 ] || [ ${#iccid} -gt 20 ]; then + return 1 + fi + # Check that it's only digits + if ! echo "$iccid" | grep -q '^[0-9]\+$'; then + return 1 + fi + return 0 +} + +# Function to validate IMEI (simple check) +validate_imei() { + local imei="$1" + if [ -z "$imei" ]; then + return 0 # IMEI is optional + fi + if [ ${#imei} -ne 15 ] || ! echo "$imei" | grep -q '^[0-9]\+$'; then + return 1 + fi + return 0 +} + +# Function to validate band list +validate_bands() { + local bands="$1" + if [ -z "$bands" ]; then + return 0 # Empty is valid + fi + # Check format (comma-separated numbers) + if ! echo "$bands" | grep -q '^[0-9]\+\(,[0-9]\+\)*$'; then + return 1 + fi + return 0 +} + +# Function to validate network type +validate_network_type() { + local net_type="$1" + case "$net_type" in + "LTE" | "NR5G" | "LTE:NR5G") + return 0 + ;; + *) + return 1 + ;; + esac +} + +# Function to validate PDP type +validate_pdp_type() { + local pdp_type="$1" + case "$pdp_type" in + "IP" | "IPV6" | "IPV4V6") + return 0 + ;; + *) + return 1 + ;; + esac +} + +# Add function to validate TTL +validate_ttl() { + local ttl="$1" + if [ -z "$ttl" ]; then + return 0 # Empty is valid (will be treated as 0/disabled) + fi + # Check that TTL is a number between 0 and 255 + if ! echo "$ttl" | grep -q '^[0-9]\+$' || [ "$ttl" -gt 255 ]; then + return 1 + fi + return 0 +} + +# Function to check if a profile with the same name or ICCID already exists +check_duplicate_profile() { + local name="$1" + local iccid="$2" + + # Check for duplicate name + local existing_name=$(uci -q show quecprofiles | grep ".name='$name'" | head -n 1) + if [ -n "$existing_name" ]; then + return 1 + fi + + # Check for duplicate ICCID + local existing_iccid=$(uci -q show quecprofiles | grep ".iccid='$iccid'" | head -n 1) + if [ -n "$existing_iccid" ]; then + return 2 + fi + + return 0 +} + +# Function to create new profile +create_profile() { + local name="$1" + local iccid="$2" + local imei="$3" + local apn="$4" + local pdp_type="$5" + local lte_bands="$6" + local sa_nr5g_bands="$7" + local nsa_nr5g_bands="$8" + local network_type="$9" + local ttl="${10}" + + # Generate a unique ID for the profile + local profile_id="profile_$(date +%s)_$(head -c 4 /dev/urandom | hexdump -e '"%x"')" + + # Add to UCI config + uci -q batch </etc/config/quecprofiles </dev/null) + + # Debug log + log_message "Received POST data: $POST_DATA" "debug" + + # Parse JSON with jsonfilter if available + if command -v jsonfilter >/dev/null 2>&1; then + name=$(echo "$POST_DATA" | jsonfilter -e '@.name' 2>/dev/null) + iccid=$(echo "$POST_DATA" | jsonfilter -e '@.iccid' 2>/dev/null) + imei=$(echo "$POST_DATA" | jsonfilter -e '@.imei' 2>/dev/null) + apn=$(echo "$POST_DATA" | jsonfilter -e '@.apn' 2>/dev/null) + pdp_type=$(echo "$POST_DATA" | jsonfilter -e '@.pdp_type' 2>/dev/null) + lte_bands=$(echo "$POST_DATA" | jsonfilter -e '@.lte_bands' 2>/dev/null) + sa_nr5g_bands=$(echo "$POST_DATA" | jsonfilter -e '@.sa_nr5g_bands' 2>/dev/null) + nsa_nr5g_bands=$(echo "$POST_DATA" | jsonfilter -e '@.nsa_nr5g_bands' 2>/dev/null) + network_type=$(echo "$POST_DATA" | jsonfilter -e '@.network_type' 2>/dev/null) + ttl=$(echo "$POST_DATA" | jsonfilter -e '@.ttl' 2>/dev/null) + + log_message "Parsed JSON data for profile: $name" "debug" + else + # If jsonfilter is not available, try basic parsing + # This is less reliable but might work for simple cases + name=$(echo "$POST_DATA" | grep -o '"name":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + iccid=$(echo "$POST_DATA" | grep -o '"iccid":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + imei=$(echo "$POST_DATA" | grep -o '"imei":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + apn=$(echo "$POST_DATA" | grep -o '"apn":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + pdp_type=$(echo "$POST_DATA" | grep -o '"pdp_type":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + lte_bands=$(echo "$POST_DATA" | grep -o '"lte_bands":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + sa_nr5g_bands=$(echo "$POST_DATA" | grep -o '"sa_nr5g_bands":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + nsa_nr5g_bands=$(echo "$POST_DATA" | grep -o '"nsa_nr5g_bands":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + network_type=$(echo "$POST_DATA" | grep -o '"network_type":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + ttl=$(echo "$POST_DATA" | grep -o '"ttl":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + + log_message "Basic parsing for profile: $name" "warn" + fi + else + log_message "No content length specified" "error" + output_json "error" "No data received" + fi +else + # URL parameters for GET requests (less secure, but supported for testing) + name=$(echo "$QUERY_STRING" | grep -o 'name=[^&]*' | cut -d'=' -f2) + iccid=$(echo "$QUERY_STRING" | grep -o 'iccid=[^&]*' | cut -d'=' -f2) + imei=$(echo "$QUERY_STRING" | grep -o 'imei=[^&]*' | cut -d'=' -f2) + apn=$(echo "$QUERY_STRING" | grep -o 'apn=[^&]*' | cut -d'=' -f2) + pdp_type=$(echo "$QUERY_STRING" | grep -o 'pdp_type=[^&]*' | cut -d'=' -f2) + lte_bands=$(echo "$QUERY_STRING" | grep -o 'lte_bands=[^&]*' | cut -d'=' -f2) + sa_nr5g_bands=$(echo "$QUERY_STRING" | grep -o 'sa_nr5g_bands=[^&]*' | cut -d'=' -f2) + nsa_nr5g_bands=$(echo "$QUERY_STRING" | grep -o 'nsa_nr5g_bands=[^&]*' | cut -d'=' -f2) + network_type=$(echo "$QUERY_STRING" | grep -o 'network_type=[^&]*' | cut -d'=' -f2) + ttl=$(echo "$QUERY_STRING" | grep -o 'ttl=[^&]*' | cut -d'=' -f2) + + # URL decode values + name=$(echo "$name" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + iccid=$(echo "$iccid" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + imei=$(echo "$imei" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + apn=$(echo "$apn" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + pdp_type=$(echo "$pdp_type" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + lte_bands=$(echo "$lte_bands" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + sa_nr5g_bands=$(echo "$sa_nr5g_bands" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + nsa_nr5g_bands=$(echo "$nsa_nr5g_bands" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + network_type=$(echo "$network_type" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + ttl=$(echo "$ttl" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + + log_message "Using URL parameters" "warn" +fi + +# Sanitize inputs +name=$(sanitize "${name:-}") +iccid=$(sanitize "${iccid:-}") +imei=$(sanitize "${imei:-}") +apn=$(sanitize "${apn:-}") +pdp_type=$(sanitize "${pdp_type:-IP}") +lte_bands=$(sanitize "${lte_bands:-}") +sa_nr5g_bands=$(sanitize "${sa_nr5g_bands:-}") +nsa_nr5g_bands=$(sanitize "${nsa_nr5g_bands:-}") +network_type=$(sanitize "${network_type:-LTE}") +ttl=$(sanitize "${ttl:-0}") # Default to 0 (disabled) + +# Output debug info +log_message "Creating profile: $name, ICCID: $iccid, IMEI: $imei, APN: $apn" "debug" + +# Validate required inputs +if [ -z "$name" ]; then + log_message "Profile name is missing" "error" + output_json "error" "Profile name is required" +fi + +if [ -z "$iccid" ]; then + log_message "ICCID is missing" "error" + output_json "error" "ICCID is required" +fi + +if [ -z "$apn" ]; then + log_message "APN is missing" "error" + output_json "error" "APN is required" +fi + +# Validate input formats +if ! validate_iccid "$iccid"; then + log_message "Invalid ICCID format: $iccid" "error" + output_json "error" "Invalid ICCID format. It should be 10-20 digits." +fi + +if ! validate_imei "$imei"; then + log_message "Invalid IMEI format: $imei" "error" + output_json "error" "Invalid IMEI format. It should be exactly 15 digits." +fi + +if ! validate_bands "$lte_bands"; then + log_message "Invalid LTE bands format: $lte_bands" "error" + output_json "error" "Invalid LTE bands format. Use comma-separated numbers (e.g., 1,3,7)" +fi + +if ! validate_bands "$sa_nr5g_bands"; then + log_message "Invalid SA NR5G bands format: $sa_nr5g_bands" "error" + output_json "error" "Invalid SA NR5G bands format. Use comma-separated numbers (e.g., 41,78)" +fi + +if ! validate_bands "$nsa_nr5g_bands"; then + log_message "Invalid NSA NR5G bands format: $nsa_nr5g_bands" "error" + output_json "error" "Invalid NSA NR5G bands format. Use comma-separated numbers (e.g., 1,79)" +fi + +if ! validate_network_type "$network_type"; then + log_message "Invalid network type: $network_type" "error" + output_json "error" "Invalid network type. Use 'LTE', 'NR5G', or 'LTE:NR5G'" +fi + +if ! validate_pdp_type "$pdp_type"; then + log_message "Invalid PDP type: $pdp_type" "error" + output_json "error" "Invalid PDP type. Use 'IP', 'IPV6', or 'IPV4V6'" +fi + +if ! validate_ttl "$ttl"; then + log_message "Invalid TTL value: $ttl" "error" + output_json "error" "Invalid TTL value. It should be a number between 0 and 255." +fi + +# Check for duplicates +check_duplicate_profile "$name" "$iccid" +dup_status=$? +if [ $dup_status -eq 1 ]; then + log_message "Duplicate profile name: $name" "error" + output_json "error" "A profile with this name already exists" +elif [ $dup_status -eq 2 ]; then + log_message "Duplicate ICCID: $iccid" "error" + output_json "error" "A profile with this ICCID already exists" +fi + +# Create the profile +if create_profile "$name" "$iccid" "$imei" "$apn" "$pdp_type" "$lte_bands" "$sa_nr5g_bands" "$nsa_nr5g_bands" "$network_type" "$ttl"; then + # Trigger immediate profile application + touch "/tmp/quecprofiles_check" + chmod 644 "/tmp/quecprofiles_check" + log_message "Triggered immediate profile check after creation" "info" + + # Create profile data JSON for return - WITHOUT outer curly braces + profile_data="\"name\":\"$name\",\"iccid\":\"$iccid\",\"imei\":\"$imei\",\"apn\":\"$apn\",\"pdp_type\":\"$pdp_type\",\"lte_bands\":\"$lte_bands\",\"sa_nr5g_bands\":\"$sa_nr5g_bands\",\"nsa_nr5g_bands\":\"$nsa_nr5g_bands\",\"network_type\":\"$network_type\",\"ttl\":\"$ttl\"" + + # Wrap the data field in curly braces inside output_json + output_json "success" "Profile created successfully" "{$profile_data}" +else + output_json "error" "Failed to create profile. Please check system logs." +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_delete.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_delete.sh new file mode 100644 index 0000000..95c6e6c --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_delete.sh @@ -0,0 +1,138 @@ +#!/bin/sh +# Location: /www/cgi-bin/quecmanager/profiles/quec_profile_delete.sh + +# Set content type to JSON +echo -n "" +echo "Content-type: application/json" +echo "" + +# Function to log messages +log_message() { + local level="${2:-info}" + logger -t quecprofiles -p "daemon.$level" "delete: $1" +} + +# Function to output JSON response +output_json() { + local status="$1" + local message="$2" + local data="${3:-{}}" + + printf '{"status":"%s","message":"%s","data":%s}\n' "$status" "$message" "$data" + exit 0 +} + +# Function to sanitize input +sanitize() { + echo "$1" | tr -d '\r\n' | sed 's/[^a-zA-Z0-9,.:_-]//g' +} + +# Function to find profile by ICCID +find_profile_by_iccid() { + local iccid="$1" + # Get all profile indices + local profile_indices=$(uci show quecprofiles | grep -o '@profile\[[0-9]\+\]' | sort -u) + + for profile_index in $profile_indices; do + local current_iccid=$(uci -q get quecprofiles.$profile_index.iccid) + if [ "$current_iccid" = "$iccid" ]; then + echo "$profile_index" + return 0 + fi + done + + return 1 +} + +# Function to delete a profile +delete_profile() { + local profile_index="$1" + local profile_name=$(uci -q get quecprofiles.$profile_index.name) + + # Delete the profile from UCI config + uci -q batch </dev/null) + + # Debug log + log_message "Received POST data: $POST_DATA" "debug" + + # Parse JSON with jsonfilter if available + if command -v jsonfilter >/dev/null 2>&1; then + iccid=$(echo "$POST_DATA" | jsonfilter -e '@.iccid' 2>/dev/null) + else + # If jsonfilter is not available, try basic parsing + iccid=$(echo "$POST_DATA" | grep -o '"iccid":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + fi + else + log_message "No content length specified" "error" + output_json "error" "No data received" + fi +elif [ -n "$QUERY_STRING" ]; then + # URL parameters for GET or DELETE requests + iccid=$(echo "$QUERY_STRING" | grep -o 'iccid=[^&]*' | cut -d'=' -f2) + + # URL decode value + iccid=$(echo "$iccid" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + + log_message "Using URL parameter: iccid=$iccid" "debug" +fi + +# Sanitize input +iccid=$(sanitize "${iccid:-}") + +# Validate ICCID +if [ -z "$iccid" ]; then + log_message "ICCID is missing" "error" + output_json "error" "ICCID is required to identify the profile" +fi + +# Find profile to delete +profile_index=$(find_profile_by_iccid "$iccid") +if [ $? -ne 0 ]; then + log_message "Profile with ICCID $iccid not found" "error" + output_json "error" "Profile not found" +fi + +# Get profile info for response +profile_name=$(uci -q get quecprofiles.$profile_index.name) + +# Delete the profile +if delete_profile "$profile_index"; then + log_message "Profile deleted successfully: $profile_name" "info" + output_json "success" "Profile deleted successfully" "{\"iccid\":\"$iccid\",\"name\":\"$profile_name\"}" +else + log_message "Failed to delete profile: $profile_name" "error" + output_json "error" "Failed to delete profile. Please check system logs." +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_edit.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_edit.sh new file mode 100644 index 0000000..c56b85f --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/profiles/quec_profile_edit.sh @@ -0,0 +1,392 @@ +#!/bin/sh +# Location: /www/cgi-bin/quecmanager/profiles/quec_profile_edit.sh + +# Set content type to JSON +echo -n "" +echo "Content-type: application/json" +echo "" + +# Configuration +CHECK_TRIGGER="/tmp/quecprofiles_check" +APPLIED_FLAG="/tmp/quecprofiles_applied" + +# Function to log messages +log_message() { + local level="${2:-info}" + logger -t quecprofiles -p "daemon.$level" "edit: $1" + echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] edit: $1" >>/tmp/quec_profile_edit.log +} + +# Function to output JSON response +output_json() { + local status="$1" + local message="$2" + local data="${3:-{}}" + + # Debug log to file only + echo "Generating JSON response: status=$status, message=$message" >>/tmp/quec_profile_debug.log + echo "Data payload: $data" >>/tmp/quec_profile_debug.log + + # Use printf for consistent output without newlines or extra characters + printf '{"status":"%s","message":"%s","data":%s}' "$status" "$message" "$data" + + # Add debug marker at end of JSON + echo "" >>/tmp/quec_profile_debug.log + echo "JSON response generated at $(date)" >>/tmp/quec_profile_debug.log + + exit 0 +} + +# Function to sanitize input +sanitize() { + echo "$1" | tr -d '\r\n' | sed 's/[^a-zA-Z0-9,.:_-]//g' +} + +# Function to validate ICCID (simple check) +validate_iccid() { + local iccid="$1" + if [ -z "$iccid" ] || [ ${#iccid} -lt 10 ] || [ ${#iccid} -gt 20 ]; then + return 1 + fi + # Check that it's only digits + if ! echo "$iccid" | grep -q '^[0-9]\+$'; then + return 1 + fi + return 0 +} + +# Function to validate IMEI (simple check) +validate_imei() { + local imei="$1" + if [ -z "$imei" ]; then + return 0 # IMEI is optional + fi + if [ ${#imei} -ne 15 ] || ! echo "$imei" | grep -q '^[0-9]\+$'; then + return 1 + fi + return 0 +} + +# Function to validate band list +validate_bands() { + local bands="$1" + if [ -z "$bands" ]; then + return 0 # Empty is valid + fi + # Check format (comma-separated numbers) + if ! echo "$bands" | grep -q '^[0-9]\+\(,[0-9]\+\)*$'; then + return 1 + fi + return 0 +} + +# Function to validate network type +validate_network_type() { + local net_type="$1" + case "$net_type" in + "LTE" | "NR5G" | "LTE:NR5G") + return 0 + ;; + *) + return 1 + ;; + esac +} + +# Function to validate PDP type +validate_pdp_type() { + local pdp_type="$1" + case "$pdp_type" in + "IP" | "IPV6" | "IPV4V6") + return 0 + ;; + *) + return 1 + ;; + esac +} + +validate_ttl() { + local ttl="$1" + if [ -z "$ttl" ]; then + return 0 # Empty is valid (will be treated as 0/disabled) + fi + # Check that TTL is a number between 0 and 255 + if ! echo "$ttl" | grep -q '^[0-9]\+$' || [ "$ttl" -gt 255 ]; then + return 1 + fi + return 0 +} + +# Function to check if a profile with given ICCID exists +find_profile_by_iccid() { + local iccid="$1" + # Get all profile indices + local profile_indices=$(uci show quecprofiles | grep -o '@profile\[[0-9]\+\]' | sort -u) + + for profile_index in $profile_indices; do + local current_iccid=$(uci -q get quecprofiles.$profile_index.iccid) + if [ "$current_iccid" = "$iccid" ]; then + echo "$profile_index" + return 0 + fi + done + + return 1 +} + +# Function to check for duplicate name (excluding current profile) +check_duplicate_name() { + local name="$1" + local current_iccid="$2" + + local profile_indices=$(uci show quecprofiles | grep -o '@profile\[[0-9]\+\]' | sort -u) + + for profile_index in $profile_indices; do + local iccid=$(uci -q get quecprofiles.$profile_index.iccid) + local profile_name=$(uci -q get quecprofiles.$profile_index.name) + + # Skip the current profile we're editing + if [ "$iccid" = "$current_iccid" ]; then + continue + fi + + if [ "$profile_name" = "$name" ]; then + return 0 # Found duplicate + fi + done + + return 1 # No duplicate +} + +# Function to update an existing profile +update_profile() { + local profile_index="$1" + local name="$2" + local imei="$3" + local apn="$4" + local pdp_type="$5" + local lte_bands="$6" + local sa_nr5g_bands="$7" + local nsa_nr5g_bands="$8" + local network_type="$9" + local ttl="${10}" + + # Update the profile in UCI config + uci -q batch </dev/null) + + # Debug log + log_message "Received POST data: $POST_DATA" "debug" + + # Parse JSON with jsonfilter if available + if command -v jsonfilter >/dev/null 2>&1; then + iccid=$(echo "$POST_DATA" | jsonfilter -e '@.iccid' 2>/dev/null) + name=$(echo "$POST_DATA" | jsonfilter -e '@.name' 2>/dev/null) + imei=$(echo "$POST_DATA" | jsonfilter -e '@.imei' 2>/dev/null) + apn=$(echo "$POST_DATA" | jsonfilter -e '@.apn' 2>/dev/null) + pdp_type=$(echo "$POST_DATA" | jsonfilter -e '@.pdp_type' 2>/dev/null) + lte_bands=$(echo "$POST_DATA" | jsonfilter -e '@.lte_bands' 2>/dev/null) + sa_nr5g_bands=$(echo "$POST_DATA" | jsonfilter -e '@.sa_nr5g_bands' 2>/dev/null) + nsa_nr5g_bands=$(echo "$POST_DATA" | jsonfilter -e '@.nsa_nr5g_bands' 2>/dev/null) + network_type=$(echo "$POST_DATA" | jsonfilter -e '@.network_type' 2>/dev/null) + ttl=$(echo "$POST_DATA" | jsonfilter -e '@.ttl' 2>/dev/null) + + log_message "Parsed JSON data for profile: $name" "debug" + else + # If jsonfilter is not available, try basic parsing + # This is less reliable but might work for simple cases + iccid=$(echo "$POST_DATA" | grep -o '"iccid":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + name=$(echo "$POST_DATA" | grep -o '"name":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + imei=$(echo "$POST_DATA" | grep -o '"imei":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + apn=$(echo "$POST_DATA" | grep -o '"apn":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + pdp_type=$(echo "$POST_DATA" | grep -o '"pdp_type":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + lte_bands=$(echo "$POST_DATA" | grep -o '"lte_bands":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + sa_nr5g_bands=$(echo "$POST_DATA" | grep -o '"sa_nr5g_bands":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + nsa_nr5g_bands=$(echo "$POST_DATA" | grep -o '"nsa_nr5g_bands":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + network_type=$(echo "$POST_DATA" | grep -o '"network_type":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + ttl=$(echo "$POST_DATA" | grep -o '"ttl":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"') + + log_message "Basic parsing for profile: $name" "warn" + fi + else + log_message "No content length specified" "error" + output_json "error" "No data received" + fi +else + # URL parameters for GET requests (less secure, but supported for testing) + iccid=$(echo "$QUERY_STRING" | grep -o 'iccid=[^&]*' | cut -d'=' -f2) + name=$(echo "$QUERY_STRING" | grep -o 'name=[^&]*' | cut -d'=' -f2) + imei=$(echo "$QUERY_STRING" | grep -o 'imei=[^&]*' | cut -d'=' -f2) + apn=$(echo "$QUERY_STRING" | grep -o 'apn=[^&]*' | cut -d'=' -f2) + pdp_type=$(echo "$QUERY_STRING" | grep -o 'pdp_type=[^&]*' | cut -d'=' -f2) + lte_bands=$(echo "$QUERY_STRING" | grep -o 'lte_bands=[^&]*' | cut -d'=' -f2) + sa_nr5g_bands=$(echo "$QUERY_STRING" | grep -o 'sa_nr5g_bands=[^&]*' | cut -d'=' -f2) + nsa_nr5g_bands=$(echo "$QUERY_STRING" | grep -o 'nsa_nr5g_bands=[^&]*' | cut -d'=' -f2) + network_type=$(echo "$QUERY_STRING" | grep -o 'network_type=[^&]*' | cut -d'=' -f2) + ttl=$(echo "$QUERY_STRING" | grep -o 'ttl=[^&]*' | cut -d'=' -f2) + + # URL decode values + iccid=$(echo "$iccid" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + name=$(echo "$name" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + imei=$(echo "$imei" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + apn=$(echo "$apn" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + pdp_type=$(echo "$pdp_type" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + lte_bands=$(echo "$lte_bands" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + sa_nr5g_bands=$(echo "$sa_nr5g_bands" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + nsa_nr5g_bands=$(echo "$nsa_nr5g_bands" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + network_type=$(echo "$network_type" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + ttl=$(echo "$ttl" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b") + + log_message "Using URL parameters" "warn" +fi + +# Sanitize inputs +iccid=$(sanitize "${iccid:-}") +name=$(sanitize "${name:-}") +imei=$(sanitize "${imei:-}") +apn=$(sanitize "${apn:-}") +pdp_type=$(sanitize "${pdp_type:-IP}") +lte_bands=$(sanitize "${lte_bands:-}") +sa_nr5g_bands=$(sanitize "${sa_nr5g_bands:-}") +nsa_nr5g_bands=$(sanitize "${nsa_nr5g_bands:-}") +network_type=$(sanitize "${network_type:-LTE}") +ttl=$(sanitize "${ttl:-0}") # Default to 0 (disabled) + +# Output debug info +log_message "Editing profile: $name, ICCID: $iccid, IMEI: $imei, APN: $apn" "debug" + +# Validate required inputs +if [ -z "$iccid" ]; then + log_message "ICCID is missing" "error" + output_json "error" "ICCID is required to identify the profile" +fi + +if [ -z "$name" ]; then + log_message "Profile name is missing" "error" + output_json "error" "Profile name is required" +fi + +if [ -z "$apn" ]; then + log_message "APN is missing" "error" + output_json "error" "APN is required" +fi + +# Validate input formats +if ! validate_iccid "$iccid"; then + log_message "Invalid ICCID format: $iccid" "error" + output_json "error" "Invalid ICCID format. It should be 10-20 digits." +fi + +if ! validate_imei "$imei"; then + log_message "Invalid IMEI format: $imei" "error" + output_json "error" "Invalid IMEI format. It should be exactly 15 digits." +fi + +if ! validate_bands "$lte_bands"; then + log_message "Invalid LTE bands format: $lte_bands" "error" + output_json "error" "Invalid LTE bands format. Use comma-separated numbers (e.g., 1,3,7)" +fi + +if ! validate_bands "$sa_nr5g_bands"; then + log_message "Invalid SA NR5G bands format: $sa_nr5g_bands" "error" + output_json "error" "Invalid SA NR5G bands format. Use comma-separated numbers (e.g., 41,78)" +fi + +if ! validate_bands "$nsa_nr5g_bands"; then + log_message "Invalid NSA NR5G bands format: $nsa_nr5g_bands" "error" + output_json "error" "Invalid NSA NR5G bands format. Use comma-separated numbers (e.g., 1,79)" +fi + +if ! validate_network_type "$network_type"; then + log_message "Invalid network type: $network_type" "error" + output_json "error" "Invalid network type. Use 'LTE', 'NR5G', or 'LTE:NR5G'" +fi + +if ! validate_pdp_type "$pdp_type"; then + log_message "Invalid PDP type: $pdp_type" "error" + output_json "error" "Invalid PDP type. Use 'IP', 'IPV6', or 'IPV4V6'" +fi + +if ! validate_ttl "$ttl"; then + log_message "Invalid TTL value: $ttl" "error" + output_json "error" "Invalid TTL value. It should be a number between 0 and 255." +fi + +# Find profile to edit +profile_index=$(find_profile_by_iccid "$iccid") +if [ $? -ne 0 ]; then + log_message "Profile with ICCID $iccid not found" "error" + output_json "error" "Profile not found" +fi + +# Check for duplicate name +if check_duplicate_name "$name" "$iccid"; then + log_message "Duplicate profile name: $name" "error" + output_json "error" "A profile with this name already exists" +fi + +# Update profile +if update_profile "$profile_index" "$name" "$imei" "$apn" "$pdp_type" "$lte_bands" "$nr5g_bands" "$network_type"; then + # Trigger immediate profile application + touch "/tmp/quecprofiles_check" + chmod 644 "/tmp/quecprofiles_check" + log_message "Triggered immediate profile check after update" "info" + + # Create a clean JSON response with properly escaped quotes + printf '{"status":"success","message":"Profile updated successfully","data":{"name":"%s","iccid":"%s","imei":"%s","apn":"%s","pdp_type":"%s","lte_bands":"%s","nr5g_bands":"%s","network_type":"%s"}}' \ + "$name" "$iccid" "$imei" "$apn" "$pdp_type" "$lte_bands" "$nr5g_bands" "$network_type" + + log_message "Profile updated successfully: $name" "info" + + # Note: The conditional trigger is replaced with the direct trigger above +else + printf '{"status":"error","message":"Failed to update profile. Please check system logs."}' + log_message "Failed to update profile: $name" "error" +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/settings/device-uptime.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/settings/device-uptime.sh new file mode 100644 index 0000000..4150da0 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/settings/device-uptime.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +# Set content type for JSON response +echo "Content-type: application/json" +echo "" + +# Get system uptime in seconds from /proc/uptime +read uptime idle < /proc/uptime +uptime=${uptime%.*} # Remove decimal part + +# Calculate days, hours, minutes, seconds +days=$((uptime/86400)) +hours=$(((uptime%86400)/3600)) +minutes=$(((uptime%3600)/60)) +seconds=$((uptime%60)) + +# Format uptime string +uptime_str="" +[ $days -gt 0 ] && uptime_str="${days}d " +[ $hours -gt 0 ] && uptime_str="${uptime_str}${hours}h " +[ $minutes -gt 0 ] && uptime_str="${uptime_str}${minutes}m " +uptime_str="${uptime_str}${seconds}s" + +# Create and output JSON response +cat << EOF +{ + "status": "success", + "timestamp": "$(date -Iseconds)", + "uptime": { + "total_seconds": $uptime, + "days": $days, + "hours": $hours, + "minutes": $minutes, + "seconds": $seconds, + "formatted": "${uptime_str}" + } +} +EOF \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/settings/force-rerun.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/settings/force-rerun.sh new file mode 100644 index 0000000..97ed7a8 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/quecmanager/settings/force-rerun.sh @@ -0,0 +1,64 @@ +#!/bin/sh + +# Send CGI headers first +echo "Content-Type: application/json" +echo "Cache-Control: no-cache" +echo + +# Initialize variables for file paths +APN_SCRIPT="/etc/quecmanager/apn_profile/apnProfiles.sh" +IMEI_SCRIPT="/etc/quecmanager/imei_profile/imeiProfiles.sh" + +# Function to output JSON +output_json() { + local status="$1" + local message="$2" + echo "{\"status\": \"$status\", \"message\": \"$message\"}" +} + +# Function to execute script if it exists +execute_if_exists() { + local script_path="$1" + + if [ -f "$script_path" ] && [ -x "$script_path" ]; then + $script_path >/dev/null 2>&1 + return $? + fi + return 2 +} + +# Main execution +main() { + scripts_executed=0 + has_error=0 + + # Try to execute APN script + execute_if_exists "$APN_SCRIPT" + apn_result=$? + if [ $apn_result -eq 0 ]; then + scripts_executed=$(($scripts_executed + 1)) + elif [ $apn_result -eq 1 ]; then + has_error=1 + fi + + # Try to execute IMEI script + execute_if_exists "$IMEI_SCRIPT" + imei_result=$? + if [ $imei_result -eq 0 ]; then + scripts_executed=$(($scripts_executed + 1)) + elif [ $imei_result -eq 1 ]; then + has_error=1 + fi + + # Output appropriate message based on results + if [ $scripts_executed -eq 0 ]; then + output_json "info" "No scripts to restart" + elif [ $has_error -eq 1 ]; then + output_json "error" "Error executing one or more scripts" + else + output_json "success" "Scripts restarted successfully" + fi +} + +# Run main function +main \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/at_queue_manager.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/at_queue_manager.sh new file mode 100644 index 0000000..aa9aee3 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/at_queue_manager.sh @@ -0,0 +1,672 @@ +#!/bin/sh +# AT Queue Manager for OpenWRT with Preemption Support and Token System +# Located in /www/cgi-bin/services/at_queue_manager + +# Constants +QUEUE_DIR="/tmp/at_queue" +QUEUE_FILE="$QUEUE_DIR/queue" +ACTIVE_FILE="$QUEUE_DIR/active" +RESULTS_DIR="$QUEUE_DIR/results" +LOCK_DIR="$QUEUE_DIR/lock" +TOKEN_FILE="$QUEUE_DIR/token" +MAX_TIMEOUT=240 +CLEANUP_INTERVAL=300 # 5 minutes in seconds +RESULTS_MAX_AGE=3600 # 1 hour in seconds +POLL_INTERVAL=0.01 +PREEMPTION_THRESHOLD=2 # 3 seconds threshold for preemption +TOKEN_TIMEOUT=30 # seconds before token expires + +# Utility function for JSON escaping +escape_json() { + printf '%s' "$1" | awk ' + BEGIN { RS="\n"; ORS="\\n" } + { + gsub(/\\/, "\\\\") + gsub(/"/, "\\\"") + gsub(/\r/, "") + gsub(/\t/, "\\t") + gsub(/\f/, "\\f") + gsub(/\b/, "\\b") + print + } + ' | sed 's/\\n$//' +} + +# Exclusive lock functions +acquire_lock() { + local timeout=10 + local attempt=0 + + while [ $attempt -lt $timeout ]; do + if mkdir "$LOCK_DIR" 2>/dev/null; then + logger -t at_queue -p daemon.debug "Lock acquired" + return 0 + fi + + sleep 0.1 + attempt=$((attempt + 1)) + done + + logger -t at_queue -p daemon.error "Failed to acquire lock after $timeout attempts" + return 1 +} + +release_lock() { + if [ -d "$LOCK_DIR" ]; then + rmdir "$LOCK_DIR" 2>/dev/null + logger -t at_queue -p daemon.debug "Lock released" + return 0 + fi + + logger -t at_queue -p daemon.error "Lock directory doesn't exist" + return 1 +} + +# Ensure required directories exist +init_queue_system() { + mkdir -p "$QUEUE_DIR" "$RESULTS_DIR" + touch "$QUEUE_FILE" + chmod 755 "$QUEUE_DIR" + chmod 644 "$QUEUE_FILE" + chmod 755 "$RESULTS_DIR" + logger -t at_queue -p daemon.info "Queue system initialized" +} + +# Cleanup old results and tracking files +cleanup_old_results() { + local current_time=$(date +%s) + + # Clean up old execution tracking files + find "$QUEUE_DIR" -name "pid.*" -type f -mmin +60 -delete 2>/dev/null + find "$QUEUE_DIR" -name "*.exit" -type f -mmin +60 -delete 2>/dev/null + find "$QUEUE_DIR" -name "start_time.*" -type f -mmin +60 -delete 2>/dev/null + logger -t at_queue -p daemon.debug "Cleaned up old tracking files" + + # Use find with -delete and basic timestamp check for OpenWRT + find "$RESULTS_DIR" -name "*.json" -type f -mmin +60 -delete 2>/dev/null || { + # Fallback method if find fails + for file in "$RESULTS_DIR"/*.json; do + [ -f "$file" ] || continue + local file_time=$(stat -c %Y "$file") + if [ $((current_time - file_time)) -gt $RESULTS_MAX_AGE ]; then + rm -f "$file" + fi + done + } + + # Check for expired token + if [ -f "$TOKEN_FILE" ]; then + local token_time=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp') + if [ $((current_time - token_time)) -gt $TOKEN_TIMEOUT ]; then + local token_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id') + logger -t at_queue -p daemon.warn "Removing expired token from $token_holder" + rm -f "$TOKEN_FILE" + fi + fi + + logger -t at_queue -p daemon.info "Cleanup: Removed files older than 1 hour" +} + +# Generate unique command ID +generate_command_id() { + echo "$(date +%s)_$(head -c 8 /dev/urandom | hexdump -v -e '1/1 "%02x"')" +} + +# Start tracking command execution time +start_execution_tracking() { + local cmd_id="$1" + local pid="$2" + local start_time=$(date +%s) + + echo "$start_time" > "$QUEUE_DIR/start_time.$cmd_id" + echo "$pid" > "$QUEUE_DIR/pid.$cmd_id" + chmod 644 "$QUEUE_DIR/start_time.$cmd_id" + chmod 644 "$QUEUE_DIR/pid.$cmd_id" + logger -t at_queue -p daemon.debug "Started tracking command $cmd_id (PID: $pid)" +} + +# Check if running command should be preempted +should_preempt() { + local current_cmd_id="$1" + local new_priority="$2" + + if [ ! -f "$QUEUE_DIR/start_time.$current_cmd_id" ]; then + logger -t at_queue -p daemon.debug "No start time found for $current_cmd_id" + return 1 + fi + + local start_time=$(cat "$QUEUE_DIR/start_time.$current_cmd_id") + local current_time=$(date +%s) + local execution_time=$((current_time - start_time)) + + # Get current command's priority + local current_priority + if [ -f "$ACTIVE_FILE" ]; then + current_priority=$(cat "$ACTIVE_FILE" | jsonfilter -e '@.priority') + else + logger -t at_queue -p daemon.debug "No active command found" + return 1 + fi + + if [ $execution_time -gt $PREEMPTION_THRESHOLD ] && [ $new_priority -lt $current_priority ]; then + logger -t at_queue -p daemon.info "Command $current_cmd_id (priority $current_priority) running for ${execution_time}s is eligible for preemption by priority $new_priority" + return 0 + fi + + logger -t at_queue -p daemon.debug "Command $current_cmd_id not eligible for preemption (time: ${execution_time}s, current priority: $current_priority, new priority: $new_priority)" + return 1 +} + +# Handle command preemption +preempt_command() { + local cmd_id="$1" + local pid_file="$QUEUE_DIR/pid.$cmd_id" + + if [ -f "$pid_file" ]; then + local pid=$(cat "$pid_file") + logger -t at_queue -p daemon.info "Preempting command $cmd_id (PID: $pid)" + + # Send SIGTERM first + kill -TERM $pid 2>/dev/null + + # Brief wait for graceful termination + sleep 0.1 + + # Force kill if still running + if kill -0 $pid 2>/dev/null; then + kill -KILL $pid 2>/dev/null + logger -t at_queue -p daemon.warn "Forced termination of command $cmd_id" + fi + + # Record preemption result + write_preemption_result "$cmd_id" + + # Cleanup command files + rm -f "$pid_file" "$QUEUE_DIR/start_time.$cmd_id" "$QUEUE_DIR/$cmd_id.exit" + [ -f "$ACTIVE_FILE" ] && rm -f "$ACTIVE_FILE" + + logger -t at_queue -p daemon.info "Command $cmd_id preemption complete" + return 0 + fi + + logger -t at_queue -p daemon.warn "No PID file found for command $cmd_id" + return 1 +} + +# Record result for preempted command +write_preemption_result() { + local cmd_id="$1" + local end_time=$(date +%s%3N) + local start_time + + if [ -f "$QUEUE_DIR/start_time.$cmd_id" ]; then + start_time=$(cat "$QUEUE_DIR/start_time.$cmd_id")000 + else + start_time=$end_time + fi + + local duration=$((end_time - start_time)) + local command_text=$(cat "$ACTIVE_FILE" | jsonfilter -e '@.command') + + local response=$(cat << EOF +{ + "command": { + "id": "$cmd_id", + "text": "$(escape_json "$command_text")", + "timestamp": "$(date -Iseconds)" + }, + "response": { + "status": "preempted", + "raw_output": "Command preempted by higher priority task", + "completion_time": "$end_time", + "duration_ms": $duration + } +} +EOF +) + + printf "%s" "$response" > "$RESULTS_DIR/$cmd_id.json" + chmod 644 "$RESULTS_DIR/$cmd_id.json" + logger -t at_queue -p daemon.info "Recorded preemption result for command $cmd_id (duration: ${duration}ms)" +} + +# Request a token for direct sms_tool execution +request_token() { + local requestor_id="$1" + local priority="${2:-10}" + local timeout="${3:-10}" + + # Acquire lock first + if ! acquire_lock; then + logger -t at_queue -p daemon.error "Failed to acquire lock for token request" + echo "{\"error\":\"Could not acquire lock\",\"status\":\"denied\"}" + return 1 + fi + + # Check if token file exists (someone else has the token) + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id') + local current_priority=$(cat "$TOKEN_FILE" | jsonfilter -e '@.priority') + local timestamp=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp') + local current_time=$(date +%s) + + # Check for expired token (> TOKEN_TIMEOUT seconds old) + if [ $((current_time - timestamp)) -gt $TOKEN_TIMEOUT ]; then + logger -t at_queue -p daemon.warn "Found expired token from $current_holder, releasing" + rm -f "$TOKEN_FILE" + # Check for priority preemption + elif [ $priority -lt $current_priority ]; then + logger -t at_queue -p daemon.info "Preempting token from $current_holder (priority: $current_priority) for $requestor_id (priority: $priority)" + rm -f "$TOKEN_FILE" + else + # Token in use and cannot be preempted + release_lock + echo "{\"status\":\"denied\",\"holder\":\"$current_holder\",\"priority\":$current_priority}" + return 1 + fi + fi + + # Also check if there's an active command from the queue + if [ -f "$ACTIVE_FILE" ]; then + local active_id=$(cat "$ACTIVE_FILE" | jsonfilter -e '@.id') + local active_priority=$(cat "$ACTIVE_FILE" | jsonfilter -e '@.priority') + + # Only preempt if priority is higher + if [ $priority -ge $active_priority ]; then + release_lock + echo "{\"status\":\"denied\",\"holder\":\"$active_id\",\"priority\":$active_priority}" + return 1 + fi + + logger -t at_queue -p daemon.info "Direct execution with higher priority than active queue command" + fi + + # Grant token + local token_data="{\"id\":\"$requestor_id\",\"priority\":$priority,\"timestamp\":$(date +%s)}" + echo "$token_data" > "$TOKEN_FILE" + chmod 644 "$TOKEN_FILE" + + release_lock + echo "{\"status\":\"granted\",\"id\":\"$requestor_id\",\"timeout\":$timeout}" + return 0 +} + +# Release a previously acquired token +release_token() { + local requestor_id="$1" + + if ! acquire_lock; then + logger -t at_queue -p daemon.error "Failed to acquire lock for token release" + return 1 + fi + + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id') + + if [ "$current_holder" = "$requestor_id" ]; then + rm -f "$TOKEN_FILE" + logger -t at_queue -p daemon.debug "Token released by $requestor_id" + release_lock + echo "{\"status\":\"released\"}" + return 0 + else + logger -t at_queue -p daemon.warn "Token release attempted by $requestor_id but held by $current_holder" + fi + else + logger -t at_queue -p daemon.warn "Token release attempted but no token exists" + fi + + release_lock + echo "{\"status\":\"not_found\"}" + return 1 +} + +# Add command to queue with preemption support +enqueue_command() { + local cmd="$1" + local priority="${2:-10}" + local cmd_id=$(generate_command_id) + local timestamp=$(date -Iseconds) + + # Ensure queue directory exists + [ ! -d "$QUEUE_DIR" ] && init_queue_system + + logger -t at_queue -p daemon.info "Enqueuing command: $cmd (priority: $priority, id: $cmd_id)" + + # Acquire lock for queue modification + if ! acquire_lock; then + logger -t at_queue -p daemon.error "Failed to acquire lock for enqueuing command" + echo "{\"error\":\"Queue lock acquisition failed\",\"command\":\"$cmd\"}" + return 1 + fi + + # Check for active command that can be preempted + if [ -f "$ACTIVE_FILE" ]; then + local active_cmd_id=$(cat "$ACTIVE_FILE" | jsonfilter -e '@.id') + if should_preempt "$active_cmd_id" "$priority"; then + preempt_command "$active_cmd_id" + fi + fi + + # Create command entry + local entry="{\"id\":\"$cmd_id\",\"command\":\"$(escape_json "$cmd")\",\"priority\":$priority,\"timestamp\":\"$timestamp\"}" + + if [ "$priority" = "1" ]; then + # High priority - prepend to queue + local temp_file=$(mktemp) + echo "$entry" > "$temp_file" + cat "$QUEUE_FILE" >> "$temp_file" + mv "$temp_file" "$QUEUE_FILE" + chmod 644 "$QUEUE_FILE" + logger -t at_queue -p daemon.info "Added high priority command to front of queue" + else + # Normal priority - append to queue + echo "$entry" >> "$QUEUE_FILE" + logger -t at_queue -p daemon.info "Added normal priority command to end of queue" + fi + + # Release lock + release_lock + + echo "{\"command_id\":\"$cmd_id\",\"status\":\"queued\"}" +} + +# Get next command from queue +dequeue_command() { + if [ ! -s "$QUEUE_FILE" ]; then + return 1 + fi + + # Acquire lock + if ! acquire_lock; then + logger -t at_queue -p daemon.error "Failed to acquire lock for dequeuing command" + return 1 + fi + + local cmd_entry=$(head -n 1 "$QUEUE_FILE") + local temp_file=$(mktemp) + tail -n +2 "$QUEUE_FILE" > "$temp_file" + mv "$temp_file" "$QUEUE_FILE" + chmod 644 "$QUEUE_FILE" + + echo "$cmd_entry" > "$ACTIVE_FILE" + chmod 644 "$ACTIVE_FILE" + + # Release lock + release_lock + + logger -t at_queue -p daemon.debug "Dequeued command: $(echo "$cmd_entry" | jsonfilter -e '@.command')" + echo "$cmd_entry" +} + +# Clean and format AT command output +clean_output() { + local output="$1" + + # First format AT command responses for readability + output=$(echo "$output" | sed -E ' + # Add newline after AT commands + s/(AT\+[A-Z0-9]+[^ ]*) +/\1\n/g + # Add newline before +RESPONSE lines + s/ +(\+[A-Z0-9]+:)/\n\1/g + # Add newline before OK/ERROR + s/ +(OK|ERROR)$/\n\1/g + ') + + # Then escape the formatted output for JSON + output=$(escape_json "$output") + + echo "$output" +} + +# Execute AT command with optimized timeout handling +execute_with_timeout() { + local command="$1" + local timeout="$2" + local cmd_id="$3" + local output_file=$(mktemp) + + # Start command in background with immediate output + (sms_tool -D at "$command" > "$output_file" 2>&1; echo $? > "$QUEUE_DIR/$cmd_id.exit") & + local pid=$! + + # Start execution tracking + start_execution_tracking "$cmd_id" "$pid" + + logger -t at_queue -p daemon.debug "Started command execution: $command (PID: $pid)" + + # Wait for completion with shorter polling interval + local start_time=$(date +%s) + local elapsed=0 + + while [ $elapsed -lt "$timeout" ]; do + if [ -f "$QUEUE_DIR/$cmd_id.exit" ]; then + local exit_code=$(cat "$QUEUE_DIR/$cmd_id.exit") + local output=$(cat "$output_file") + + # Cleanup + rm -f "$QUEUE_DIR/pid.$cmd_id" "$QUEUE_DIR/$cmd_id.exit" "$output_file" "$QUEUE_DIR/start_time.$cmd_id" + + logger -t at_queue -p daemon.debug "Command completed with exit code $exit_code" + echo "$output" + return $exit_code + fi + + elapsed=$(($(date +%s) - start_time)) + sleep $POLL_INTERVAL + done + + # Handle timeout + if [ -f "$QUEUE_DIR/pid.$cmd_id" ]; then + local pid=$(cat "$QUEUE_DIR/pid.$cmd_id") + kill $pid 2>/dev/null + sleep 0.1 + # Force kill if still running + if kill -0 $pid 2>/dev/null; then + kill -KILL $pid 2>/dev/null + fi + + local partial_output=$(cat "$output_file" 2>/dev/null || echo "") + + # Cleanup + rm -f "$QUEUE_DIR/pid.$cmd_id" "$QUEUE_DIR/$cmd_id.exit" "$output_file" "$QUEUE_DIR/start_time.$cmd_id" + + logger -t at_queue -p daemon.warn "Command timed out after $timeout seconds" + echo "${partial_output:-Command timed out after $timeout seconds}" + fi + + return 124 +} + +# Execute AT command and handle response +execute_command() { + local cmd_entry="$1" + local cmd_id=$(echo "$cmd_entry" | jsonfilter -e '@.id') + local cmd_text=$(echo "$cmd_entry" | jsonfilter -e '@.command') + local priority=$(echo "$cmd_entry" | jsonfilter -e '@.priority') + + local start_time=$(date +%s%3N) + + logger -t at_queue -p daemon.info "Executing command $cmd_id: $cmd_text (priority: $priority)" + + # Execute command with timeout + local result=$(execute_with_timeout "$cmd_text" $MAX_TIMEOUT "$cmd_id") + local exit_code=$? + local end_time=$(date +%s%3N) + local duration=$((end_time - start_time)) + + # Determine status and log level + local status="error" + local log_level="error" + + if [ $exit_code -eq 124 ]; then + status="timeout" + logger -t at_queue -p daemon.error "Command $cmd_id timed out after ${duration}ms" + elif echo "$result" | grep -q "OK"; then + status="success" + log_level="info" + logger -t at_queue -p daemon.info "Command $cmd_id completed successfully in ${duration}ms" + elif echo "$result" | grep -q "CME ERROR"; then + status="cme_error" + logger -t at_queue -p daemon.error "Command $cmd_id failed with CME ERROR in ${duration}ms" + else + logger -t at_queue -p daemon.error "Command $cmd_id failed with general error in ${duration}ms" + fi + + # Clean and escape the output + local clean_result=$(clean_output "$result") + + # Create JSON response + local response=$(cat << EOF +{ + "command": { + "id": "$cmd_id", + "text": "$(escape_json "$cmd_text")", + "timestamp": "$(date -Iseconds)" + }, + "response": { + "status": "$status", + "raw_output": "$clean_result", + "completion_time": "$end_time", + "duration_ms": $duration + } +} +EOF +) + + # Acquire lock for writing result + if ! acquire_lock; then + logger -t at_queue -p daemon.error "Failed to acquire lock for writing result" + else + # Save response + printf "%s" "$response" > "$RESULTS_DIR/$cmd_id.json" + chmod 644 "$RESULTS_DIR/$cmd_id.json" + + # Clean up active file + rm -f "$ACTIVE_FILE" + + # Release lock + release_lock + fi + + echo "$response" +} + +# Main queue processing function +process_queue() { + init_queue_system + local last_cleanup=$(date +%s) + local last_log=$(date +%s) # Add a timestamp for less frequent logging + + # Make sure the lock directory doesn't exist at startup + [ -d "$LOCK_DIR" ] && rmdir "$LOCK_DIR" 2>/dev/null + + logger -t at_queue -p daemon.info "Started queue processing daemon" + + while true; do + # Quick cleanup check + local current_time=$(date +%s) + if [ $((current_time - last_cleanup)) -ge $CLEANUP_INTERVAL ]; then + cleanup_old_results + last_cleanup=$current_time + fi + + # Skip processing if token is granted to someone + if [ -f "$TOKEN_FILE" ]; then + local token_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id') + local token_time=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp') + local current_time=$(date +%s) + + # Check for expired token + if [ $((current_time - token_time)) -gt $TOKEN_TIMEOUT ]; then + logger -t at_queue -p daemon.warn "Removing expired token from $token_holder" + rm -f "$TOKEN_FILE" + else + # Log pause status only every 5 seconds to reduce log spam + if [ $((current_time - last_log)) -ge 5 ]; then + logger -t at_queue -p daemon.debug "Queue processing paused, token held by $token_holder" + last_log=$current_time + fi + sleep $POLL_INTERVAL + continue + fi + fi + + # Process queue if not empty and no active command + if [ -s "$QUEUE_FILE" ] && [ ! -f "$ACTIVE_FILE" ]; then + local cmd_entry=$(dequeue_command) + if [ -n "$cmd_entry" ]; then + execute_command "$cmd_entry" + fi + fi + + sleep $POLL_INTERVAL + done +} + +# CGI command handling +if [ "${SCRIPT_NAME}" != "" ]; then + # Output headers + if [ "$HTTP_HEADERS" != "0" ]; then + echo "Content-Type: application/json" + echo "" + fi + + # Parse query string for CGI mode + eval $(echo "$QUERY_STRING" | sed 's/&/;/g') + + case "$action" in + "enqueue") + if [ -n "$command" ]; then + logger -t at_queue -p daemon.info "CGI: Received enqueue request for command: $command" + enqueue_command "$command" "$priority" + else + logger -t at_queue -p daemon.error "CGI: Empty command received" + echo "{\"error\":\"No command specified\"}" + fi + ;; + "status") + if [ -f "$ACTIVE_FILE" ]; then + logger -t at_queue -p daemon.debug "CGI: Status request - queue active" + cat "$ACTIVE_FILE" + else + logger -t at_queue -p daemon.debug "CGI: Status request - queue idle" + echo "{\"status\":\"idle\"}" + fi + ;; + "request_token") + if [ -n "$id" ]; then + logger -t at_queue -p daemon.info "Token request from $id (priority: ${priority:-10})" + request_token "$id" "${priority:-10}" "${timeout:-10}" + else + logger -t at_queue -p daemon.error "Token request missing ID" + echo "{\"error\":\"No requestor ID specified\",\"status\":\"denied\"}" + fi + ;; + "release_token") + if [ -n "$id" ]; then + logger -t at_queue -p daemon.info "Token release from $id" + release_token "$id" + else + logger -t at_queue -p daemon.error "Token release missing ID" + echo "{\"error\":\"No requestor ID specified\",\"status\":\"denied\"}" + fi + ;; + *) + logger -t at_queue -p daemon.error "CGI: Invalid action received: $action" + echo "{\"error\":\"Invalid action\"}" + ;; + esac + exit 0 +fi + +# CLI command handling +if [ "$1" = "enqueue" ] && [ -n "$2" ]; then + enqueue_command "$2" "${3:-10}" + exit $? +fi + +# If not run as CGI, start queue processing +if [ "${SCRIPT_NAME}" = "" ] && [ -z "$1" ]; then + process_queue +fi \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/log_signal_metrics.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/log_signal_metrics.sh new file mode 100644 index 0000000..6646134 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/log_signal_metrics.sh @@ -0,0 +1,198 @@ +#!/bin/sh +# Configuration +LOGDIR="/www/signal_graphs" +MAX_ENTRIES=10 +INTERVAL=60 +QUEUE_DIR="/tmp/at_queue" +TOKEN_FILE="$QUEUE_DIR/token" +LOCK_FILE="/tmp/signal_metrics.lock" +METRICS_PID_FILE="/tmp/signal_metrics.pid" +MAX_TOKEN_WAIT=5 # seconds to wait for token acquisition + +# Ensure required directories exist +mkdir -p "$LOGDIR" "$QUEUE_DIR" + +# Check if another instance is running +check_running() { + if [ -f "$METRICS_PID_FILE" ]; then + pid=$(cat "$METRICS_PID_FILE") + if kill -0 "$pid" 2>/dev/null; then + return 0 + fi + rm -f "$METRICS_PID_FILE" 2>/dev/null + fi + return 1 +} + +# Acquire token directly (minimized version) +acquire_token() { + local metrics_id="METRICS_$(date +%s)_$$" + local priority=20 # Lowest priority for metrics + local max_attempts=20 + local attempt=0 + + while [ $attempt -lt $max_attempts ]; do + # Check if token exists + if [ -f "$TOKEN_FILE" ]; then + # Check current token + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + local current_priority=$(cat "$TOKEN_FILE" | jsonfilter -e '@.priority' 2>/dev/null) + local timestamp=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp' 2>/dev/null) + local current_time=$(date +%s) + + # Check for expired token + if [ $((current_time - timestamp)) -gt 30 ] || [ -z "$current_holder" ]; then + rm -f "$TOKEN_FILE" 2>/dev/null + elif [ $priority -lt $current_priority ]; then + rm -f "$TOKEN_FILE" 2>/dev/null + else + # Wait and try again + sleep 0.5 + attempt=$((attempt + 1)) + continue + fi + fi + + # Try to create token + echo "{\"id\":\"$metrics_id\",\"priority\":$priority,\"timestamp\":$(date +%s)}" > "$TOKEN_FILE" 2>/dev/null + chmod 644 "$TOKEN_FILE" 2>/dev/null + + # Verify we got it + local holder=$(cat "$TOKEN_FILE" 2>/dev/null | jsonfilter -e '@.id' 2>/dev/null) + if [ "$holder" = "$metrics_id" ]; then + echo "$metrics_id" + return 0 + fi + + sleep 0.5 + attempt=$((attempt + 1)) + done + + return 1 +} + +# Release token directly +release_token() { + local metrics_id="$1" + + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + if [ "$current_holder" = "$metrics_id" ]; then + rm -f "$TOKEN_FILE" 2>/dev/null + fi + fi +} + +# Execute AT command directly +execute_at_command() { + local CMD="$1" + sms_tool at "$CMD" -t 3 2>/dev/null +} + +# Process all metrics commands with a single token +process_all_metrics() { + # Try to get token + local metrics_id=$(acquire_token) + if [ -z "$metrics_id" ]; then + logger -t at_queue -p daemon.warn "Could not acquire token for metrics - will try again later" + return 1 + fi + + logger -t at_queue -p daemon.info "Processing all metrics with token $metrics_id" + + # Execute all metrics commands with the single token + local timestamp=$(date "+%Y-%m-%d %H:%M:%S") + + # RSRP + local rsrp_output=$(execute_at_command "AT+QRSRP") + if [ -n "$rsrp_output" ] && echo "$rsrp_output" | grep -q "QRSRP"; then + local logfile="$LOGDIR/rsrp.json" + [ ! -s "$logfile" ] && echo "[]" > "$logfile" + + local temp_file="${logfile}.tmp.$$" + jq --arg dt "$timestamp" \ + --arg out "$rsrp_output" \ + '. + [{"datetime": $dt, "output": $out}] | .[-'"$MAX_ENTRIES"':]' \ + "$logfile" > "$temp_file" 2>/dev/null && mv "$temp_file" "$logfile" + chmod 644 "$logfile" + fi + + sleep 0.5 + + # RSRQ + local rsrq_output=$(execute_at_command "AT+QRSRQ") + if [ -n "$rsrq_output" ] && echo "$rsrq_output" | grep -q "QRSRQ"; then + local logfile="$LOGDIR/rsrq.json" + [ ! -s "$logfile" ] && echo "[]" > "$logfile" + + local temp_file="${logfile}.tmp.$$" + jq --arg dt "$timestamp" \ + --arg out "$rsrq_output" \ + '. + [{"datetime": $dt, "output": $out}] | .[-'"$MAX_ENTRIES"':]' \ + "$logfile" > "$temp_file" 2>/dev/null && mv "$temp_file" "$logfile" + chmod 644 "$logfile" + fi + + sleep 0.5 + + # SINR + local sinr_output=$(execute_at_command "AT+QSINR") + if [ -n "$sinr_output" ] && echo "$sinr_output" | grep -q "QSINR"; then + local logfile="$LOGDIR/sinr.json" + [ ! -s "$logfile" ] && echo "[]" > "$logfile" + + local temp_file="${logfile}.tmp.$$" + jq --arg dt "$timestamp" \ + --arg out "$sinr_output" \ + '. + [{"datetime": $dt, "output": $out}] | .[-'"$MAX_ENTRIES"':]' \ + "$logfile" > "$temp_file" 2>/dev/null && mv "$temp_file" "$logfile" + chmod 644 "$logfile" + fi + + sleep 0.5 + + # Data usage + local usage_output=$(execute_at_command "AT+QGDCNT?;+QGDNRCNT?") + if [ -n "$usage_output" ] && echo "$usage_output" | grep -q "QGDCNT\|QGDNRCNT"; then + local logfile="$LOGDIR/data_usage.json" + [ ! -s "$logfile" ] && echo "[]" > "$logfile" + + local temp_file="${logfile}.tmp.$$" + jq --arg dt "$timestamp" \ + --arg out "$usage_output" \ + '. + [{"datetime": $dt, "output": $out}] | .[-'"$MAX_ENTRIES"':]' \ + "$logfile" > "$temp_file" 2>/dev/null && mv "$temp_file" "$logfile" + chmod 644 "$logfile" + fi + + # Release token + release_token "$metrics_id" + logger -t at_queue -p daemon.info "Metrics processing completed" + return 0 +} + +# Main continuous logging function with proper locking +start_continuous_logging() { + # Check if already running + if check_running; then + logger -t at_queue -p daemon.error "Signal metrics logging already running" + exit 1 + fi + + # Store PID + echo "$$" > "$METRICS_PID_FILE" + chmod 644 "$METRICS_PID_FILE" + + sleep 20 # Initial delay to allow system startup + logger -t at_queue -p daemon.info "Starting continuous signal metrics logging (PID: $$)" + + trap 'logger -t at_queue -p daemon.info "Stopping signal metrics logging"; rm -f "$METRICS_PID_FILE"; exit 0' INT TERM + + while true; do + process_all_metrics + sleep "$INTERVAL" + done +} + +# Start the continuous logging +start_continuous_logging \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quec_profile_daemon.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quec_profile_daemon.sh new file mode 100644 index 0000000..90bf2e6 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quec_profile_daemon.sh @@ -0,0 +1,1045 @@ +#!/bin/sh +# Updated QuecProfiles daemon with enhanced SA/NSA NR5G band management and TTL support +# Including profile application functions and fixed comparison logic + +# Configuration +QUEUE_DIR="/tmp/at_queue" +TOKEN_FILE="$QUEUE_DIR/token" +TRACK_FILE="/tmp/quecprofiles_active" +CHECK_TRIGGER="/tmp/quecprofiles_check" +STATUS_FILE="/tmp/quecprofiles_status.json" +APPLIED_FLAG="/tmp/quecprofiles_applied" +DEBUG_LOG="/tmp/quecprofiles_debug.log" +DETAILED_LOG="/tmp/quecprofiles_detailed.log" +DEFAULT_CHECK_INTERVAL=60 # Default check interval in seconds +COMMAND_TIMEOUT=10 # Default timeout for AT commands in seconds +QUEUE_PRIORITY=3 # Medium-high priority (1 is highest for cell scan) +MAX_TOKEN_WAIT=15 # Maximum seconds to wait for token acquisition + +# Initialize log file +echo "$(date) - Starting QuecProfiles daemon with SA/NSA NR5G and TTL support (PID: $$)" >"$DEBUG_LOG" +echo "$(date) - Starting QuecProfiles daemon with SA/NSA NR5G and TTL support (PID: $$)" >"$DETAILED_LOG" +chmod 644 "$DEBUG_LOG" "$DETAILED_LOG" + +# Function to log messages +log_message() { + local message="$1" + local level="${2:-info}" + local timestamp=$(date "+%Y-%m-%d %H:%M:%S") + + # Log to system log + logger -t quecprofiles_daemon -p "daemon.$level" "$message" + + # Log to debug file + echo "[$timestamp] [$level] $message" >>"$DEBUG_LOG" + + # For detailed logs or errors + if [ "$level" = "error" ] || [ "$level" = "debug" ]; then + echo "[$timestamp] [$level] $message" >>"$DETAILED_LOG" + fi +} + +# Function to update track file with status - IMPROVED VERSION +update_track() { + local status="$1" + local message="$2" + local profile="${3:-unknown}" + local progress="${4:-0}" + + # Create JSON status + cat >"$STATUS_FILE" <"$TRACK_FILE" + chmod 644 "$TRACK_FILE" + fi + + log_message "Status updated: $status - $message ($progress%)" +} + +# Function to find profile by ICCID in UCI +find_profile_by_iccid() { + local iccid="$1" + local profile_indices + + log_message "Looking for profile with ICCID: $iccid" "info" + + # Get all profile indices + profile_indices=$(uci show quecprofiles | grep -o '@profile\[[0-9]\+\]' | sort -u) + + # Exit early if no profiles found + if [ -z "$profile_indices" ]; then + log_message "No profiles configured in the system" "info" + return 1 + fi + + for profile_index in $profile_indices; do + local current_iccid=$(uci -q get quecprofiles.$profile_index.iccid) + if [ "$current_iccid" = "$iccid" ]; then + log_message "Found matching profile: $profile_index" "info" + echo "$profile_index" + return 0 + fi + done + + log_message "No matching profile found for ICCID: $iccid" "info" + return 1 +} + +# Function to normalize and compare values - handles format differences +compare_values() { + local current="$1" + local desired="$2" + local type="$3" + + # Skip empty values + if [ -z "$desired" ]; then + log_message "Desired value for $type is empty, skipping comparison" "debug" + return 1 # No change needed + fi + + # Normalize values for comparison + local norm_current + local norm_desired + + # Different normalization based on type + case "$type" in + "apn") + # APN comparison is case-insensitive + norm_current=$(echo "$current" | tr '[:upper:]' '[:lower:]') + norm_desired=$(echo "$desired" | tr '[:upper:]' '[:lower:]') + ;; + "mode") + # Network mode - normalize format and sort parts + norm_current=$(echo "$current" | tr '[:upper:]' '[:lower:]' | tr ':' ',' | tr -d ' ' | tr ',' '\n' | sort | tr '\n' ',' | sed 's/,$//') + norm_desired=$(echo "$desired" | tr '[:upper:]' '[:lower:]' | tr ':' ',' | tr -d ' ' | tr ',' '\n' | sort | tr '\n' ',' | sed 's/,$//') + ;; + "bands") + # Bands - sort numbers for consistent comparison + norm_current=$(echo "$current" | tr ',' '\n' | sort -n | tr '\n' ',' | sed 's/,$//') + norm_desired=$(echo "$desired" | tr ',' '\n' | sort -n | tr '\n' ',' | sed 's/,$//') + ;; + *) + # Default comparison + norm_current="$current" + norm_desired="$desired" + ;; + esac + + log_message "Comparing $type - Current: '$norm_current', Desired: '$norm_desired'" "debug" + + # Check if values are equivalent after normalization + if [ "$norm_current" = "$norm_desired" ]; then + log_message "$type values match after normalization" "debug" + return 1 # No change needed + else + log_message "$type values differ after normalization - change needed" "debug" + return 0 # Change needed + fi +} + +# Function to check if profile is already applied +is_profile_applied() { + local iccid="$1" + local profile_name="$2" + + # Check if applied flag exists and matches current profile + if [ -f "$APPLIED_FLAG" ]; then + local applied_data=$(cat "$APPLIED_FLAG" 2>/dev/null) + local applied_iccid=$(echo "$applied_data" | cut -d':' -f1) + local applied_name=$(echo "$applied_data" | cut -d':' -f2) + local applied_time=$(echo "$applied_data" | cut -d':' -f3) + + # Check if the applied profile matches current one + if [ "$applied_iccid" = "$iccid" ] && [ "$applied_name" = "$profile_name" ]; then + log_message "Profile '$profile_name' already applied at $(date -d @$applied_time)" "info" + return 0 # Profile already applied + fi + fi + + # No matching applied profile found + return 1 +} + +# Function to mark profile as applied +mark_profile_applied() { + local iccid="$1" + local profile_name="$2" + + # Save profile application data + echo "$iccid:$profile_name:$(date +%s)" >"$APPLIED_FLAG" + chmod 644 "$APPLIED_FLAG" + log_message "Marked profile '$profile_name' as applied for ICCID $iccid" "info" +} + +# Enhanced JSON string escaping function +escape_json() { + printf '%s' "$1" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g' | tr -d '\n' | sed 's/\r//g' +} + +# Function to acquire token directly with retries +acquire_token() { + local lock_id="QUECPROFILES_$(date +%s)_$$" + local priority="$QUEUE_PRIORITY" + local max_attempts=$MAX_TOKEN_WAIT + local attempt=0 + + log_message "Attempting to acquire AT queue token with priority $priority" "debug" + + while [ $attempt -lt $max_attempts ]; do + # Check if token file exists + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + local current_priority=$(cat "$TOKEN_FILE" | jsonfilter -e '@.priority' 2>/dev/null) + local timestamp=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp' 2>/dev/null) + local current_time=$(date +%s) + + # Check for expired token (> 30 seconds old) + if [ $((current_time - timestamp)) -gt 30 ] || [ -z "$current_holder" ]; then + # Remove expired token + log_message "Found expired token from $current_holder, removing" "debug" + rm -f "$TOKEN_FILE" 2>/dev/null + elif [ $priority -lt $current_priority ]; then + # Preempt lower priority token + log_message "Preempting token from $current_holder (priority: $current_priority)" "debug" + rm -f "$TOKEN_FILE" 2>/dev/null + else + # Try again - higher priority token exists + log_message "Token held by $current_holder with priority $current_priority, retrying..." "debug" + sleep 0.5 + attempt=$((attempt + 1)) + continue + fi + fi + + # Try to create token file + echo "{\"id\":\"$lock_id\",\"priority\":$priority,\"timestamp\":$(date +%s)}" >"$TOKEN_FILE" 2>/dev/null + chmod 644 "$TOKEN_FILE" 2>/dev/null + + # Verify we got the token + local holder=$(cat "$TOKEN_FILE" 2>/dev/null | jsonfilter -e '@.id' 2>/dev/null) + if [ "$holder" = "$lock_id" ]; then + log_message "Successfully acquired token with ID $lock_id" "debug" + echo "$lock_id" + return 0 + fi + + sleep 0.5 + attempt=$((attempt + 1)) + done + + log_message "Failed to acquire token after $max_attempts attempts" "error" + return 1 +} + +# Function to release token +release_token() { + local lock_id="$1" + + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + if [ "$current_holder" = "$lock_id" ]; then + rm -f "$TOKEN_FILE" 2>/dev/null + log_message "Released token $lock_id" "debug" + return 0 + fi + log_message "Token held by $current_holder, not by us ($lock_id)" "warn" + else + log_message "Token file doesn't exist, nothing to release" "debug" + fi + return 1 +} + +# Function to execute AT command with proper error handling +execute_at_command() { + local cmd="$1" + local timeout="${2:-$COMMAND_TIMEOUT}" + local token_id="$3" + + if [ -z "$token_id" ]; then + log_message "No valid token provided for command: $cmd" "error" + return 1 + fi + + log_message "Executing AT command: $cmd (timeout: ${timeout}s)" "debug" + + # Execute the command with proper timeout + local output="" + local status=1 + + # Check if sms_tool exists + if which sms_tool >/dev/null 2>&1; then + output=$(sms_tool at "$cmd" -t "$timeout" 2>&1) + status=$? + log_message "AT command executed, status: $status" "debug" + else + log_message "sms_tool not found, cannot execute AT command" "error" + return 1 + fi + + # Log command output for debugging + echo "Command: $cmd" >>"$DETAILED_LOG" + echo "Output: $output" >>"$DETAILED_LOG" + echo "Status: $status" >>"$DETAILED_LOG" + + if [ $status -ne 0 ]; then + log_message "AT command failed: $cmd (exit code: $status)" "error" + return 1 + fi + + echo "$output" + return 0 +} + +# Function to fetch all modem data at once with a single token +fetch_modem_data() { + local token_id="" + local result=1 + local modem_data="" + + log_message "Fetching all modem data at once" "info" + + # Define commands to execute + local COMMANDS="AT+ICCID AT+CGDCONT? AT+QNWPREFCFG=\"mode_pref\" AT+QNWPREFCFG=\"lte_band\" AT+QNWPREFCFG=\"nsa_nr5g_band\" AT+QNWPREFCFG=\"nr5g_band\" AT+CGSN" + + # Get token + token_id=$(acquire_token) + if [ -z "$token_id" ]; then + log_message "Failed to acquire token for fetching modem data" "error" + return 1 + fi + + # Execute each command and combine outputs + for cmd in $COMMANDS; do + log_message "Executing command: $cmd" "debug" + local output=$(execute_at_command "$cmd" 5 "$token_id") + local status=$? + + if [ $status -eq 0 ]; then + # Append to modem_data + modem_data="${modem_data}====COMMAND_START:${cmd}====\n${output}\n====COMMAND_END====\n\n" + else + log_message "Command failed: $cmd" "warn" + fi + done + + # Release token + release_token "$token_id" + + if [ -n "$modem_data" ]; then + # Save output to DETAILED_LOG for debugging + echo -e "MODEM DATA:\n$modem_data" >>"$DETAILED_LOG" + echo "$modem_data" + return 0 + else + log_message "No modem data fetched" "error" + return 1 + fi +} + +# Function to extract ICCID from modem data +extract_iccid() { + local modem_data="$1" + local iccid="" + + # Extract section containing ICCID command response + local iccid_section=$(echo -e "$modem_data" | sed -n '/====COMMAND_START:AT+ICCID====/,/====COMMAND_END====/p') + + # Try to extract ICCID (look for 10-20 digit number) + iccid=$(echo "$iccid_section" | grep -o '[0-9]\{10,20\}' | head -n 1) + + if [ -z "$iccid" ]; then + log_message "Failed to extract ICCID from modem data" "error" + return 1 + fi + + log_message "Extracted ICCID: $iccid" "info" + echo "$iccid" + return 0 +} + +# Function to extract APN from modem data +extract_apn() { + local modem_data="$1" + local apn="" + + # Extract section containing CGDCONT command response + local apn_section=$(echo -e "$modem_data" | sed -n '/====COMMAND_START:AT+CGDCONT?====/,/====COMMAND_END====/p') + + # Try to extract APN from the response - look for context 1 + apn=$(echo "$apn_section" | grep -o '+CGDCONT: 1,[^,]*,"[^"]*"' | cut -d'"' -f2) + + if [ -z "$apn" ]; then + # Try alternative pattern + apn=$(echo "$apn_section" | grep -o '+CGDCONT: 1,[^,]*,[^,]*' | cut -d',' -f3 | tr -d '"') + + if [ -z "$apn" ]; then + log_message "Failed to extract APN from modem data" "error" + return 1 + fi + fi + + log_message "Extracted APN: $apn" "info" + echo "$apn" + return 0 +} + +# Function to extract network mode from modem data +extract_network_mode() { + local modem_data="$1" + local mode="" + + # Extract section containing mode_pref command response + local mode_section=$(echo -e "$modem_data" | sed -n '/====COMMAND_START:AT+QNWPREFCFG="mode_pref"====/,/====COMMAND_END====/p') + + # Try to extract mode from the response + mode=$(echo "$mode_section" | grep -o '+QNWPREFCFG:.*' | cut -d'"' -f3) + + if [ -z "$mode" ]; then + log_message "Failed to extract network mode from modem data" "error" + return 1 + fi + + # Clean up the value - remove leading comma if present + mode=$(echo "$mode" | sed 's/^,//') + + log_message "Extracted network mode: $mode" "info" + echo "$mode" + return 0 +} + +# Function to extract LTE bands from modem data +extract_lte_bands() { + local modem_data="$1" + local bands="" + + # Extract section containing lte_band command response + local bands_section=$(echo -e "$modem_data" | sed -n '/====COMMAND_START:AT+QNWPREFCFG="lte_band"====/,/====COMMAND_END====/p') + + # Try to extract bands from the response + bands=$(echo "$bands_section" | grep -o '+QNWPREFCFG:.*' | cut -d'"' -f3) + + if [ -z "$bands" ]; then + log_message "Failed to extract LTE bands from modem data" "error" + return 1 + fi + + # Convert colon-separated to comma-separated and remove leading comma if present + bands=$(echo "$bands" | tr ':' ',' | sed 's/^,//') + + log_message "Extracted LTE bands: $bands" "info" + echo "$bands" + return 0 +} + +# Updated: Function to extract both SA and NSA NR5G bands from modem data +extract_nr5g_bands() { + local modem_data="$1" + local bands_type="$2" # "sa" or "nsa" + + local section_type="" + if [ "$bands_type" = "sa" ]; then + section_type="nr5g_band" + else + section_type="nsa_nr5g_band" + fi + + # Extract sections containing NR5G band command responses + local bands_section=$(echo -e "$modem_data" | sed -n "/====COMMAND_START:AT+QNWPREFCFG=\"$section_type\"====/,/====COMMAND_END====/p") + + # Try to extract bands + local bands=$(echo "$bands_section" | grep -o '+QNWPREFCFG:.*' | cut -d'"' -f3) + + if [ -n "$bands" ]; then + # Clean up the value - convert colon-separated to comma-separated and remove leading comma + bands=$(echo "$bands" | tr ':' ',' | sed 's/^,//') + log_message "Extracted $bands_type NR5G bands: $bands" "info" + echo "$bands" + return 0 + fi + + log_message "Failed to extract $bands_type NR5G bands from modem data" "warn" + return 1 +} + +# Function to extract IMEI from modem data +extract_imei() { + local modem_data="$1" + local imei="" + + # Extract section containing CGSN command response + local imei_section=$(echo -e "$modem_data" | sed -n '/====COMMAND_START:AT+CGSN====/,/====COMMAND_END====/p') + + # Try to extract IMEI (look for 15 digit number) + imei=$(echo "$imei_section" | grep -o '[0-9]\{15\}' | head -n 1) + + if [ -z "$imei" ]; then + log_message "Failed to extract IMEI from modem data" "error" + return 1 + fi + + log_message "Extracted IMEI: $imei" "info" + echo "$imei" + return 0 +} + +# Function to setup TTL configuration persistence +setup_ttl_persistence() { + if [ ! -f "/etc/data/lanUtils.sh" ]; then + log_message "lanUtils.sh not found, TTL changes might not persist across reboots" "warn" + return 1 + fi + + # Backup the original script if not already done + if [ ! -f "/etc/data/lanUtils.sh.bak" ]; then + cp "/etc/data/lanUtils.sh" "/etc/data/lanUtils.sh.bak" + fi + + # Add the local ttl_firewall_file line if it's not already present + if ! grep -q "local ttl_firewall_file" "/etc/data/lanUtils.sh"; then + sed -i '/local tcpmss_firewall_filev6/a \ local ttl_firewall_file=/etc/firewall.user.ttl' "/etc/data/lanUtils.sh" + fi + + # Add the condition to include the ttl_firewall_file if it's not already present + if ! grep -q "if \[ -f \"\$ttl_firewall_file\" \]; then" "/etc/data/lanUtils.sh"; then + sed -i '/if \[ -f "\$tcpmss_firewall_filev6" \]; then/i \ if [ -f "\$ttl_firewall_file" ]; then\n cat \$ttl_firewall_file >> \$firewall_file\n fi' "/etc/data/lanUtils.sh" + fi + + log_message "TTL persistence setup completed" "info" + return 0 +} + +# Function to apply TTL settings +apply_ttl_settings() { + local ttl="$1" + local current_ttl="$2" + local token_id="$3" + local profile_name="$4" + + # If TTL is not set, default to 0 (disabled) + ttl="${ttl:-0}" + current_ttl="${current_ttl:-0}" + + # Check if change is needed + if [ "$ttl" = "$current_ttl" ]; then + log_message "TTL already set to $ttl, no change needed" "debug" + return 0 + fi + + update_track "applying" "Setting TTL from '$current_ttl' to '$ttl'" "$profile_name" "85" + log_message "Changing TTL from '$current_ttl' to '$ttl'" "info" + + # Create TTL file directory if it doesn't exist + mkdir -p /etc + + if [ "$ttl" = "0" ]; then + # Clear existing rules + iptables -t mangle -D POSTROUTING -o rmnet+ -j TTL --ttl-set "$current_ttl" 2>/dev/null + ip6tables -t mangle -D POSTROUTING -o rmnet+ -j HL --hl-set "$current_ttl" 2>/dev/null + >"/etc/firewall.user.ttl" + log_message "TTL settings cleared" "info" + else + # Clear existing rules + if [ "$current_ttl" != "0" ]; then + iptables -t mangle -D POSTROUTING -o rmnet+ -j TTL --ttl-set "$current_ttl" 2>/dev/null + ip6tables -t mangle -D POSTROUTING -o rmnet+ -j HL --hl-set "$current_ttl" 2>/dev/null + fi + + # Set new rules + echo "iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set $ttl" >"/etc/firewall.user.ttl" + echo "ip6tables -t mangle -A POSTROUTING -o rmnet+ -j HL --hl-set $ttl" >>"/etc/firewall.user.ttl" + + # Apply the rules + iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set "$ttl" + ip6tables -t mangle -A POSTROUTING -o rmnet+ -j HL --hl-set "$ttl" + + log_message "TTL changed successfully to $ttl" "info" + fi + + # Setup persistence + setup_ttl_persistence + + return 0 +} + +# Function to get current TTL value +get_current_ttl() { + local current_ttl=0 + + if [ -f "/etc/firewall.user.ttl" ]; then + current_ttl=$(grep 'iptables -t mangle -A POSTROUTING' "/etc/firewall.user.ttl" | awk '{for(i=1;i<=NF;i++){if($i=="--ttl-set"){print $(i+1)}}}') + if ! [[ "$current_ttl" =~ ^[0-9]+$ ]]; then + current_ttl=0 + fi + fi + + log_message "Current TTL value: $current_ttl" "debug" + echo "$current_ttl" + return 0 +} + +# Updated function to apply profile settings with separate SA/NSA NR5G bands and TTL support +apply_profile_settings() { + local profile_name="$1" + local network_type="$2" + local lte_bands="$3" + local sa_nr5g_bands="$4" + local nsa_nr5g_bands="$5" + local apn="$6" + local pdp_type="$7" + local imei="$8" + local ttl="$9" + local current_apn="${10}" + local current_mode="${11}" + local current_lte_bands="${12}" + local current_sa_nr5g_bands="${13}" + local current_nsa_nr5g_bands="${14}" + local current_imei="${15}" + local iccid="${16}" + + # Set TTL to 0 (disabled) if not specified + ttl="${ttl:-0}" + + log_message "Applying profile '$profile_name' with settings:" "info" + log_message "- Network type: $network_type" "info" + log_message "- LTE bands: $lte_bands" "info" + log_message "- SA NR5G bands: $sa_nr5g_bands" "info" + log_message "- NSA NR5G bands: $nsa_nr5g_bands" "info" + log_message "- APN: $apn ($pdp_type)" "info" + log_message "- IMEI: $imei" "info" + log_message "- TTL: $ttl" "info" + + # Check if any changes are needed using improved comparison + local needs_apn_change=0 + local needs_mode_change=0 + local needs_lte_bands_change=0 + local needs_sa_nr5g_bands_change=0 + local needs_nsa_nr5g_bands_change=0 + local needs_imei_change=0 + local needs_ttl_change=0 + local changes_needed=0 + local requires_reboot=0 + + # Use normalized comparison + compare_values "$current_apn" "$apn" "apn" && needs_apn_change=1 && changes_needed=1 + compare_values "$current_mode" "$network_type" "mode" && needs_mode_change=1 && changes_needed=1 + compare_values "$current_lte_bands" "$lte_bands" "bands" && needs_lte_bands_change=1 && changes_needed=1 + compare_values "$current_sa_nr5g_bands" "$sa_nr5g_bands" "bands" && needs_sa_nr5g_bands_change=1 && changes_needed=1 + compare_values "$current_nsa_nr5g_bands" "$nsa_nr5g_bands" "bands" && needs_nsa_nr5g_bands_change=1 && changes_needed=1 + + # Get current TTL value + local current_ttl=$(get_current_ttl) + + # Compare TTL values + if [ "$current_ttl" != "$ttl" ]; then + needs_ttl_change=1 + changes_needed=1 + fi + + # IMEI is a special case - only change if explicitly specified + if [ -n "$imei" ]; then + compare_values "$current_imei" "$imei" "imei" && needs_imei_change=1 && changes_needed=1 && requires_reboot=1 + fi + + if [ $changes_needed -eq 0 ]; then + log_message "No changes needed for profile '$profile_name', settings already correct" "info" + mark_profile_applied "$iccid" "$profile_name" + update_track "success" "Profile already correctly applied" "$profile_name" "100" + return 0 + fi + + # Get token for applying settings + local token_id=$(acquire_token) + if [ -z "$token_id" ]; then + log_message "Failed to acquire token for applying profile settings" "error" + update_track "error" "Failed to acquire token" "$profile_name" "0" + return 1 + fi + + local apply_success=1 + local changes_made=0 + + # Apply APN change first (most important) + if [ $needs_apn_change -eq 1 ]; then + update_track "applying" "Setting APN from '$current_apn' to '$apn'" "$profile_name" "20" + log_message "Changing APN from '$current_apn' to '$apn' ($pdp_type)" "info" + + # Set APN using AT command + local apn_cmd="AT+CGDCONT=1,\"$pdp_type\",\"$apn\"" + local output=$(execute_at_command "$apn_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + log_message "APN changed successfully to $apn ($pdp_type)" "info" + + # Verify APN setting - fetch APN again to confirm + local verify_output=$(execute_at_command "AT+CGDCONT?" 5 "$token_id") + if echo "$verify_output" | grep -q "\"$apn\""; then + log_message "APN change verified successfully" "info" + update_track "applying" "APN set successfully" "$profile_name" "30" + else + log_message "APN change could not be verified, continuing anyway" "warn" + fi + else + log_message "Failed to change APN to $apn" "error" + update_track "error" "Failed to set APN" "$profile_name" "20" + apply_success=0 + fi + fi + + # Apply network mode change + if [ $needs_mode_change -eq 1 ] && [ $apply_success -eq 1 ]; then + update_track "applying" "Setting network mode from '$current_mode' to '$network_type'" "$profile_name" "40" + log_message "Changing network mode from '$current_mode' to '$network_type'" "info" + + # Format network mode for AT command (may already be in correct format) + local mode_cmd="AT+QNWPREFCFG=\"mode_pref\",$network_type" + local output=$(execute_at_command "$mode_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + log_message "Network mode changed successfully to $network_type" "info" + update_track "applying" "Network mode set successfully" "$profile_name" "50" + + # If mode includes NR5G, ensure it's enabled + if echo "$network_type" | grep -q "NR5G"; then + log_message "Ensuring NR5G is enabled" "debug" + local nr5g_cmd="AT+QNWPREFCFG=\"nr5g_disable_mode\",0" + execute_at_command "$nr5g_cmd" 5 "$token_id" + fi + else + log_message "Failed to change network mode to $network_type" "error" + update_track "applying" "Failed to set network mode, continuing" "$profile_name" "45" + fi + fi + + # Apply LTE bands change + if [ $needs_lte_bands_change -eq 1 ] && [ $apply_success -eq 1 ] && [ -n "$lte_bands" ]; then + update_track "applying" "Setting LTE bands from '$current_lte_bands' to '$lte_bands'" "$profile_name" "60" + log_message "Changing LTE bands from '$current_lte_bands' to '$lte_bands'" "info" + + # Convert comma-separated to colon-separated for AT command + local bands_formatted=$(echo "$lte_bands" | tr ',' ':') + local bands_cmd="AT+QNWPREFCFG=\"lte_band\",$bands_formatted" + local output=$(execute_at_command "$bands_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + log_message "LTE bands changed successfully to $lte_bands" "info" + update_track "applying" "LTE bands set successfully" "$profile_name" "70" + else + log_message "Failed to change LTE bands to $lte_bands" "error" + update_track "applying" "Failed to set LTE bands, continuing" "$profile_name" "65" + fi + fi + + # Apply NSA NR5G bands change + if [ $needs_nsa_nr5g_bands_change -eq 1 ] && [ $apply_success -eq 1 ] && [ -n "$nsa_nr5g_bands" ]; then + update_track "applying" "Setting NSA NR5G bands from '$current_nsa_nr5g_bands' to '$nsa_nr5g_bands'" "$profile_name" "75" + log_message "Changing NSA NR5G bands from '$current_nsa_nr5g_bands' to '$nsa_nr5g_bands'" "info" + + # Convert comma-separated to colon-separated for AT command + local bands_formatted=$(echo "$nsa_nr5g_bands" | tr ',' ':') + local nsa_cmd="AT+QNWPREFCFG=\"nsa_nr5g_band\",$bands_formatted" + local output=$(execute_at_command "$nsa_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + log_message "NSA NR5G bands changed successfully to $nsa_nr5g_bands" "info" + update_track "applying" "NSA NR5G bands set successfully" "$profile_name" "80" + else + log_message "Failed to change NSA NR5G bands to $nsa_nr5g_bands" "error" + update_track "applying" "Failed to set NSA NR5G bands, continuing" "$profile_name" "75" + fi + fi + + # Apply SA NR5G bands change + if [ $needs_sa_nr5g_bands_change -eq 1 ] && [ $apply_success -eq 1 ] && [ -n "$sa_nr5g_bands" ]; then + update_track "applying" "Setting SA NR5G bands from '$current_sa_nr5g_bands' to '$sa_nr5g_bands'" "$profile_name" "85" + log_message "Changing SA NR5G bands from '$current_sa_nr5g_bands' to '$sa_nr5g_bands'" "info" + + # Convert comma-separated to colon-separated for AT command + local bands_formatted=$(echo "$sa_nr5g_bands" | tr ',' ':') + local sa_cmd="AT+QNWPREFCFG=\"nr5g_band\",$bands_formatted" + local output=$(execute_at_command "$sa_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + log_message "SA NR5G bands changed successfully to $sa_nr5g_bands" "info" + update_track "applying" "SA NR5G bands set successfully" "$profile_name" "90" + else + log_message "Failed to change SA NR5G bands to $sa_nr5g_bands" "error" + update_track "applying" "Failed to set SA NR5G bands, continuing" "$profile_name" "85" + fi + fi + + # Apply TTL change if needed + if [ $needs_ttl_change -eq 1 ] && [ $apply_success -eq 1 ]; then + apply_ttl_settings "$ttl" "$current_ttl" "$token_id" "$profile_name" + if [ $? -eq 0 ]; then + changes_made=1 + log_message "TTL settings applied successfully" "info" + fi + fi + + # Apply IMEI change (requires reboot) + if [ $needs_imei_change -eq 1 ] && [ $apply_success -eq 1 ] && [ -n "$imei" ]; then + update_track "applying" "Setting IMEI from '$current_imei' to '$imei'" "$profile_name" "95" + log_message "Changing IMEI from '$current_imei' to '$imei'" "info" + + local imei_cmd="AT+EGMR=1,7,\"$imei\"" + local output=$(execute_at_command "$imei_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + requires_reboot=1 + log_message "IMEI changed successfully to $imei (device will reboot)" "info" + update_track "rebooting" "IMEI changed, device will reboot" "$profile_name" "95" + else + log_message "Failed to change IMEI to $imei" "error" + update_track "applying" "Failed to set IMEI, continuing" "$profile_name" "90" + requires_reboot=0 + fi + fi + + # Release token + release_token "$token_id" + + # Mark profile as applied if changes were made + if [ $changes_made -eq 1 ]; then + mark_profile_applied "$iccid" "$profile_name" + fi + + # If IMEI was changed, need to reboot + if [ $requires_reboot -eq 1 ]; then + log_message "IMEI change requires reboot, scheduling reboot..." "info" + update_track "rebooting" "Device is rebooting to apply IMEI change" "$profile_name" "100" + sleep 2 + reboot & + return 0 + fi + + # Force network reset if changes were made but no reboot required + if [ $changes_made -eq 1 ] && [ $requires_reboot -eq 0 ]; then + log_message "Changes applied, resetting network connection to apply changes" "info" + update_track "applying" "Resetting network connection" "$profile_name" "95" + + # Get a new token for network reset + token_id=$(acquire_token) + if [ -n "$token_id" ]; then + # Force PDP context reconnection - note: errors here are common and non-fatal + log_message "Forcing network reconnection" "info" + execute_at_command "AT+COPS=2" 5 "$token_id" || true + sleep 2 + execute_at_command "AT+COPS=0" 5 "$token_id" || true + sleep 1 + + # Release token + release_token "$token_id" + fi + fi + + # Check if any changes were made + if [ $changes_made -eq 0 ]; then + log_message "Profile '$profile_name' already applied correctly, no changes needed" "info" + update_track "success" "Profile already correctly applied" "$profile_name" "100" + else + log_message "Successfully applied profile '$profile_name'" "info" + update_track "success" "Profile applied successfully" "$profile_name" "100" + fi + + return 0 +} + +# Check profile function with updated SA/NSA bands and TTL support +check_profile() { + local forced="${1:-0}" + + log_message "Performing profile check (forced=$forced)" "info" + + # Get all modem data at once with a single token + local modem_data="" + modem_data=$(fetch_modem_data) + if [ $? -ne 0 ]; then + log_message "Failed to fetch modem data, will retry later" "error" + update_track "error" "Could not communicate with modem. Will retry later." "unknown" "0" + return 1 + fi + + # Extract ICCID from modem data + local current_iccid="" + current_iccid=$(extract_iccid "$modem_data") + if [ $? -ne 0 ]; then + log_message "Failed to extract ICCID from modem data, will retry later" "error" + update_track "error" "Could not detect SIM card. Please check that a SIM is inserted." "unknown" "0" + return 1 + fi + + log_message "Current ICCID: $current_iccid" "info" + + # Find profile for current ICCID + local profile_index="" + profile_index=$(find_profile_by_iccid "$current_iccid") + local profile_result=$? + + # CRITICAL FIX: Early return if no profile is found + if [ $profile_result -ne 0 ]; then + log_message "No profile found for ICCID $current_iccid, nothing to apply" "info" + update_track "idle" "No profile exists for current SIM card. Create a profile to configure network settings." "$current_iccid" "0" + return 0 + fi + + # Only continue if we found a valid profile + log_message "Found valid profile index: $profile_index" "debug" + + # Get profile details + local profile_name=$(uci -q get quecprofiles.$profile_index.name) + local network_type=$(uci -q get quecprofiles.$profile_index.network_type) + local lte_bands=$(uci -q get quecprofiles.$profile_index.lte_bands) + local sa_nr5g_bands=$(uci -q get quecprofiles.$profile_index.sa_nr5g_bands) + local nsa_nr5g_bands=$(uci -q get quecprofiles.$profile_index.nsa_nr5g_bands) + local apn=$(uci -q get quecprofiles.$profile_index.apn) + local pdp_type=$(uci -q get quecprofiles.$profile_index.pdp_type) + local imei=$(uci -q get quecprofiles.$profile_index.imei) + local ttl=$(uci -q get quecprofiles.$profile_index.ttl) + + # Default pdp_type to "IP" if not specified + pdp_type="${pdp_type:-IP}" + # Default TTL to 0 (disabled) if not specified + ttl="${ttl:-0}" + + # For backward compatibility - check if old nr5g_bands exists but new fields don't + local nr5g_bands=$(uci -q get quecprofiles.$profile_index.nr5g_bands) + if [ -n "$nr5g_bands" ] && [ -z "$sa_nr5g_bands" ] && [ -z "$nsa_nr5g_bands" ]; then + sa_nr5g_bands=$nr5g_bands + nsa_nr5g_bands=$nr5g_bands + log_message "Migrating legacy nr5g_bands for profile $profile_name" "info" + fi + + log_message "Found profile: $profile_name for ICCID: $current_iccid" "info" + log_message "Profile settings: network_type=$network_type, lte_bands=$lte_bands, sa_nr5g_bands=$sa_nr5g_bands, nsa_nr5g_bands=$nsa_nr5g_bands, apn=$apn, pdp_type=$pdp_type, imei=$imei, ttl=$ttl" "info" + + # Check if APN is configured - it's the minimum required setting + if [ -z "$apn" ]; then + log_message "Profile has no APN configured, cannot apply" "error" + update_track "error" "Profile \"$profile_name\" is missing the required APN setting. Please edit the profile and add an APN." "$profile_name" "0" + return 1 + fi + + # Check if profile is already applied (unless forced) + if [ "$forced" != "1" ] && is_profile_applied "$current_iccid" "$profile_name"; then + log_message "Profile '$profile_name' is already applied, skipping" "info" + update_track "success" "Profile already applied (from flag)" "$profile_name" "100" + return 0 + fi + + # Apply profile if forced or if autoswitch is enabled + local enable_autoswitch + enable_autoswitch=$(uci -q get quecprofiles.settings.enable_autoswitch) + enable_autoswitch="${enable_autoswitch:-1}" # Default to enabled + + if [ "$forced" = "1" ] || [ "$enable_autoswitch" = "1" ]; then + log_message "Applying profile settings..." "info" + update_track "applying" "Applying profile settings" "$profile_name" "10" + + # Extract current modem settings for comparison + local current_apn="" + local current_mode="" + local current_lte_bands="" + local current_sa_nr5g_bands="" + local current_nsa_nr5g_bands="" + local current_imei="" + + current_apn=$(extract_apn "$modem_data") + current_mode=$(extract_network_mode "$modem_data") + current_lte_bands=$(extract_lte_bands "$modem_data") + current_sa_nr5g_bands=$(extract_nr5g_bands "$modem_data" "sa") + current_nsa_nr5g_bands=$(extract_nr5g_bands "$modem_data" "nsa") + current_imei=$(extract_imei "$modem_data") + + # Apply profile settings with the new parameters + apply_profile_settings "$profile_name" "$network_type" "$lte_bands" "$sa_nr5g_bands" "$nsa_nr5g_bands" \ + "$apn" "$pdp_type" "$imei" "$ttl" "$current_apn" "$current_mode" "$current_lte_bands" \ + "$current_sa_nr5g_bands" "$current_nsa_nr5g_bands" "$current_imei" "$current_iccid" + return $? + else + log_message "Automatic profile switching is disabled, not applying profile" "info" + update_track "idle" "Automatic profile switching is disabled" "$profile_name" "0" + return 0 + fi +} + +# Main function +main() { + log_message "QuecProfiles daemon starting with SA/NSA NR5G and TTL support (PID: $$)" "info" + + # Clear status files at startup + rm -f "$TRACK_FILE" "$CHECK_TRIGGER" + update_track "idle" "Daemon started" "none" "0" + + # Get check interval from UCI + local check_interval + check_interval=$(uci -q get quecprofiles.settings.check_interval) + check_interval="${check_interval:-$DEFAULT_CHECK_INTERVAL}" + + # Check autoswitch setting + local enable_autoswitch + enable_autoswitch=$(uci -q get quecprofiles.settings.enable_autoswitch) + enable_autoswitch="${enable_autoswitch:-1}" # Default to enabled + + log_message "Daemon configured with check_interval=$check_interval seconds, enable_autoswitch=$enable_autoswitch" "info" + + # Add a startup delay + log_message "Waiting 10 seconds before initial check..." "info" + sleep 10 + + # Main loop + while true; do + # Check if there's a manual check request + if [ -f "$CHECK_TRIGGER" ]; then + log_message "Manual check triggered" "info" + rm -f "$CHECK_TRIGGER" + check_profile 1 # Forced check + elif [ "$enable_autoswitch" -eq 1 ]; then + # Perform regular check + check_profile 0 # Regular check + else + log_message "Automatic profile switching is disabled" "info" + update_track "idle" "Automatic profile switching is disabled" "none" "0" + fi + + # Sleep for the check interval + log_message "Sleeping for $check_interval seconds" "info" + + # Break the sleep into smaller intervals to check for triggers + sleep_counter=0 + while [ $sleep_counter -lt $check_interval ]; do + sleep 5 + sleep_counter=$((sleep_counter + 5)) + + # Check for manual trigger during sleep + if [ -f "$CHECK_TRIGGER" ]; then + log_message "Manual check triggered during sleep" "info" + break + fi + done + done +} + +# Set up trap handlers for clean shutdown +trap 'log_message "Received SIGTERM, exiting"; update_track "idle" "Daemon stopped" "none" "0"; exit 0' TERM +trap 'log_message "Received SIGINT, exiting"; update_track "idle" "Daemon stopped" "none" "0"; exit 0' INT + +# Start the main function +main \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quecprofile.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quecprofile.sh new file mode 100644 index 0000000..90bf2e6 --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quecprofile.sh @@ -0,0 +1,1045 @@ +#!/bin/sh +# Updated QuecProfiles daemon with enhanced SA/NSA NR5G band management and TTL support +# Including profile application functions and fixed comparison logic + +# Configuration +QUEUE_DIR="/tmp/at_queue" +TOKEN_FILE="$QUEUE_DIR/token" +TRACK_FILE="/tmp/quecprofiles_active" +CHECK_TRIGGER="/tmp/quecprofiles_check" +STATUS_FILE="/tmp/quecprofiles_status.json" +APPLIED_FLAG="/tmp/quecprofiles_applied" +DEBUG_LOG="/tmp/quecprofiles_debug.log" +DETAILED_LOG="/tmp/quecprofiles_detailed.log" +DEFAULT_CHECK_INTERVAL=60 # Default check interval in seconds +COMMAND_TIMEOUT=10 # Default timeout for AT commands in seconds +QUEUE_PRIORITY=3 # Medium-high priority (1 is highest for cell scan) +MAX_TOKEN_WAIT=15 # Maximum seconds to wait for token acquisition + +# Initialize log file +echo "$(date) - Starting QuecProfiles daemon with SA/NSA NR5G and TTL support (PID: $$)" >"$DEBUG_LOG" +echo "$(date) - Starting QuecProfiles daemon with SA/NSA NR5G and TTL support (PID: $$)" >"$DETAILED_LOG" +chmod 644 "$DEBUG_LOG" "$DETAILED_LOG" + +# Function to log messages +log_message() { + local message="$1" + local level="${2:-info}" + local timestamp=$(date "+%Y-%m-%d %H:%M:%S") + + # Log to system log + logger -t quecprofiles_daemon -p "daemon.$level" "$message" + + # Log to debug file + echo "[$timestamp] [$level] $message" >>"$DEBUG_LOG" + + # For detailed logs or errors + if [ "$level" = "error" ] || [ "$level" = "debug" ]; then + echo "[$timestamp] [$level] $message" >>"$DETAILED_LOG" + fi +} + +# Function to update track file with status - IMPROVED VERSION +update_track() { + local status="$1" + local message="$2" + local profile="${3:-unknown}" + local progress="${4:-0}" + + # Create JSON status + cat >"$STATUS_FILE" <"$TRACK_FILE" + chmod 644 "$TRACK_FILE" + fi + + log_message "Status updated: $status - $message ($progress%)" +} + +# Function to find profile by ICCID in UCI +find_profile_by_iccid() { + local iccid="$1" + local profile_indices + + log_message "Looking for profile with ICCID: $iccid" "info" + + # Get all profile indices + profile_indices=$(uci show quecprofiles | grep -o '@profile\[[0-9]\+\]' | sort -u) + + # Exit early if no profiles found + if [ -z "$profile_indices" ]; then + log_message "No profiles configured in the system" "info" + return 1 + fi + + for profile_index in $profile_indices; do + local current_iccid=$(uci -q get quecprofiles.$profile_index.iccid) + if [ "$current_iccid" = "$iccid" ]; then + log_message "Found matching profile: $profile_index" "info" + echo "$profile_index" + return 0 + fi + done + + log_message "No matching profile found for ICCID: $iccid" "info" + return 1 +} + +# Function to normalize and compare values - handles format differences +compare_values() { + local current="$1" + local desired="$2" + local type="$3" + + # Skip empty values + if [ -z "$desired" ]; then + log_message "Desired value for $type is empty, skipping comparison" "debug" + return 1 # No change needed + fi + + # Normalize values for comparison + local norm_current + local norm_desired + + # Different normalization based on type + case "$type" in + "apn") + # APN comparison is case-insensitive + norm_current=$(echo "$current" | tr '[:upper:]' '[:lower:]') + norm_desired=$(echo "$desired" | tr '[:upper:]' '[:lower:]') + ;; + "mode") + # Network mode - normalize format and sort parts + norm_current=$(echo "$current" | tr '[:upper:]' '[:lower:]' | tr ':' ',' | tr -d ' ' | tr ',' '\n' | sort | tr '\n' ',' | sed 's/,$//') + norm_desired=$(echo "$desired" | tr '[:upper:]' '[:lower:]' | tr ':' ',' | tr -d ' ' | tr ',' '\n' | sort | tr '\n' ',' | sed 's/,$//') + ;; + "bands") + # Bands - sort numbers for consistent comparison + norm_current=$(echo "$current" | tr ',' '\n' | sort -n | tr '\n' ',' | sed 's/,$//') + norm_desired=$(echo "$desired" | tr ',' '\n' | sort -n | tr '\n' ',' | sed 's/,$//') + ;; + *) + # Default comparison + norm_current="$current" + norm_desired="$desired" + ;; + esac + + log_message "Comparing $type - Current: '$norm_current', Desired: '$norm_desired'" "debug" + + # Check if values are equivalent after normalization + if [ "$norm_current" = "$norm_desired" ]; then + log_message "$type values match after normalization" "debug" + return 1 # No change needed + else + log_message "$type values differ after normalization - change needed" "debug" + return 0 # Change needed + fi +} + +# Function to check if profile is already applied +is_profile_applied() { + local iccid="$1" + local profile_name="$2" + + # Check if applied flag exists and matches current profile + if [ -f "$APPLIED_FLAG" ]; then + local applied_data=$(cat "$APPLIED_FLAG" 2>/dev/null) + local applied_iccid=$(echo "$applied_data" | cut -d':' -f1) + local applied_name=$(echo "$applied_data" | cut -d':' -f2) + local applied_time=$(echo "$applied_data" | cut -d':' -f3) + + # Check if the applied profile matches current one + if [ "$applied_iccid" = "$iccid" ] && [ "$applied_name" = "$profile_name" ]; then + log_message "Profile '$profile_name' already applied at $(date -d @$applied_time)" "info" + return 0 # Profile already applied + fi + fi + + # No matching applied profile found + return 1 +} + +# Function to mark profile as applied +mark_profile_applied() { + local iccid="$1" + local profile_name="$2" + + # Save profile application data + echo "$iccid:$profile_name:$(date +%s)" >"$APPLIED_FLAG" + chmod 644 "$APPLIED_FLAG" + log_message "Marked profile '$profile_name' as applied for ICCID $iccid" "info" +} + +# Enhanced JSON string escaping function +escape_json() { + printf '%s' "$1" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g' | tr -d '\n' | sed 's/\r//g' +} + +# Function to acquire token directly with retries +acquire_token() { + local lock_id="QUECPROFILES_$(date +%s)_$$" + local priority="$QUEUE_PRIORITY" + local max_attempts=$MAX_TOKEN_WAIT + local attempt=0 + + log_message "Attempting to acquire AT queue token with priority $priority" "debug" + + while [ $attempt -lt $max_attempts ]; do + # Check if token file exists + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + local current_priority=$(cat "$TOKEN_FILE" | jsonfilter -e '@.priority' 2>/dev/null) + local timestamp=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp' 2>/dev/null) + local current_time=$(date +%s) + + # Check for expired token (> 30 seconds old) + if [ $((current_time - timestamp)) -gt 30 ] || [ -z "$current_holder" ]; then + # Remove expired token + log_message "Found expired token from $current_holder, removing" "debug" + rm -f "$TOKEN_FILE" 2>/dev/null + elif [ $priority -lt $current_priority ]; then + # Preempt lower priority token + log_message "Preempting token from $current_holder (priority: $current_priority)" "debug" + rm -f "$TOKEN_FILE" 2>/dev/null + else + # Try again - higher priority token exists + log_message "Token held by $current_holder with priority $current_priority, retrying..." "debug" + sleep 0.5 + attempt=$((attempt + 1)) + continue + fi + fi + + # Try to create token file + echo "{\"id\":\"$lock_id\",\"priority\":$priority,\"timestamp\":$(date +%s)}" >"$TOKEN_FILE" 2>/dev/null + chmod 644 "$TOKEN_FILE" 2>/dev/null + + # Verify we got the token + local holder=$(cat "$TOKEN_FILE" 2>/dev/null | jsonfilter -e '@.id' 2>/dev/null) + if [ "$holder" = "$lock_id" ]; then + log_message "Successfully acquired token with ID $lock_id" "debug" + echo "$lock_id" + return 0 + fi + + sleep 0.5 + attempt=$((attempt + 1)) + done + + log_message "Failed to acquire token after $max_attempts attempts" "error" + return 1 +} + +# Function to release token +release_token() { + local lock_id="$1" + + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + if [ "$current_holder" = "$lock_id" ]; then + rm -f "$TOKEN_FILE" 2>/dev/null + log_message "Released token $lock_id" "debug" + return 0 + fi + log_message "Token held by $current_holder, not by us ($lock_id)" "warn" + else + log_message "Token file doesn't exist, nothing to release" "debug" + fi + return 1 +} + +# Function to execute AT command with proper error handling +execute_at_command() { + local cmd="$1" + local timeout="${2:-$COMMAND_TIMEOUT}" + local token_id="$3" + + if [ -z "$token_id" ]; then + log_message "No valid token provided for command: $cmd" "error" + return 1 + fi + + log_message "Executing AT command: $cmd (timeout: ${timeout}s)" "debug" + + # Execute the command with proper timeout + local output="" + local status=1 + + # Check if sms_tool exists + if which sms_tool >/dev/null 2>&1; then + output=$(sms_tool at "$cmd" -t "$timeout" 2>&1) + status=$? + log_message "AT command executed, status: $status" "debug" + else + log_message "sms_tool not found, cannot execute AT command" "error" + return 1 + fi + + # Log command output for debugging + echo "Command: $cmd" >>"$DETAILED_LOG" + echo "Output: $output" >>"$DETAILED_LOG" + echo "Status: $status" >>"$DETAILED_LOG" + + if [ $status -ne 0 ]; then + log_message "AT command failed: $cmd (exit code: $status)" "error" + return 1 + fi + + echo "$output" + return 0 +} + +# Function to fetch all modem data at once with a single token +fetch_modem_data() { + local token_id="" + local result=1 + local modem_data="" + + log_message "Fetching all modem data at once" "info" + + # Define commands to execute + local COMMANDS="AT+ICCID AT+CGDCONT? AT+QNWPREFCFG=\"mode_pref\" AT+QNWPREFCFG=\"lte_band\" AT+QNWPREFCFG=\"nsa_nr5g_band\" AT+QNWPREFCFG=\"nr5g_band\" AT+CGSN" + + # Get token + token_id=$(acquire_token) + if [ -z "$token_id" ]; then + log_message "Failed to acquire token for fetching modem data" "error" + return 1 + fi + + # Execute each command and combine outputs + for cmd in $COMMANDS; do + log_message "Executing command: $cmd" "debug" + local output=$(execute_at_command "$cmd" 5 "$token_id") + local status=$? + + if [ $status -eq 0 ]; then + # Append to modem_data + modem_data="${modem_data}====COMMAND_START:${cmd}====\n${output}\n====COMMAND_END====\n\n" + else + log_message "Command failed: $cmd" "warn" + fi + done + + # Release token + release_token "$token_id" + + if [ -n "$modem_data" ]; then + # Save output to DETAILED_LOG for debugging + echo -e "MODEM DATA:\n$modem_data" >>"$DETAILED_LOG" + echo "$modem_data" + return 0 + else + log_message "No modem data fetched" "error" + return 1 + fi +} + +# Function to extract ICCID from modem data +extract_iccid() { + local modem_data="$1" + local iccid="" + + # Extract section containing ICCID command response + local iccid_section=$(echo -e "$modem_data" | sed -n '/====COMMAND_START:AT+ICCID====/,/====COMMAND_END====/p') + + # Try to extract ICCID (look for 10-20 digit number) + iccid=$(echo "$iccid_section" | grep -o '[0-9]\{10,20\}' | head -n 1) + + if [ -z "$iccid" ]; then + log_message "Failed to extract ICCID from modem data" "error" + return 1 + fi + + log_message "Extracted ICCID: $iccid" "info" + echo "$iccid" + return 0 +} + +# Function to extract APN from modem data +extract_apn() { + local modem_data="$1" + local apn="" + + # Extract section containing CGDCONT command response + local apn_section=$(echo -e "$modem_data" | sed -n '/====COMMAND_START:AT+CGDCONT?====/,/====COMMAND_END====/p') + + # Try to extract APN from the response - look for context 1 + apn=$(echo "$apn_section" | grep -o '+CGDCONT: 1,[^,]*,"[^"]*"' | cut -d'"' -f2) + + if [ -z "$apn" ]; then + # Try alternative pattern + apn=$(echo "$apn_section" | grep -o '+CGDCONT: 1,[^,]*,[^,]*' | cut -d',' -f3 | tr -d '"') + + if [ -z "$apn" ]; then + log_message "Failed to extract APN from modem data" "error" + return 1 + fi + fi + + log_message "Extracted APN: $apn" "info" + echo "$apn" + return 0 +} + +# Function to extract network mode from modem data +extract_network_mode() { + local modem_data="$1" + local mode="" + + # Extract section containing mode_pref command response + local mode_section=$(echo -e "$modem_data" | sed -n '/====COMMAND_START:AT+QNWPREFCFG="mode_pref"====/,/====COMMAND_END====/p') + + # Try to extract mode from the response + mode=$(echo "$mode_section" | grep -o '+QNWPREFCFG:.*' | cut -d'"' -f3) + + if [ -z "$mode" ]; then + log_message "Failed to extract network mode from modem data" "error" + return 1 + fi + + # Clean up the value - remove leading comma if present + mode=$(echo "$mode" | sed 's/^,//') + + log_message "Extracted network mode: $mode" "info" + echo "$mode" + return 0 +} + +# Function to extract LTE bands from modem data +extract_lte_bands() { + local modem_data="$1" + local bands="" + + # Extract section containing lte_band command response + local bands_section=$(echo -e "$modem_data" | sed -n '/====COMMAND_START:AT+QNWPREFCFG="lte_band"====/,/====COMMAND_END====/p') + + # Try to extract bands from the response + bands=$(echo "$bands_section" | grep -o '+QNWPREFCFG:.*' | cut -d'"' -f3) + + if [ -z "$bands" ]; then + log_message "Failed to extract LTE bands from modem data" "error" + return 1 + fi + + # Convert colon-separated to comma-separated and remove leading comma if present + bands=$(echo "$bands" | tr ':' ',' | sed 's/^,//') + + log_message "Extracted LTE bands: $bands" "info" + echo "$bands" + return 0 +} + +# Updated: Function to extract both SA and NSA NR5G bands from modem data +extract_nr5g_bands() { + local modem_data="$1" + local bands_type="$2" # "sa" or "nsa" + + local section_type="" + if [ "$bands_type" = "sa" ]; then + section_type="nr5g_band" + else + section_type="nsa_nr5g_band" + fi + + # Extract sections containing NR5G band command responses + local bands_section=$(echo -e "$modem_data" | sed -n "/====COMMAND_START:AT+QNWPREFCFG=\"$section_type\"====/,/====COMMAND_END====/p") + + # Try to extract bands + local bands=$(echo "$bands_section" | grep -o '+QNWPREFCFG:.*' | cut -d'"' -f3) + + if [ -n "$bands" ]; then + # Clean up the value - convert colon-separated to comma-separated and remove leading comma + bands=$(echo "$bands" | tr ':' ',' | sed 's/^,//') + log_message "Extracted $bands_type NR5G bands: $bands" "info" + echo "$bands" + return 0 + fi + + log_message "Failed to extract $bands_type NR5G bands from modem data" "warn" + return 1 +} + +# Function to extract IMEI from modem data +extract_imei() { + local modem_data="$1" + local imei="" + + # Extract section containing CGSN command response + local imei_section=$(echo -e "$modem_data" | sed -n '/====COMMAND_START:AT+CGSN====/,/====COMMAND_END====/p') + + # Try to extract IMEI (look for 15 digit number) + imei=$(echo "$imei_section" | grep -o '[0-9]\{15\}' | head -n 1) + + if [ -z "$imei" ]; then + log_message "Failed to extract IMEI from modem data" "error" + return 1 + fi + + log_message "Extracted IMEI: $imei" "info" + echo "$imei" + return 0 +} + +# Function to setup TTL configuration persistence +setup_ttl_persistence() { + if [ ! -f "/etc/data/lanUtils.sh" ]; then + log_message "lanUtils.sh not found, TTL changes might not persist across reboots" "warn" + return 1 + fi + + # Backup the original script if not already done + if [ ! -f "/etc/data/lanUtils.sh.bak" ]; then + cp "/etc/data/lanUtils.sh" "/etc/data/lanUtils.sh.bak" + fi + + # Add the local ttl_firewall_file line if it's not already present + if ! grep -q "local ttl_firewall_file" "/etc/data/lanUtils.sh"; then + sed -i '/local tcpmss_firewall_filev6/a \ local ttl_firewall_file=/etc/firewall.user.ttl' "/etc/data/lanUtils.sh" + fi + + # Add the condition to include the ttl_firewall_file if it's not already present + if ! grep -q "if \[ -f \"\$ttl_firewall_file\" \]; then" "/etc/data/lanUtils.sh"; then + sed -i '/if \[ -f "\$tcpmss_firewall_filev6" \]; then/i \ if [ -f "\$ttl_firewall_file" ]; then\n cat \$ttl_firewall_file >> \$firewall_file\n fi' "/etc/data/lanUtils.sh" + fi + + log_message "TTL persistence setup completed" "info" + return 0 +} + +# Function to apply TTL settings +apply_ttl_settings() { + local ttl="$1" + local current_ttl="$2" + local token_id="$3" + local profile_name="$4" + + # If TTL is not set, default to 0 (disabled) + ttl="${ttl:-0}" + current_ttl="${current_ttl:-0}" + + # Check if change is needed + if [ "$ttl" = "$current_ttl" ]; then + log_message "TTL already set to $ttl, no change needed" "debug" + return 0 + fi + + update_track "applying" "Setting TTL from '$current_ttl' to '$ttl'" "$profile_name" "85" + log_message "Changing TTL from '$current_ttl' to '$ttl'" "info" + + # Create TTL file directory if it doesn't exist + mkdir -p /etc + + if [ "$ttl" = "0" ]; then + # Clear existing rules + iptables -t mangle -D POSTROUTING -o rmnet+ -j TTL --ttl-set "$current_ttl" 2>/dev/null + ip6tables -t mangle -D POSTROUTING -o rmnet+ -j HL --hl-set "$current_ttl" 2>/dev/null + >"/etc/firewall.user.ttl" + log_message "TTL settings cleared" "info" + else + # Clear existing rules + if [ "$current_ttl" != "0" ]; then + iptables -t mangle -D POSTROUTING -o rmnet+ -j TTL --ttl-set "$current_ttl" 2>/dev/null + ip6tables -t mangle -D POSTROUTING -o rmnet+ -j HL --hl-set "$current_ttl" 2>/dev/null + fi + + # Set new rules + echo "iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set $ttl" >"/etc/firewall.user.ttl" + echo "ip6tables -t mangle -A POSTROUTING -o rmnet+ -j HL --hl-set $ttl" >>"/etc/firewall.user.ttl" + + # Apply the rules + iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set "$ttl" + ip6tables -t mangle -A POSTROUTING -o rmnet+ -j HL --hl-set "$ttl" + + log_message "TTL changed successfully to $ttl" "info" + fi + + # Setup persistence + setup_ttl_persistence + + return 0 +} + +# Function to get current TTL value +get_current_ttl() { + local current_ttl=0 + + if [ -f "/etc/firewall.user.ttl" ]; then + current_ttl=$(grep 'iptables -t mangle -A POSTROUTING' "/etc/firewall.user.ttl" | awk '{for(i=1;i<=NF;i++){if($i=="--ttl-set"){print $(i+1)}}}') + if ! [[ "$current_ttl" =~ ^[0-9]+$ ]]; then + current_ttl=0 + fi + fi + + log_message "Current TTL value: $current_ttl" "debug" + echo "$current_ttl" + return 0 +} + +# Updated function to apply profile settings with separate SA/NSA NR5G bands and TTL support +apply_profile_settings() { + local profile_name="$1" + local network_type="$2" + local lte_bands="$3" + local sa_nr5g_bands="$4" + local nsa_nr5g_bands="$5" + local apn="$6" + local pdp_type="$7" + local imei="$8" + local ttl="$9" + local current_apn="${10}" + local current_mode="${11}" + local current_lte_bands="${12}" + local current_sa_nr5g_bands="${13}" + local current_nsa_nr5g_bands="${14}" + local current_imei="${15}" + local iccid="${16}" + + # Set TTL to 0 (disabled) if not specified + ttl="${ttl:-0}" + + log_message "Applying profile '$profile_name' with settings:" "info" + log_message "- Network type: $network_type" "info" + log_message "- LTE bands: $lte_bands" "info" + log_message "- SA NR5G bands: $sa_nr5g_bands" "info" + log_message "- NSA NR5G bands: $nsa_nr5g_bands" "info" + log_message "- APN: $apn ($pdp_type)" "info" + log_message "- IMEI: $imei" "info" + log_message "- TTL: $ttl" "info" + + # Check if any changes are needed using improved comparison + local needs_apn_change=0 + local needs_mode_change=0 + local needs_lte_bands_change=0 + local needs_sa_nr5g_bands_change=0 + local needs_nsa_nr5g_bands_change=0 + local needs_imei_change=0 + local needs_ttl_change=0 + local changes_needed=0 + local requires_reboot=0 + + # Use normalized comparison + compare_values "$current_apn" "$apn" "apn" && needs_apn_change=1 && changes_needed=1 + compare_values "$current_mode" "$network_type" "mode" && needs_mode_change=1 && changes_needed=1 + compare_values "$current_lte_bands" "$lte_bands" "bands" && needs_lte_bands_change=1 && changes_needed=1 + compare_values "$current_sa_nr5g_bands" "$sa_nr5g_bands" "bands" && needs_sa_nr5g_bands_change=1 && changes_needed=1 + compare_values "$current_nsa_nr5g_bands" "$nsa_nr5g_bands" "bands" && needs_nsa_nr5g_bands_change=1 && changes_needed=1 + + # Get current TTL value + local current_ttl=$(get_current_ttl) + + # Compare TTL values + if [ "$current_ttl" != "$ttl" ]; then + needs_ttl_change=1 + changes_needed=1 + fi + + # IMEI is a special case - only change if explicitly specified + if [ -n "$imei" ]; then + compare_values "$current_imei" "$imei" "imei" && needs_imei_change=1 && changes_needed=1 && requires_reboot=1 + fi + + if [ $changes_needed -eq 0 ]; then + log_message "No changes needed for profile '$profile_name', settings already correct" "info" + mark_profile_applied "$iccid" "$profile_name" + update_track "success" "Profile already correctly applied" "$profile_name" "100" + return 0 + fi + + # Get token for applying settings + local token_id=$(acquire_token) + if [ -z "$token_id" ]; then + log_message "Failed to acquire token for applying profile settings" "error" + update_track "error" "Failed to acquire token" "$profile_name" "0" + return 1 + fi + + local apply_success=1 + local changes_made=0 + + # Apply APN change first (most important) + if [ $needs_apn_change -eq 1 ]; then + update_track "applying" "Setting APN from '$current_apn' to '$apn'" "$profile_name" "20" + log_message "Changing APN from '$current_apn' to '$apn' ($pdp_type)" "info" + + # Set APN using AT command + local apn_cmd="AT+CGDCONT=1,\"$pdp_type\",\"$apn\"" + local output=$(execute_at_command "$apn_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + log_message "APN changed successfully to $apn ($pdp_type)" "info" + + # Verify APN setting - fetch APN again to confirm + local verify_output=$(execute_at_command "AT+CGDCONT?" 5 "$token_id") + if echo "$verify_output" | grep -q "\"$apn\""; then + log_message "APN change verified successfully" "info" + update_track "applying" "APN set successfully" "$profile_name" "30" + else + log_message "APN change could not be verified, continuing anyway" "warn" + fi + else + log_message "Failed to change APN to $apn" "error" + update_track "error" "Failed to set APN" "$profile_name" "20" + apply_success=0 + fi + fi + + # Apply network mode change + if [ $needs_mode_change -eq 1 ] && [ $apply_success -eq 1 ]; then + update_track "applying" "Setting network mode from '$current_mode' to '$network_type'" "$profile_name" "40" + log_message "Changing network mode from '$current_mode' to '$network_type'" "info" + + # Format network mode for AT command (may already be in correct format) + local mode_cmd="AT+QNWPREFCFG=\"mode_pref\",$network_type" + local output=$(execute_at_command "$mode_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + log_message "Network mode changed successfully to $network_type" "info" + update_track "applying" "Network mode set successfully" "$profile_name" "50" + + # If mode includes NR5G, ensure it's enabled + if echo "$network_type" | grep -q "NR5G"; then + log_message "Ensuring NR5G is enabled" "debug" + local nr5g_cmd="AT+QNWPREFCFG=\"nr5g_disable_mode\",0" + execute_at_command "$nr5g_cmd" 5 "$token_id" + fi + else + log_message "Failed to change network mode to $network_type" "error" + update_track "applying" "Failed to set network mode, continuing" "$profile_name" "45" + fi + fi + + # Apply LTE bands change + if [ $needs_lte_bands_change -eq 1 ] && [ $apply_success -eq 1 ] && [ -n "$lte_bands" ]; then + update_track "applying" "Setting LTE bands from '$current_lte_bands' to '$lte_bands'" "$profile_name" "60" + log_message "Changing LTE bands from '$current_lte_bands' to '$lte_bands'" "info" + + # Convert comma-separated to colon-separated for AT command + local bands_formatted=$(echo "$lte_bands" | tr ',' ':') + local bands_cmd="AT+QNWPREFCFG=\"lte_band\",$bands_formatted" + local output=$(execute_at_command "$bands_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + log_message "LTE bands changed successfully to $lte_bands" "info" + update_track "applying" "LTE bands set successfully" "$profile_name" "70" + else + log_message "Failed to change LTE bands to $lte_bands" "error" + update_track "applying" "Failed to set LTE bands, continuing" "$profile_name" "65" + fi + fi + + # Apply NSA NR5G bands change + if [ $needs_nsa_nr5g_bands_change -eq 1 ] && [ $apply_success -eq 1 ] && [ -n "$nsa_nr5g_bands" ]; then + update_track "applying" "Setting NSA NR5G bands from '$current_nsa_nr5g_bands' to '$nsa_nr5g_bands'" "$profile_name" "75" + log_message "Changing NSA NR5G bands from '$current_nsa_nr5g_bands' to '$nsa_nr5g_bands'" "info" + + # Convert comma-separated to colon-separated for AT command + local bands_formatted=$(echo "$nsa_nr5g_bands" | tr ',' ':') + local nsa_cmd="AT+QNWPREFCFG=\"nsa_nr5g_band\",$bands_formatted" + local output=$(execute_at_command "$nsa_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + log_message "NSA NR5G bands changed successfully to $nsa_nr5g_bands" "info" + update_track "applying" "NSA NR5G bands set successfully" "$profile_name" "80" + else + log_message "Failed to change NSA NR5G bands to $nsa_nr5g_bands" "error" + update_track "applying" "Failed to set NSA NR5G bands, continuing" "$profile_name" "75" + fi + fi + + # Apply SA NR5G bands change + if [ $needs_sa_nr5g_bands_change -eq 1 ] && [ $apply_success -eq 1 ] && [ -n "$sa_nr5g_bands" ]; then + update_track "applying" "Setting SA NR5G bands from '$current_sa_nr5g_bands' to '$sa_nr5g_bands'" "$profile_name" "85" + log_message "Changing SA NR5G bands from '$current_sa_nr5g_bands' to '$sa_nr5g_bands'" "info" + + # Convert comma-separated to colon-separated for AT command + local bands_formatted=$(echo "$sa_nr5g_bands" | tr ',' ':') + local sa_cmd="AT+QNWPREFCFG=\"nr5g_band\",$bands_formatted" + local output=$(execute_at_command "$sa_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + log_message "SA NR5G bands changed successfully to $sa_nr5g_bands" "info" + update_track "applying" "SA NR5G bands set successfully" "$profile_name" "90" + else + log_message "Failed to change SA NR5G bands to $sa_nr5g_bands" "error" + update_track "applying" "Failed to set SA NR5G bands, continuing" "$profile_name" "85" + fi + fi + + # Apply TTL change if needed + if [ $needs_ttl_change -eq 1 ] && [ $apply_success -eq 1 ]; then + apply_ttl_settings "$ttl" "$current_ttl" "$token_id" "$profile_name" + if [ $? -eq 0 ]; then + changes_made=1 + log_message "TTL settings applied successfully" "info" + fi + fi + + # Apply IMEI change (requires reboot) + if [ $needs_imei_change -eq 1 ] && [ $apply_success -eq 1 ] && [ -n "$imei" ]; then + update_track "applying" "Setting IMEI from '$current_imei' to '$imei'" "$profile_name" "95" + log_message "Changing IMEI from '$current_imei' to '$imei'" "info" + + local imei_cmd="AT+EGMR=1,7,\"$imei\"" + local output=$(execute_at_command "$imei_cmd" 10 "$token_id") + + if [ $? -eq 0 ]; then + changes_made=1 + requires_reboot=1 + log_message "IMEI changed successfully to $imei (device will reboot)" "info" + update_track "rebooting" "IMEI changed, device will reboot" "$profile_name" "95" + else + log_message "Failed to change IMEI to $imei" "error" + update_track "applying" "Failed to set IMEI, continuing" "$profile_name" "90" + requires_reboot=0 + fi + fi + + # Release token + release_token "$token_id" + + # Mark profile as applied if changes were made + if [ $changes_made -eq 1 ]; then + mark_profile_applied "$iccid" "$profile_name" + fi + + # If IMEI was changed, need to reboot + if [ $requires_reboot -eq 1 ]; then + log_message "IMEI change requires reboot, scheduling reboot..." "info" + update_track "rebooting" "Device is rebooting to apply IMEI change" "$profile_name" "100" + sleep 2 + reboot & + return 0 + fi + + # Force network reset if changes were made but no reboot required + if [ $changes_made -eq 1 ] && [ $requires_reboot -eq 0 ]; then + log_message "Changes applied, resetting network connection to apply changes" "info" + update_track "applying" "Resetting network connection" "$profile_name" "95" + + # Get a new token for network reset + token_id=$(acquire_token) + if [ -n "$token_id" ]; then + # Force PDP context reconnection - note: errors here are common and non-fatal + log_message "Forcing network reconnection" "info" + execute_at_command "AT+COPS=2" 5 "$token_id" || true + sleep 2 + execute_at_command "AT+COPS=0" 5 "$token_id" || true + sleep 1 + + # Release token + release_token "$token_id" + fi + fi + + # Check if any changes were made + if [ $changes_made -eq 0 ]; then + log_message "Profile '$profile_name' already applied correctly, no changes needed" "info" + update_track "success" "Profile already correctly applied" "$profile_name" "100" + else + log_message "Successfully applied profile '$profile_name'" "info" + update_track "success" "Profile applied successfully" "$profile_name" "100" + fi + + return 0 +} + +# Check profile function with updated SA/NSA bands and TTL support +check_profile() { + local forced="${1:-0}" + + log_message "Performing profile check (forced=$forced)" "info" + + # Get all modem data at once with a single token + local modem_data="" + modem_data=$(fetch_modem_data) + if [ $? -ne 0 ]; then + log_message "Failed to fetch modem data, will retry later" "error" + update_track "error" "Could not communicate with modem. Will retry later." "unknown" "0" + return 1 + fi + + # Extract ICCID from modem data + local current_iccid="" + current_iccid=$(extract_iccid "$modem_data") + if [ $? -ne 0 ]; then + log_message "Failed to extract ICCID from modem data, will retry later" "error" + update_track "error" "Could not detect SIM card. Please check that a SIM is inserted." "unknown" "0" + return 1 + fi + + log_message "Current ICCID: $current_iccid" "info" + + # Find profile for current ICCID + local profile_index="" + profile_index=$(find_profile_by_iccid "$current_iccid") + local profile_result=$? + + # CRITICAL FIX: Early return if no profile is found + if [ $profile_result -ne 0 ]; then + log_message "No profile found for ICCID $current_iccid, nothing to apply" "info" + update_track "idle" "No profile exists for current SIM card. Create a profile to configure network settings." "$current_iccid" "0" + return 0 + fi + + # Only continue if we found a valid profile + log_message "Found valid profile index: $profile_index" "debug" + + # Get profile details + local profile_name=$(uci -q get quecprofiles.$profile_index.name) + local network_type=$(uci -q get quecprofiles.$profile_index.network_type) + local lte_bands=$(uci -q get quecprofiles.$profile_index.lte_bands) + local sa_nr5g_bands=$(uci -q get quecprofiles.$profile_index.sa_nr5g_bands) + local nsa_nr5g_bands=$(uci -q get quecprofiles.$profile_index.nsa_nr5g_bands) + local apn=$(uci -q get quecprofiles.$profile_index.apn) + local pdp_type=$(uci -q get quecprofiles.$profile_index.pdp_type) + local imei=$(uci -q get quecprofiles.$profile_index.imei) + local ttl=$(uci -q get quecprofiles.$profile_index.ttl) + + # Default pdp_type to "IP" if not specified + pdp_type="${pdp_type:-IP}" + # Default TTL to 0 (disabled) if not specified + ttl="${ttl:-0}" + + # For backward compatibility - check if old nr5g_bands exists but new fields don't + local nr5g_bands=$(uci -q get quecprofiles.$profile_index.nr5g_bands) + if [ -n "$nr5g_bands" ] && [ -z "$sa_nr5g_bands" ] && [ -z "$nsa_nr5g_bands" ]; then + sa_nr5g_bands=$nr5g_bands + nsa_nr5g_bands=$nr5g_bands + log_message "Migrating legacy nr5g_bands for profile $profile_name" "info" + fi + + log_message "Found profile: $profile_name for ICCID: $current_iccid" "info" + log_message "Profile settings: network_type=$network_type, lte_bands=$lte_bands, sa_nr5g_bands=$sa_nr5g_bands, nsa_nr5g_bands=$nsa_nr5g_bands, apn=$apn, pdp_type=$pdp_type, imei=$imei, ttl=$ttl" "info" + + # Check if APN is configured - it's the minimum required setting + if [ -z "$apn" ]; then + log_message "Profile has no APN configured, cannot apply" "error" + update_track "error" "Profile \"$profile_name\" is missing the required APN setting. Please edit the profile and add an APN." "$profile_name" "0" + return 1 + fi + + # Check if profile is already applied (unless forced) + if [ "$forced" != "1" ] && is_profile_applied "$current_iccid" "$profile_name"; then + log_message "Profile '$profile_name' is already applied, skipping" "info" + update_track "success" "Profile already applied (from flag)" "$profile_name" "100" + return 0 + fi + + # Apply profile if forced or if autoswitch is enabled + local enable_autoswitch + enable_autoswitch=$(uci -q get quecprofiles.settings.enable_autoswitch) + enable_autoswitch="${enable_autoswitch:-1}" # Default to enabled + + if [ "$forced" = "1" ] || [ "$enable_autoswitch" = "1" ]; then + log_message "Applying profile settings..." "info" + update_track "applying" "Applying profile settings" "$profile_name" "10" + + # Extract current modem settings for comparison + local current_apn="" + local current_mode="" + local current_lte_bands="" + local current_sa_nr5g_bands="" + local current_nsa_nr5g_bands="" + local current_imei="" + + current_apn=$(extract_apn "$modem_data") + current_mode=$(extract_network_mode "$modem_data") + current_lte_bands=$(extract_lte_bands "$modem_data") + current_sa_nr5g_bands=$(extract_nr5g_bands "$modem_data" "sa") + current_nsa_nr5g_bands=$(extract_nr5g_bands "$modem_data" "nsa") + current_imei=$(extract_imei "$modem_data") + + # Apply profile settings with the new parameters + apply_profile_settings "$profile_name" "$network_type" "$lte_bands" "$sa_nr5g_bands" "$nsa_nr5g_bands" \ + "$apn" "$pdp_type" "$imei" "$ttl" "$current_apn" "$current_mode" "$current_lte_bands" \ + "$current_sa_nr5g_bands" "$current_nsa_nr5g_bands" "$current_imei" "$current_iccid" + return $? + else + log_message "Automatic profile switching is disabled, not applying profile" "info" + update_track "idle" "Automatic profile switching is disabled" "$profile_name" "0" + return 0 + fi +} + +# Main function +main() { + log_message "QuecProfiles daemon starting with SA/NSA NR5G and TTL support (PID: $$)" "info" + + # Clear status files at startup + rm -f "$TRACK_FILE" "$CHECK_TRIGGER" + update_track "idle" "Daemon started" "none" "0" + + # Get check interval from UCI + local check_interval + check_interval=$(uci -q get quecprofiles.settings.check_interval) + check_interval="${check_interval:-$DEFAULT_CHECK_INTERVAL}" + + # Check autoswitch setting + local enable_autoswitch + enable_autoswitch=$(uci -q get quecprofiles.settings.enable_autoswitch) + enable_autoswitch="${enable_autoswitch:-1}" # Default to enabled + + log_message "Daemon configured with check_interval=$check_interval seconds, enable_autoswitch=$enable_autoswitch" "info" + + # Add a startup delay + log_message "Waiting 10 seconds before initial check..." "info" + sleep 10 + + # Main loop + while true; do + # Check if there's a manual check request + if [ -f "$CHECK_TRIGGER" ]; then + log_message "Manual check triggered" "info" + rm -f "$CHECK_TRIGGER" + check_profile 1 # Forced check + elif [ "$enable_autoswitch" -eq 1 ]; then + # Perform regular check + check_profile 0 # Regular check + else + log_message "Automatic profile switching is disabled" "info" + update_track "idle" "Automatic profile switching is disabled" "none" "0" + fi + + # Sleep for the check interval + log_message "Sleeping for $check_interval seconds" "info" + + # Break the sleep into smaller intervals to check for triggers + sleep_counter=0 + while [ $sleep_counter -lt $check_interval ]; do + sleep 5 + sleep_counter=$((sleep_counter + 5)) + + # Check for manual trigger during sleep + if [ -f "$CHECK_TRIGGER" ]; then + log_message "Manual check triggered during sleep" "info" + break + fi + done + done +} + +# Set up trap handlers for clean shutdown +trap 'log_message "Received SIGTERM, exiting"; update_track "idle" "Daemon stopped" "none" "0"; exit 0' TERM +trap 'log_message "Received SIGINT, exiting"; update_track "idle" "Daemon stopped" "none" "0"; exit 0' INT + +# Start the main function +main \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quecwatch.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quecwatch.sh new file mode 100644 index 0000000..da3c43f --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/quecwatch.sh @@ -0,0 +1,544 @@ +#!/bin/sh + +# QuecWatch Daemon +# Monitors cellular connectivity and performs recovery actions + +# Load UCI configuration functions +. /lib/functions.sh + +# Configuration +QUEUE_DIR="/tmp/at_queue" +TOKEN_FILE="$QUEUE_DIR/token" +LOG_DIR="/tmp/log/quecwatch" +LOG_FILE="$LOG_DIR/quecwatch.log" +PID_FILE="/var/run/quecwatch.pid" +STATUS_FILE="/tmp/quecwatch_status.json" +RETRY_COUNT_FILE="/tmp/quecwatch_retry_count" +UCI_CONFIG="quecmanager" +MAX_TOKEN_WAIT=10 # Maximum seconds to wait for token acquisition +TOKEN_PRIORITY=15 # Medium priority (between profiles and metrics) + +# Ensure directories exist +mkdir -p "$LOG_DIR" "$QUEUE_DIR" + +# Store PID +echo "$$" > "$PID_FILE" +chmod 644 "$PID_FILE" + +# Function to log messages +log_message() { + local level="${2:-info}" + local message="$1" + local timestamp=$(date "+%Y-%m-%d %H:%M:%S") + + # Log to file + echo "[$timestamp] [$level] $message" >> "$LOG_FILE" + + # Log to system log + logger -t quecwatch -p "daemon.$level" "$message" +} + +# Function to update status +update_status() { + local status="$1" + local message="$2" + local retry="${3:-$CURRENT_RETRIES}" + local max="${4:-$MAX_RETRIES}" + + # Create JSON status + cat > "$STATUS_FILE" </dev/null) + local current_priority=$(cat "$TOKEN_FILE" | jsonfilter -e '@.priority' 2>/dev/null) + local timestamp=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp' 2>/dev/null) + local current_time=$(date +%s) + + # Check for expired token (> 30 seconds old) + if [ $((current_time - timestamp)) -gt 30 ] || [ -z "$current_holder" ]; then + # Remove expired token + log_message "Found expired token from $current_holder, removing" "debug" + rm -f "$TOKEN_FILE" 2>/dev/null + elif [ $priority -lt $current_priority ]; then + # Preempt lower priority token + log_message "Preempting token from $current_holder (priority: $current_priority)" "debug" + rm -f "$TOKEN_FILE" 2>/dev/null + else + # Check if the token is held by a QuecProfile or cell scan + if echo "$current_holder" | grep -q "CELL_SCAN"; then + log_message "Token held by cell scan (priority: $current_priority), waiting..." "debug" + elif echo "$current_holder" | grep -q "QUECPROFILES"; then + log_message "Token held by profile application (priority: $current_priority), waiting..." "debug" + else + log_message "Token held by $current_holder with priority $current_priority, retrying..." "debug" + fi + + sleep 0.5 + attempt=$((attempt + 1)) + continue + fi + fi + + # Try to create token file + echo "{\"id\":\"$requestor_id\",\"priority\":$priority,\"timestamp\":$(date +%s)}" > "$TOKEN_FILE" 2>/dev/null + chmod 644 "$TOKEN_FILE" 2>/dev/null + + # Verify we got the token + local holder=$(cat "$TOKEN_FILE" 2>/dev/null | jsonfilter -e '@.id' 2>/dev/null) + if [ "$holder" = "$requestor_id" ]; then + log_message "Successfully acquired token with ID $requestor_id" "debug" + echo "$requestor_id" + return 0 + fi + + sleep 0.5 + attempt=$((attempt + 1)) + done + + log_message "Failed to acquire token after $max_attempts attempts" "error" + return 1 +} + +# Function to release token +release_token() { + local requestor_id="$1" + + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + if [ "$current_holder" = "$requestor_id" ]; then + rm -f "$TOKEN_FILE" 2>/dev/null + log_message "Released token $requestor_id" "debug" + return 0 + fi + log_message "Token held by $current_holder, not by us ($requestor_id)" "warn" + else + log_message "Token file doesn't exist, nothing to release" "debug" + fi + return 1 +} + +# Function to execute AT command with token +execute_at_command() { + local cmd="$1" + local timeout="${2:-5}" + local token_id="$3" + + if [ -z "$token_id" ]; then + log_message "No valid token provided for command: $cmd" "error" + return 1 + fi + + log_message "Executing AT command: $cmd (timeout: ${timeout}s)" "debug" + + # Execute the command with proper timeout + local output + local status=1 + + output=$(sms_tool at "$cmd" -t "$timeout" 2>&1) + status=$? + + if [ $status -ne 0 ]; then + log_message "AT command failed: $cmd (exit code: $status)" "error" + return 1 + fi + + echo "$output" + return 0 +} + +# Function to check internet connectivity +check_internet() { + local ping_target + local ping_count=3 + + # Get ping target from UCI + config_load "$UCI_CONFIG" + config_get ping_target quecwatch ping_target + + if [ -z "$ping_target" ]; then + log_message "No ping target configured" "error" + return 1 + fi + + log_message "Checking internet connectivity to $ping_target" "debug" + + if ping -c $ping_count "$ping_target" > /dev/null 2>&1; then + log_message "Internet connectivity check successful" "debug" + return 0 + else + log_message "Internet connectivity check failed" "warn" + return 1 + fi +} + +# Function to get current SIM slot +get_current_sim() { + local token_id=$(acquire_token) + if [ -z "$token_id" ]; then + log_message "Failed to acquire token for SIM slot check" "error" + return 1 + fi + + log_message "Checking current SIM slot" "debug" + + local result=$(execute_at_command "AT+QUIMSLOT?" 5 "$token_id") + local status=$? + + # Release token + release_token "$token_id" + + if [ $status -eq 0 ] && [ -n "$result" ]; then + # Extract SIM slot number from response + local current_sim=$(echo "$result" | grep -o '+QUIMSLOT: [0-9]' | cut -d' ' -f2) + + if [ -n "$current_sim" ]; then + log_message "Current SIM slot: $current_sim" "debug" + echo "$current_sim" + return 0 + fi + fi + + log_message "Failed to get current SIM slot" "error" + return 1 +} + +# Function to switch SIM card +switch_sim_card() { + local current_sim + local target_sim + local token_id + + log_message "Starting SIM card switch operation" "info" + + # Get current SIM slot + current_sim=$(get_current_sim) + if [ $? -ne 0 ]; then + log_message "Failed to get current SIM slot, cannot switch" "error" + return 1 + fi + + # Determine target SIM + if [ "$current_sim" = "1" ]; then + target_sim=2 + else + target_sim=1 + fi + + log_message "Attempting to switch from SIM $current_sim to SIM $target_sim" "info" + + # Get token for AT commands + token_id=$(acquire_token) + if [ -z "$token_id" ]; then + log_message "Failed to acquire token for SIM switch" "error" + return 1 + fi + + # Detach from network + log_message "Detaching from network" "debug" + execute_at_command "AT+COPS=2" 10 "$token_id" + sleep 2 + + # Switch SIM slot + log_message "Switching to SIM slot $target_sim" "debug" + local switch_result=$(execute_at_command "AT+QUIMSLOT=$target_sim" 10 "$token_id") + local switch_status=$? + + # If switch failed, return error + if [ $switch_status -ne 0 ]; then + log_message "Failed to switch to SIM $target_sim" "error" + release_token "$token_id" + return 1 + fi + + sleep 5 + + # Reattach to network + log_message "Reattaching to network" "debug" + execute_at_command "AT+COPS=0" 10 "$token_id" + + # Release token + release_token "$token_id" + + # Verify switch + sleep 10 + local new_sim=$(get_current_sim) + if [ "$new_sim" = "$target_sim" ]; then + log_message "Successfully switched to SIM $target_sim" "info" + return 0 + else + log_message "Failed to verify SIM switch, current SIM is $new_sim" "error" + return 1 + fi +} + +# Function to perform connection recovery +perform_connection_recovery() { + local token_id + + log_message "Starting connection recovery" "info" + + # Get token for AT commands + token_id=$(acquire_token) + if [ -z "$token_id" ]; then + log_message "Failed to acquire token for connection recovery" "error" + return 1 + fi + + # Detach from network + log_message "Detaching from network" "debug" + execute_at_command "AT+COPS=2" 10 "$token_id" + sleep 2 + + # Reattach to network + log_message "Reattaching to network" "debug" + execute_at_command "AT+COPS=0" 15 "$token_id" + + # Release token + release_token "$token_id" + + # Verify recovery + sleep 10 + if check_internet; then + log_message "Connection recovery successful" "info" + return 0 + else + log_message "Connection recovery failed" "error" + return 1 + fi +} + +# Load configuration +load_config() { + # Initialize variables + PING_TARGET="" + PING_INTERVAL=60 + PING_FAILURES=3 + MAX_RETRIES=5 + CURRENT_RETRIES=0 + CONNECTION_REFRESH=0 + REFRESH_COUNT=3 + AUTO_SIM_FAILOVER=0 + SIM_FAILOVER_SCHEDULE=0 + + # Load from UCI + config_load "$UCI_CONFIG" + + # Get settings with defaults + config_get PING_TARGET quecwatch ping_target + config_get PING_INTERVAL quecwatch ping_interval 60 + config_get PING_FAILURES quecwatch ping_failures 3 + config_get MAX_RETRIES quecwatch max_retries 5 + config_get CURRENT_RETRIES quecwatch current_retries 0 + config_get_bool CONNECTION_REFRESH quecwatch connection_refresh 0 + config_get REFRESH_COUNT quecwatch refresh_count 3 + config_get_bool AUTO_SIM_FAILOVER quecwatch auto_sim_failover 0 + config_get SIM_FAILOVER_SCHEDULE quecwatch sim_failover_schedule 0 + + # Validate required settings + if [ -z "$PING_TARGET" ]; then + log_message "No ping target configured, using default (8.8.8.8)" "warn" + PING_TARGET="8.8.8.8" + uci set "$UCI_CONFIG.quecwatch.ping_target=$PING_TARGET" + uci commit "$UCI_CONFIG" + fi + + # Load persisted retry count if available + if [ -f "$RETRY_COUNT_FILE" ]; then + CURRENT_RETRIES=$(cat "$RETRY_COUNT_FILE") + fi + + log_message "Configuration loaded: ping_target=$PING_TARGET, interval=$PING_INTERVAL, failures=$PING_FAILURES, max_retries=$MAX_RETRIES, current_retries=$CURRENT_RETRIES" "info" +} + +# Save retry count to both UCI and file +save_retry_count() { + local count=$1 + + # Update UCI + uci set "$UCI_CONFIG.quecwatch.current_retries=$count" + uci commit "$UCI_CONFIG" + + # Update file for crash recovery + echo "$count" > "$RETRY_COUNT_FILE" + chmod 644 "$RETRY_COUNT_FILE" + + log_message "Updated retry count to $count" "debug" +} + +# Main monitoring function +main() { + log_message "QuecWatch daemon starting (PID: $$)" "info" + + # Load configuration + load_config + + # Initial status update + update_status "active" "Monitoring started" + + # Track consecutive failures + local failure_count=0 + + # For scheduled SIM failover + local sim_failover_interval=0 + local initial_sim="" + + # If auto SIM failover is enabled, store initial SIM slot + if [ "$AUTO_SIM_FAILOVER" -eq 1 ]; then + initial_sim=$(get_current_sim) + if [ -n "$initial_sim" ]; then + log_message "Auto SIM failover enabled, initial SIM slot: $initial_sim" "info" + fi + fi + + # Main monitoring loop + while true; do + log_message "Starting monitoring cycle" "debug" + + # Check internet connectivity + if ! check_internet; then + failure_count=$((failure_count + 1)) + log_message "Connectivity check failed ($failure_count/$PING_FAILURES)" "warn" + + # Update status + update_status "warning" "Connection check failed: $failure_count/$PING_FAILURES failures" + + # Check if failure threshold is reached + if [ $failure_count -ge $PING_FAILURES ]; then + # Reset failure counter + failure_count=0 + + # Increment retry counter + CURRENT_RETRIES=$((CURRENT_RETRIES + 1)) + save_retry_count $CURRENT_RETRIES + + log_message "Failure threshold reached. Current retry: $CURRENT_RETRIES/$MAX_RETRIES" "warn" + update_status "error" "Connection lost, attempt $CURRENT_RETRIES/$MAX_RETRIES to recover" + + # Check if max retries reached + if [ $CURRENT_RETRIES -ge $MAX_RETRIES ]; then + log_message "Maximum retries reached" "error" + + # Try SIM failover if enabled + if [ "$AUTO_SIM_FAILOVER" -eq 1 ]; then + log_message "Attempting SIM failover" "info" + update_status "failover" "Maximum retries reached, attempting SIM failover" + + if switch_sim_card && check_internet; then + log_message "SIM failover successful, connection restored" "info" + update_status "recovered" "Connection restored via SIM failover" + + # Reset retry counter + CURRENT_RETRIES=0 + save_retry_count $CURRENT_RETRIES + else + log_message "SIM failover failed, system will reboot" "error" + update_status "rebooting" "SIM failover failed, system will reboot" + + # Wait briefly and reboot + sleep 5 + reboot + fi + else + log_message "Auto SIM failover disabled, system will reboot" "error" + update_status "rebooting" "Maximum retries reached, system will reboot" + + # Wait briefly and reboot + sleep 5 + reboot + fi + else + # Try connection recovery + log_message "Attempting connection recovery" "info" + update_status "recovering" "Attempting to restore connection" + + if perform_connection_recovery; then + log_message "Connection recovery successful" "info" + update_status "recovered" "Connection restored" + + # Reset retry counter + CURRENT_RETRIES=0 + save_retry_count $CURRENT_RETRIES + fi + fi + fi + else + # Connection is good + if [ $failure_count -gt 0 ] || [ $CURRENT_RETRIES -gt 0 ]; then + log_message "Connection restored" "info" + update_status "stable" "Connection restored" + + # Reset counters + failure_count=0 + CURRENT_RETRIES=0 + save_retry_count $CURRENT_RETRIES + fi + + # Scheduled SIM failover check + if [ "$AUTO_SIM_FAILOVER" -eq 1 ] && [ "$SIM_FAILOVER_SCHEDULE" -gt 0 ] && [ -n "$initial_sim" ]; then + # Get current SIM to check if we're on the backup + local current_sim=$(get_current_sim) + + # If we're on backup SIM, check if it's time to try primary again + if [ -n "$current_sim" ] && [ "$current_sim" != "$initial_sim" ]; then + sim_failover_interval=$((sim_failover_interval + 1)) + + # Check if we've reached the scheduled time + if [ $((sim_failover_interval * PING_INTERVAL)) -ge $((SIM_FAILOVER_SCHEDULE * 60)) ]; then + log_message "Scheduled check: attempting to switch back to primary SIM $initial_sim" "info" + update_status "switchback" "Attempting to switch back to primary SIM" + + # Try switching back + if switch_sim_card && check_internet; then + log_message "Successfully switched back to primary SIM" "info" + update_status "stable" "Successfully switched back to primary SIM" + else + log_message "Failed to switch back to primary SIM, staying on backup" "warn" + update_status "stable" "Staying on backup SIM - primary SIM check failed" + + # Switch back to backup SIM + current_sim=$(get_current_sim) + if [ -n "$current_sim" ] && [ "$current_sim" = "$initial_sim" ]; then + switch_sim_card + fi + fi + + # Reset failover interval + sim_failover_interval=0 + fi + fi + fi + fi + + # Sleep for the configured interval + sleep $PING_INTERVAL + done +} + +# Set up trap for clean shutdown +trap 'log_message "Received signal, exiting" "info"; update_status "stopped" "Daemon stopped"; rm -f "$PID_FILE"; exit 0' INT TERM + +# Start the main function +main \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/scheduled_cell_locking.sh b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/scheduled_cell_locking.sh new file mode 100644 index 0000000..d08175c --- /dev/null +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/scheduled_cell_locking.sh @@ -0,0 +1,429 @@ +#!/bin/sh + +# Cell Lock Scheduler Daemon +# Monitors schedule and applies/restores cell locks as needed + +# Load UCI configuration functions +. /lib/functions.sh + +# Configuration +QUEUE_DIR="/tmp/at_queue" +TOKEN_FILE="$QUEUE_DIR/token" +LOG_DIR="/tmp/log/cell_lock" +LOG_FILE="$LOG_DIR/cell_lock.log" +PID_FILE="/var/run/cell_lock_scheduler.pid" +STATUS_FILE="/tmp/cell_lock_status.json" +UCI_CONFIG="quecmanager" +CHECK_INTERVAL=60 # Check schedule every minute +MAX_TOKEN_WAIT=15 # Maximum seconds to wait for token acquisition +TOKEN_PRIORITY=5 # Higher priority than QuecWatch (which is 15) + +# Ensure directories exist +mkdir -p "$LOG_DIR" "$QUEUE_DIR" + +# Store PID +echo "$$" > "$PID_FILE" +chmod 644 "$PID_FILE" + +# Function to log messages +log_message() { + local level="${2:-info}" + local message="$1" + local timestamp=$(date "+%Y-%m-%d %H:%M:%S") + + # Log to file + echo "[$timestamp] [$level] $message" >> "$LOG_FILE" + + # Log to system log + logger -t cell_lock -p "daemon.$level" "$message" +} + +# Function to update status +update_status() { + local status="$1" + local message="$2" + local active="${3:-0}" + local locked="${4:-0}" + + # Create JSON status + cat > "$STATUS_FILE" </dev/null) + local current_priority=$(cat "$TOKEN_FILE" | jsonfilter -e '@.priority' 2>/dev/null) + local timestamp=$(cat "$TOKEN_FILE" | jsonfilter -e '@.timestamp' 2>/dev/null) + local current_time=$(date +%s) + + # Check for expired token (> 30 seconds old) + if [ $((current_time - timestamp)) -gt 30 ] || [ -z "$current_holder" ]; then + # Remove expired token + log_message "Found expired token from $current_holder, removing" "debug" + rm -f "$TOKEN_FILE" 2>/dev/null + elif [ $priority -lt $current_priority ]; then + # Preempt lower priority token + log_message "Preempting token from $current_holder (priority: $current_priority)" "debug" + rm -f "$TOKEN_FILE" 2>/dev/null + else + # Check if the token is held by a cell scan + if echo "$current_holder" | grep -q "CELL_SCAN"; then + log_message "Token held by cell scan (priority: $current_priority), waiting..." "debug" + else + log_message "Token held by $current_holder with priority $current_priority, retrying..." "debug" + fi + + sleep 0.5 + attempt=$((attempt + 1)) + continue + fi + fi + + # Try to create token file + echo "{\"id\":\"$requestor_id\",\"priority\":$priority,\"timestamp\":$(date +%s)}" > "$TOKEN_FILE" 2>/dev/null + chmod 644 "$TOKEN_FILE" 2>/dev/null + + # Verify we got the token + local holder=$(cat "$TOKEN_FILE" 2>/dev/null | jsonfilter -e '@.id' 2>/dev/null) + if [ "$holder" = "$requestor_id" ]; then + log_message "Successfully acquired token with ID $requestor_id" "debug" + echo "$requestor_id" + return 0 + fi + + sleep 0.5 + attempt=$((attempt + 1)) + done + + log_message "Failed to acquire token after $max_attempts attempts" "error" + return 1 +} + +# Function to release token +release_token() { + local requestor_id="$1" + + if [ -f "$TOKEN_FILE" ]; then + local current_holder=$(cat "$TOKEN_FILE" | jsonfilter -e '@.id' 2>/dev/null) + if [ "$current_holder" = "$requestor_id" ]; then + rm -f "$TOKEN_FILE" 2>/dev/null + log_message "Released token $requestor_id" "debug" + return 0 + fi + log_message "Token held by $current_holder, not by us ($requestor_id)" "warn" + else + log_message "Token file doesn't exist, nothing to release" "debug" + fi + return 1 +} + +# Function to execute AT command with token +execute_at_command() { + local cmd="$1" + local timeout="${2:-10}" + local token_id="$3" + + if [ -z "$token_id" ]; then + log_message "No valid token provided for command: $cmd" "error" + return 1 + fi + + log_message "Executing AT command: $cmd (timeout: ${timeout}s)" "debug" + + # Execute the command with proper timeout + local output + local status=1 + + output=$(sms_tool at "$cmd" -t "$timeout" 2>&1) + status=$? + + if [ $status -ne 0 ]; then + log_message "AT command failed: $cmd (exit code: $status)" "error" + return 1 + fi + + echo "$output" + return 0 +} + +# Function to check current lock status +check_lock_status() { + local token_id="$1" + + log_message "Checking current cell lock status" "debug" + + # Check LTE lock status + local lte_status=$(execute_at_command 'AT+QNWLOCK="common/4g"' 5 "$token_id") + local nr5g_status=$(execute_at_command 'AT+QNWLOCK="common/5g"' 5 "$token_id") + + # Check if any lock is active + if echo "$lte_status" | grep -q '"common/4g",0'; then + if echo "$nr5g_status" | grep -q '"common/5g",0'; then + log_message "No active cell locks detected" "debug" + return 1 + fi + fi + + log_message "Active cell locks detected" "debug" + return 0 +} + +# Function to get current lock parameters and save to UCI +store_current_lock_params() { + local token_id="$1" + + log_message "Storing current lock parameters" "debug" + + # Get LTE lock status + local lte_status=$(execute_at_command 'AT+QNWLOCK="common/4g"' 5 "$token_id") + if [ $? -eq 0 ]; then + # Extract parameters + local lte_params=$(echo "$lte_status" | grep -o '"common/4g",[^[:space:]]*' | cut -d',' -f2-) + + # Save to UCI + uci set "$UCI_CONFIG.cell_lock.lte_params='$lte_params'" + log_message "Stored LTE parameters: $lte_params" "debug" + fi + + # Get NR5G lock status + local nr5g_status=$(execute_at_command 'AT+QNWLOCK="common/5g"' 5 "$token_id") + if [ $? -eq 0 ]; then + # Extract parameters + local nr5g_params=$(echo "$nr5g_status" | grep -o '"common/5g",[^[:space:]]*' | cut -d',' -f2-) + + # Save to UCI + uci set "$UCI_CONFIG.cell_lock.nr5g_params='$nr5g_params'" + log_message "Stored NR5G parameters: $nr5g_params" "debug" + fi + + # Get persist settings + local persist_status=$(execute_at_command 'AT+QNWLOCK="save_ctrl"' 5 "$token_id") + if [ $? -eq 0 ]; then + # Extract parameters (LTE persist is at index 1, NR5G persist is at index 2) + local persist_params=$(echo "$persist_status" | grep -o '"save_ctrl",[^[:space:]]*' | cut -d',' -f2-) + local lte_persist=$(echo "$persist_params" | cut -d',' -f1) + local nr5g_persist=$(echo "$persist_params" | cut -d',' -f2) + + # Save to UCI + uci set "$UCI_CONFIG.cell_lock.lte_persist='$lte_persist'" + uci set "$UCI_CONFIG.cell_lock.nr5g_persist='$nr5g_persist'" + log_message "Stored persist settings: LTE=$lte_persist, NR5G=$nr5g_persist" "debug" + fi + + # Commit changes + uci commit "$UCI_CONFIG" + return 0 +} + +# Function to check if time is in range +is_time_in_range() { + local current_time_minutes=$1 + local start_time_minutes=$2 + local end_time_minutes=$3 + + # Handle case where end time is on the next day + if [ $end_time_minutes -lt $start_time_minutes ]; then + if [ $current_time_minutes -ge $start_time_minutes ] || [ $current_time_minutes -lt $end_time_minutes ]; then + return 0 + fi + else + if [ $current_time_minutes -ge $start_time_minutes ] && [ $current_time_minutes -lt $end_time_minutes ]; then + return 0 + fi + fi + + return 1 +} + +# Function to convert HH:MM to minutes +time_to_minutes() { + local time="$1" + local hours=$(echo "$time" | cut -d':' -f1) + local minutes=$(echo "$time" | cut -d':' -f2) + + echo $((hours * 60 + minutes)) +} + +# Function to check schedule and manage cell locks +check_schedule() { + local enabled + local start_time + local end_time + local current_active + + # Get current scheduler state from UCI + config_load "$UCI_CONFIG" + config_get_bool enabled cell_lock enabled 0 + + if [ "$enabled" -ne 1 ]; then + log_message "Cell lock scheduler is disabled" "debug" + update_status "disabled" "Scheduler is disabled" 0 0 + return 0 + fi + + # Get schedule from UCI + config_get start_time cell_lock start_time + config_get end_time cell_lock end_time + config_get current_active cell_lock active 0 + + if [ -z "$start_time" ] || [ -z "$end_time" ]; then + log_message "Missing start or end time in configuration" "error" + update_status "error" "Missing schedule configuration" 0 0 + return 1 + } + + # Get current time + local current_time=$(date "+%H:%M") + + # Convert times to minutes for comparison + local current_minutes=$(time_to_minutes "$current_time") + local start_minutes=$(time_to_minutes "$start_time") + local end_minutes=$(time_to_minutes "$end_time") + + # Get token for AT commands + local token_id=$(acquire_token) + if [ -z "$token_id" ]; then + log_message "Failed to acquire token for checking schedule" "error" + update_status "error" "Failed to acquire token for checking schedule" 0 0 + return 1 + } + + # Check if any cell lock is currently active + local lock_active=0 + check_lock_status "$token_id" && lock_active=1 + + # Check if current time is in the scheduled range + if is_time_in_range "$current_minutes" "$start_minutes" "$end_minutes"; then + # We're in the active window + if [ "$current_active" -ne 1 ]; then + # We just entered the window, need to save current state + log_message "Entering scheduled window" "info" + + # Store current lock parameters if a lock is active + if [ $lock_active -eq 1 ]; then + log_message "Storing current cell lock parameters" "info" + store_current_lock_params "$token_id" + else + log_message "No active cell locks to store" "info" + update_status "inactive" "Schedule active but no cell locks configured" 1 0 + release_token "$token_id" + return 0 + } + + # Update status + uci set "$UCI_CONFIG.cell_lock.active=1" + uci commit "$UCI_CONFIG" + update_status "active" "Cell lock scheduler is active" 1 $lock_active + else + update_status "active" "Cell lock scheduler is active" 1 $lock_active + } + else + # We're outside the active window + if [ "$current_active" -eq 1 ]; then + # We just exited the window + log_message "Exiting scheduled window" "info" + + # Update status + uci set "$UCI_CONFIG.cell_lock.active=0" + uci commit "$UCI_CONFIG" + update_status "inactive" "Outside scheduled hours" 0 $lock_active + } else { + update_status "inactive" "Outside scheduled hours" 0 $lock_active + } + fi + + # Release token + release_token "$token_id" + + return 0 +} + +# Main function +main() { + log_message "Cell lock scheduler daemon starting (PID: $$)" "info" + + # Ensure UCI section exists + if ! uci -q get "$UCI_CONFIG.cell_lock" >/dev/null; then + uci set "$UCI_CONFIG.cell_lock=scheduler" + uci set "$UCI_CONFIG.cell_lock.enabled=0" + uci set "$UCI_CONFIG.cell_lock.active=0" + uci commit "$UCI_CONFIG" + log_message "Created cell lock UCI configuration" "info" + fi + + # Initialize status + update_status "starting" "Cell lock scheduler daemon starting" 0 0 + + # Get token and check if any locks are active + local token_id=$(acquire_token) + if [ -n "$token_id" ]; then + local lock_active=0 + check_lock_status "$token_id" && lock_active=1 + release_token "$token_id" + + # Update status based on current state + local enabled=$(uci -q get "$UCI_CONFIG.cell_lock.enabled") + if [ "$enabled" = "1" ]; then + # Get schedule from UCI + local start_time=$(uci -q get "$UCI_CONFIG.cell_lock.start_time") + local end_time=$(uci -q get "$UCI_CONFIG.cell_lock.end_time") + + if [ -n "$start_time" ] && [ -n "$end_time" ]; then + # Check if we're currently in the schedule window + local current_time=$(date "+%H:%M") + local current_minutes=$(time_to_minutes "$current_time") + local start_minutes=$(time_to_minutes "$start_time") + local end_minutes=$(time_to_minutes "$end_time") + + if is_time_in_range "$current_minutes" "$start_minutes" "$end_minutes"; then + update_status "active" "Cell lock scheduler is active" 1 $lock_active + uci set "$UCI_CONFIG.cell_lock.active=1" + uci commit "$UCI_CONFIG" + } else { + update_status "inactive" "Cell lock scheduler is enabled but outside scheduled hours" 0 $lock_active + uci set "$UCI_CONFIG.cell_lock.active=0" + uci commit "$UCI_CONFIG" + } + } else { + update_status "error" "Missing schedule configuration" 0 $lock_active + } + } else { + update_status "disabled" "Cell lock scheduler is disabled" 0 $lock_active + } + } else { + log_message "Failed to acquire token for initial status check" "error" + } + + # Main monitoring loop + while true; do + check_schedule + sleep $CHECK_INTERVAL + done +} + +# Set up trap for clean shutdown +trap 'log_message "Received signal, exiting" "info"; update_status "stopped" "Daemon stopped" 0 0; rm -f "$PID_FILE"; exit 0' INT TERM + +# Start the main function +main \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/about/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/about/index.html index 19934e7..68627cc 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/about/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/about/index.html @@ -1 +1 @@ -QuecManager
            \ No newline at end of file +QuecManager
              \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/about/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/about/index.txt index 56bd823..6f520b6 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/about/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/about/index.txt @@ -12,8 +12,8 @@ e:I[99165,[],"OutletBoundary"] 10:I[99165,[],"MetadataBoundary"] 12:I[99165,[],"ViewportBoundary"] 14:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","about",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["about",{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["about",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","about","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$La",null,{"Component":"$b","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@c","$@d"]}],null,["$","$Le",null,{"children":"$Lf"}]]}],{},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","BSKC_qZkYyipuB2zOenkG",{"children":[["$","$L10",null,{"children":"$L11"}],["$","$L12",null,{"children":"$L13"}],null]}]]}],false]],"m":"$undefined","G":["$14","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","about",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["about",{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["about",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","about","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$La",null,{"Component":"$b","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@c","$@d"]}],null,["$","$Le",null,{"children":"$Lf"}]]}],{},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","RZohU-9AWPF-9t-zmaIRM",{"children":[["$","$L10",null,{"children":"$L11"}],["$","$L12",null,{"children":"$L13"}],null]}]]}],false]],"m":"$undefined","G":["$14","$undefined"],"s":false,"S":true} 9:{} c:{} d:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/at-terminal/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/at-terminal/index.html index 3ae9ed9..e618ce5 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/at-terminal/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/at-terminal/index.html @@ -1 +1 @@ -QuecManager
                \ No newline at end of file +QuecManager
                  \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/at-terminal/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/at-terminal/index.txt index f95c383..789c3d7 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/at-terminal/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/at-terminal/index.txt @@ -13,8 +13,8 @@ d:I[30233,["7780","static/chunks/7780-d44d1f6d676771d4.js","8885","static/chunks 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","advanced-settings","at-terminal",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["at-terminal",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["at-terminal",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","at-terminal","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","bj2A73QxjlYnOYfFw8cO4",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","advanced-settings","at-terminal",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["at-terminal",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["at-terminal",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","at-terminal","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","hm9QRsQDmkQ3tAbrgPcdY",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/connectivity/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/connectivity/index.html index 4ca0a75..39ea1d5 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/connectivity/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/connectivity/index.html @@ -1 +1 @@ -QuecManager
                    \ No newline at end of file +QuecManager
                      \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/connectivity/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/connectivity/index.txt index 45b7a00..f8aa3ce 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/connectivity/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/connectivity/index.txt @@ -13,8 +13,8 @@ d:I[39966,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","7780","static/ch 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","advanced-settings","connectivity",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["connectivity",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["connectivity",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","connectivity","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","DTnEPxio4LFqOIRh4jg54",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","advanced-settings","connectivity",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["connectivity",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["connectivity",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","connectivity","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","w8TAMqIS2JBthNV_YVtwR",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/mtu/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/mtu/index.html index 02977e8..561a1ec 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/mtu/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/mtu/index.html @@ -1 +1 @@ -QuecManager
                        \ No newline at end of file +QuecManager
                          \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/mtu/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/mtu/index.txt index 84b4463..6ebe650 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/mtu/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/mtu/index.txt @@ -13,8 +13,8 @@ d:I[34819,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","7780","static/ch 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","advanced-settings","mtu",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["mtu",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["mtu",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","mtu","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","ScZBASEMrtUqrI39H0niV",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","advanced-settings","mtu",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["mtu",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["mtu",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","mtu","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","cA5c4vNH7cwC7Joq-Y4Yd",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/ttl-settings/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/ttl-settings/index.html index 155dde3..f7e6c21 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/ttl-settings/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/ttl-settings/index.html @@ -1 +1 @@ -QuecManager
                            \ No newline at end of file +QuecManager
                              \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/ttl-settings/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/ttl-settings/index.txt index f88dd4d..e521ff7 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/ttl-settings/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/advanced-settings/ttl-settings/index.txt @@ -13,8 +13,8 @@ d:I[83143,["7780","static/chunks/7780-d44d1f6d676771d4.js","1630","static/chunks 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","advanced-settings","ttl-settings",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["ttl-settings",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["ttl-settings",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","ttl-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","llJFJ7mfZbQX4KYjHnA13",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","advanced-settings","ttl-settings",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["ttl-settings",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["ttl-settings",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","ttl-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","HdT6-waxZQsLw7x1rwFLT",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/band-locking/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/band-locking/index.html index 7ecd3e0..2acbc89 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/band-locking/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/band-locking/index.html @@ -1 +1 @@ -QuecManager
                                \ No newline at end of file +QuecManager
                                  \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/band-locking/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/band-locking/index.txt index e00d378..095c5b1 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/band-locking/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/band-locking/index.txt @@ -13,8 +13,8 @@ d:I[75808,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","7780","static/ch 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","cell-settings","band-locking",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["cell-settings",{"children":["band-locking",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["cell-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["band-locking",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children","band-locking","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","2Y24FMa69p9yW_OKggC-6",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","cell-settings","band-locking",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["cell-settings",{"children":["band-locking",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["cell-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["band-locking",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children","band-locking","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","I5l4teEHIa5cqKxE86yKb",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/basic-settings/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/basic-settings/index.html index fc5cf72..35ba7fa 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/basic-settings/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/basic-settings/index.html @@ -1 +1 @@ -QuecManager
                                    \ No newline at end of file +QuecManager
                                      \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/basic-settings/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/basic-settings/index.txt index ec0064d..d1587d5 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/basic-settings/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/basic-settings/index.txt @@ -13,8 +13,8 @@ d:I[46142,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","7780","static/ch 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","cell-settings","basic-settings",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["cell-settings",{"children":["basic-settings",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["cell-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["basic-settings",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children","basic-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","TWo8kQLQAE_sIuiA-dq55",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","cell-settings","basic-settings",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["cell-settings",{"children":["basic-settings",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["cell-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["basic-settings",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children","basic-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","rn7mp_whi-jobAxB20m3t",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/cell-locking/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/cell-locking/index.html index 0de3bd7..bdfebda 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/cell-locking/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/cell-locking/index.html @@ -1 +1 @@ -QuecManager
                                        \ No newline at end of file +QuecManager
                                          \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/cell-locking/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/cell-locking/index.txt index 3fe1554..9aede1b 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/cell-locking/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/cell-locking/index.txt @@ -13,8 +13,8 @@ d:I[19496,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","7780","static/ch 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","cell-settings","cell-locking",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["cell-settings",{"children":["cell-locking",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["cell-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["cell-locking",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children","cell-locking","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","rx4uHCwkz952NZVSiHHzU",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","cell-settings","cell-locking",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["cell-settings",{"children":["cell-locking",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["cell-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["cell-locking",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children","cell-locking","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","phyXo461-jaRS48xx1Jkp",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/imei-mangling/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/imei-mangling/index.html index 8dbdff4..7ae2225 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/imei-mangling/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/imei-mangling/index.html @@ -1 +1 @@ -QuecManager
                                            \ No newline at end of file +QuecManager
                                              \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/imei-mangling/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/imei-mangling/index.txt index 8c20a45..16c0992 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/imei-mangling/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/imei-mangling/index.txt @@ -13,8 +13,8 @@ d:I[70231,["7780","static/chunks/7780-d44d1f6d676771d4.js","8885","static/chunks 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","cell-settings","imei-mangling",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["cell-settings",{"children":["imei-mangling",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["cell-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["imei-mangling",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children","imei-mangling","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","NJz0A4i3VoodXZwAtTIsu",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","cell-settings","imei-mangling",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["cell-settings",{"children":["imei-mangling",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["cell-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["imei-mangling",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children","imei-mangling","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","k1fgfTjUyxtiLVHjAy59c",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/sms/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/sms/index.html index e150c1d..b0e7a50 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/sms/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/sms/index.html @@ -1 +1 @@ -QuecManager
                                                \ No newline at end of file +QuecManager
                                                  \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/sms/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/sms/index.txt index cb8892e..3b1c149 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/sms/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/cell-settings/sms/index.txt @@ -13,8 +13,8 @@ d:I[33776,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","7780","static/ch 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","cell-settings","sms",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["cell-settings",{"children":["sms",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["cell-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["sms",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children","sms","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","Ma0Wa-HkTE40td21wg4-O",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","cell-settings","sms",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["cell-settings",{"children":["sms",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["cell-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["sms",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","cell-settings","children","sms","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","5G7-X9ijwG_lbiG668Bul",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/cell-scanner/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/cell-scanner/index.html index c28ba0d..89cbe2d 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/cell-scanner/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/cell-scanner/index.html @@ -1 +1 @@ -QuecManager
                                                    \ No newline at end of file +QuecManager
                                                      \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/cell-scanner/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/cell-scanner/index.txt index 6de52a1..9c04bd7 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/cell-scanner/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/cell-scanner/index.txt @@ -8,13 +8,13 @@ 8:I[96609,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","7780","static/chunks/7780-d44d1f6d676771d4.js","8885","static/chunks/8885-1b9ab3cbb10cf437.js","7563","static/chunks/7563-33b7de2a93dcbe27.js","9464","static/chunks/9464-f5c3c85ad60907ac.js","9477","static/chunks/9477-215fa25b7251af44.js","6357","static/chunks/6357-9bebe3918fcef1e5.js","7414","static/chunks/7414-d6480d4dfb8a2ef8.js","4767","static/chunks/4767-88886265e4e59e78.js","1954","static/chunks/app/dashboard/layout-5311362b3a63fe81.js"],"default"] a:I[31753,["9477","static/chunks/9477-215fa25b7251af44.js","3075","static/chunks/app/dashboard/experimental/layout-6508e2a223029fa4.js"],"default"] c:I[5329,[],"ClientPageRoot"] -d:I[37277,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","2101","static/chunks/b1b46485-5c61721f784038c7.js","7780","static/chunks/7780-d44d1f6d676771d4.js","8885","static/chunks/8885-1b9ab3cbb10cf437.js","7563","static/chunks/7563-33b7de2a93dcbe27.js","9679","static/chunks/9679-e42f7aaecc29c6da.js","3048","static/chunks/3048-a6b509fac24a1f29.js","7231","static/chunks/7231-9bf29e950cdd6225.js","5014","static/chunks/app/dashboard/experimental/cell-scanner/page-a4709c7977b627a1.js"],"default"] +d:I[88388,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","2101","static/chunks/b1b46485-5c61721f784038c7.js","7780","static/chunks/7780-d44d1f6d676771d4.js","8885","static/chunks/8885-1b9ab3cbb10cf437.js","7563","static/chunks/7563-33b7de2a93dcbe27.js","9679","static/chunks/9679-e42f7aaecc29c6da.js","3048","static/chunks/3048-a6b509fac24a1f29.js","3453","static/chunks/3453-59569df86cb1327e.js","2394","static/chunks/2394-bec269701e2d0c16.js","5014","static/chunks/app/dashboard/experimental/cell-scanner/page-2c4956be7a457748.js"],"default"] 10:I[99165,[],"OutletBoundary"] 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","experimental","cell-scanner",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["experimental",{"children":["cell-scanner",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["experimental",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["cell-scanner",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children","cell-scanner","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","-VsjM1sVW_65u4kXCmmrZ",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","experimental","cell-scanner",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["experimental",{"children":["cell-scanner",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["experimental",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["cell-scanner",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children","cell-scanner","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","7hjQOimHf9dxD0FQquY-1",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/freq-calculator/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/freq-calculator/index.html index 40b24bc..dfa7a2c 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/freq-calculator/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/freq-calculator/index.html @@ -1 +1 @@ -QuecManager
                                                        \ No newline at end of file +QuecManager
                                                          \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/freq-calculator/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/freq-calculator/index.txt index 4d4536e..a28c695 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/freq-calculator/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/freq-calculator/index.txt @@ -8,13 +8,13 @@ 8:I[96609,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","7780","static/chunks/7780-d44d1f6d676771d4.js","8885","static/chunks/8885-1b9ab3cbb10cf437.js","7563","static/chunks/7563-33b7de2a93dcbe27.js","9464","static/chunks/9464-f5c3c85ad60907ac.js","9477","static/chunks/9477-215fa25b7251af44.js","6357","static/chunks/6357-9bebe3918fcef1e5.js","7414","static/chunks/7414-d6480d4dfb8a2ef8.js","4767","static/chunks/4767-88886265e4e59e78.js","1954","static/chunks/app/dashboard/layout-5311362b3a63fe81.js"],"default"] a:I[31753,["9477","static/chunks/9477-215fa25b7251af44.js","3075","static/chunks/app/dashboard/experimental/layout-6508e2a223029fa4.js"],"default"] c:I[5329,[],"ClientPageRoot"] -d:I[3099,["7780","static/chunks/7780-d44d1f6d676771d4.js","9007","static/chunks/9007-7f45a2e4a42c9be9.js","666","static/chunks/app/dashboard/experimental/freq-calculator/page-72839bc94c5707d7.js"],"default"] +d:I[14332,["7780","static/chunks/7780-d44d1f6d676771d4.js","3453","static/chunks/3453-59569df86cb1327e.js","5755","static/chunks/5755-b330e14a84ee51bb.js","666","static/chunks/app/dashboard/experimental/freq-calculator/page-76fc91defa16e132.js"],"default"] 10:I[99165,[],"OutletBoundary"] 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","experimental","freq-calculator",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["experimental",{"children":["freq-calculator",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["experimental",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["freq-calculator",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children","freq-calculator","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","o7VWYjimCCCFZCRLxFY0B",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","experimental","freq-calculator",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["experimental",{"children":["freq-calculator",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["experimental",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["freq-calculator",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children","freq-calculator","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","WFkxhM9vtqBB8f3DnNJXD",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/keep-alive/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/keep-alive/index.html index 5ef224f..1f42d2d 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/keep-alive/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/keep-alive/index.html @@ -1 +1 @@ -QuecManager
                                                            \ No newline at end of file +QuecManager
                                                              \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/keep-alive/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/keep-alive/index.txt index 9678ec6..eed37fb 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/keep-alive/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/keep-alive/index.txt @@ -13,8 +13,8 @@ d:I[53302,["7780","static/chunks/7780-d44d1f6d676771d4.js","3376","static/chunks 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","experimental","keep-alive",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["experimental",{"children":["keep-alive",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["experimental",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["keep-alive",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children","keep-alive","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","Jc6BKIfIAvXV2gGVtiA7o",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","experimental","keep-alive",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["experimental",{"children":["keep-alive",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["experimental",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["keep-alive",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children","keep-alive","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","nNAnT0dUxnVk-Ph9jYfei",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecprofiles/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecprofiles/index.html index 18ec19e..8355446 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecprofiles/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecprofiles/index.html @@ -1 +1 @@ -QuecManager
                                                                \ No newline at end of file +QuecManager
                                                                  \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecprofiles/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecprofiles/index.txt index b067460..b7bfc8c 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecprofiles/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecprofiles/index.txt @@ -13,8 +13,8 @@ d:I[22256,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","7780","static/ch 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","experimental","quecprofiles",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["experimental",{"children":["quecprofiles",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["experimental",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["quecprofiles",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children","quecprofiles","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","mX9IoPGvofCyUh35BvXKU",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","experimental","quecprofiles",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["experimental",{"children":["quecprofiles",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["experimental",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["quecprofiles",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children","quecprofiles","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","8vIgfmEVWfTGJjm3M-nNQ",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecwatch/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecwatch/index.html index 2010f17..b040c7c 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecwatch/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecwatch/index.html @@ -1 +1 @@ -QuecManager
                                                                    \ No newline at end of file +QuecManager
                                                                      \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecwatch/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecwatch/index.txt index 919bd58..5d6eeac 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecwatch/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/experimental/quecwatch/index.txt @@ -13,8 +13,8 @@ d:I[79824,["9980","static/chunks/7b0cf0b7-aa73cc75e53c5793.js","7780","static/ch 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","experimental","quecwatch",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["experimental",{"children":["quecwatch",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["experimental",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["quecwatch",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children","quecwatch","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","F6_JxCamNLO0up-1ooNFl",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","experimental","quecwatch",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["experimental",{"children":["quecwatch",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["experimental",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["quecwatch",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","experimental","children","quecwatch","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","ElzUMD5BvsKfchaBLPpgj",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/home/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/home/index.html index 72818bf..8d7f78b 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/home/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/home/index.html @@ -1 +1 @@ -QuecManager
                                                                        \ No newline at end of file +QuecManager
                                                                          \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/home/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/home/index.txt index de5806e..985bc9e 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/home/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/home/index.txt @@ -12,8 +12,8 @@ e:I[99165,[],"OutletBoundary"] 10:I[99165,[],"MetadataBoundary"] 12:I[99165,[],"ViewportBoundary"] 14:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","home",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["home",{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["home",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","home","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$La",null,{"Component":"$b","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@c","$@d"]}],null,["$","$Le",null,{"children":"$Lf"}]]}],{},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","GYJHm61crn73UefHwIPLZ",{"children":[["$","$L10",null,{"children":"$L11"}],["$","$L12",null,{"children":"$L13"}],null]}]]}],false]],"m":"$undefined","G":["$14","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","home",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["home",{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["home",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","home","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$La",null,{"Component":"$b","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@c","$@d"]}],null,["$","$Le",null,{"children":"$Lf"}]]}],{},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","U3UvBGQEqKu6QhYa39Aeu",{"children":[["$","$L10",null,{"children":"$L11"}],["$","$L12",null,{"children":"$L13"}],null]}]]}],false]],"m":"$undefined","G":["$14","$undefined"],"s":false,"S":true} 9:{} c:{} d:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/games/tetris/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/games/tetris/index.html index 4598884..748d85d 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/games/tetris/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/games/tetris/index.html @@ -1 +1 @@ -QuecManager
                                                                            \ No newline at end of file +QuecManager
                                                                              \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/games/tetris/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/games/tetris/index.txt index 790f4ab..d0ff529 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/games/tetris/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/games/tetris/index.txt @@ -13,8 +13,8 @@ d:I[69835,["5293","static/chunks/app/dashboard/settings/games/tetris/page-e289ae 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","settings","games","tetris",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["settings",{"children":["games",{"children":["tetris",{"children":["__PAGE__",{}]}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["games",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","settings","children","games","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["tetris",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","settings","children","games","children","tetris","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","H1PNDKs2SrYf3O9ZBQBcb",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","settings","games","tetris",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["settings",{"children":["games",{"children":["tetris",{"children":["__PAGE__",{}]}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["games",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","settings","children","games","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["tetris",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","settings","children","games","children","tetris","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","6vtC0dcYv-bf4zHwoY17i",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/security/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/security/index.html index 710e446..b004103 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/security/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/security/index.html @@ -1 +1 @@ -QuecManager
                                                                                \ No newline at end of file +QuecManager
                                                                                  \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/security/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/security/index.txt index a5f3ea4..bcb6b11 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/security/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/dashboard/settings/security/index.txt @@ -13,8 +13,8 @@ d:I[16212,["7780","static/chunks/7780-d44d1f6d676771d4.js","2162","static/chunks 12:I[99165,[],"MetadataBoundary"] 14:I[99165,[],"ViewportBoundary"] 16:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","dashboard","settings","security",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["settings",{"children":["security",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["security",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","settings","children","security","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","OEnv4zQg6abQWeUBOn0ly",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","dashboard","settings","security",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["settings",{"children":["security",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["security",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","settings","children","security","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","RQdZxJ6HUnmyI7JAynOFO",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true} 9:{} b:{} e:{} diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/index.txt index cec3d93..6f68662 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/index.txt @@ -9,8 +9,8 @@ a:I[99165,[],"MetadataBoundary"] c:I[99165,[],"ViewportBoundary"] e:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["",""],"i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","div",null,{"className":"grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20","children":["$","main",null,{"className":"flex flex-col gap-8 row-start-2 items-center sm:items-start","children":["$","$L7",null,{}]}]}],null,["$","$L8",null,{"children":"$L9"}]]}],{},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","LIKIBNcokoL2mkUy0j-Fc",{"children":[["$","$La",null,{"children":"$Lb"}],["$","$Lc",null,{"children":"$Ld"}],null]}]]}],false]],"m":"$undefined","G":["$e","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["",""],"i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","div",null,{"className":"grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20","children":["$","main",null,{"className":"flex flex-col gap-8 row-start-2 items-center sm:items-start","children":["$","$L7",null,{}]}]}],null,["$","$L8",null,{"children":"$L9"}]]}],{},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","1YKPZGFRsFkKFW32s64Fu",{"children":[["$","$La",null,{"children":"$Lb"}],["$","$Lc",null,{"children":"$Ld"}],null]}]]}],false]],"m":"$undefined","G":["$e","$undefined"],"s":false,"S":true} d:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] b:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"QuecManager"}],["$","meta","2",{"name":"description","content":"Simpleadmin but better!"}],["$","link","3",{"rel":"icon","href":"/favicon.ico","type":"image/x-icon","sizes":"16x16"}]] 9:null diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/login.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/login.html index dde4cdc..1b0cfd5 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/login.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/login.html @@ -1 +1 @@ -QuecManager

                                                                                  QuecManager Quick Stats

                                                                                    \ No newline at end of file +QuecManager

                                                                                    QuecManager Quick Stats

                                                                                      \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/login/index.html b/ipk-source/sdxpinn-quecmanager-beta/root/www/login/index.html index 8d1596b..62786b8 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/login/index.html +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/login/index.html @@ -1 +1 @@ -QuecManager

                                                                                      Login to QuecManager

                                                                                      Enter your password to login

                                                                                        \ No newline at end of file +QuecManager

                                                                                        Login to QuecManager

                                                                                        Enter your password to login

                                                                                          \ No newline at end of file diff --git a/ipk-source/sdxpinn-quecmanager-beta/root/www/login/index.txt b/ipk-source/sdxpinn-quecmanager-beta/root/www/login/index.txt index 92b7e79..5022dfe 100644 --- a/ipk-source/sdxpinn-quecmanager-beta/root/www/login/index.txt +++ b/ipk-source/sdxpinn-quecmanager-beta/root/www/login/index.txt @@ -10,8 +10,8 @@ b:I[99165,[],"OutletBoundary"] d:I[99165,[],"MetadataBoundary"] f:I[99165,[],"ViewportBoundary"] 11:I[25339,[],""] -:HL["/_next/static/css/562f52882551f4eb.css","style"] -0:{"P":null,"b":"Kt0Xe6YYT_RuYVm3o2asX","p":"","c":["","login",""],"i":false,"f":[[["",{"children":["login",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/562f52882551f4eb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["login",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","login","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L7",null,{"Component":"$8","searchParams":{},"params":{},"promises":["$@9","$@a"]}],null,["$","$Lb",null,{"children":"$Lc"}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","4JR9F3aa3l05N6T3PMqQ4",{"children":[["$","$Ld",null,{"children":"$Le"}],["$","$Lf",null,{"children":"$L10"}],null]}]]}],false]],"m":"$undefined","G":["$11","$undefined"],"s":false,"S":true} +:HL["/_next/static/css/2adbd6ec1a3f6224.css","style"] +0:{"P":null,"b":"xeZlQ8jLyR2FPwewgDcLc","p":"","c":["","login",""],"i":false,"f":[[["",{"children":["login",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2adbd6ec1a3f6224.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["login",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","login","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L7",null,{"Component":"$8","searchParams":{},"params":{},"promises":["$@9","$@a"]}],null,["$","$Lb",null,{"children":"$Lc"}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","063bJU18LbX0VncYakg-S",{"children":[["$","$Ld",null,{"children":"$Le"}],["$","$Lf",null,{"children":"$L10"}],null]}]]}],false]],"m":"$undefined","G":["$11","$undefined"],"s":false,"S":true} 9:{} a:{} 10:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]