@3deye-toolkit/core 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.d.ts CHANGED
@@ -30,34 +30,7 @@ declare class AccountStore extends ApiStore {
30
30
  updateCustomPreferences: (preferences: Partial<Preferences>) => Observable<RawUser>;
31
31
  setDefaultGroup(groupId: number): Observable<RawUser> | undefined;
32
32
  get preferences(): Preferences;
33
- getPreference: <T extends (PREFERENCES.UTC | PREFERENCES.HOUR12 | PREFERENCES.START_OF_WEEK) | (PREFERENCES.DEFAULT_VIDEO_RESIZE_MODE | PREFERENCES.RESIZE_MODE_PER_CAMERA | PREFERENCES.FISHEYE_CAMERAS)>(key: T) => {
34
- utc: boolean;
35
- hour12: boolean;
36
- startOfWeek: "monday" | "sunday";
37
- defaultVideoResizeMode?: VideoResizeMode | undefined;
38
- camerasResizeMode?: [number, VideoResizeMode][] | undefined;
39
- fisheyeCameras?: [number, [number, number, number] | {
40
- params: {
41
- x: number;
42
- y: number;
43
- r: number;
44
- s: number;
45
- };
46
- positions?: [{
47
- lat: number;
48
- lon: number;
49
- fov: number;
50
- }, {
51
- lat: number;
52
- lon: number;
53
- fov: number;
54
- }, {
55
- lat: number;
56
- lon: number;
57
- fov: number;
58
- }] | undefined;
59
- } | null][] | undefined;
60
- }[T];
33
+ getPreference: <T extends keyof Preferences>(key: T) => Preferences[T];
61
34
  private retryOnVersionMismatch;
62
35
  }
63
36
 
@@ -115,6 +88,18 @@ declare abstract class ApiStore {
115
88
  dispose(): void;
116
89
  }
117
90
 
91
+ declare interface App {
92
+ cameras: CamerasStore;
93
+ archives: ArchivesStore;
94
+ events: EventsStore;
95
+ eventSchema: EventSchemaStore;
96
+ thumbnails: ThumbnailsStore;
97
+ account: AccountStore;
98
+ notification: NotificationService;
99
+ auth: Auth;
100
+ api: Api<IApi> & IApi;
101
+ }
102
+
118
103
  /**
119
104
  * @alpha
120
105
  */
@@ -264,7 +249,7 @@ declare class Camera {
264
249
  get supportsWebRTC(): boolean;
265
250
  constructor(raw: RawCamera);
266
251
  update: (raw: RawCamera) => void;
267
- can: (permission: CameraPermissions) => number;
252
+ can: (permission: CameraPermissions) => boolean;
268
253
  }
269
254
 
270
255
  declare interface CameraAddress {
@@ -357,44 +342,6 @@ declare interface ChunksQuery {
357
342
  to: Date;
358
343
  }
359
344
 
360
- declare class Clip {
361
- id: number;
362
- cameraId: number;
363
- name: string;
364
- startTime: Date;
365
- endTime: Date;
366
- type: 'Archive' | 'Timelaps' | 'Timelaps to do';
367
- createdAt: Date;
368
- /**
369
- * clip duration in seconds
370
- */
371
- duration: number;
372
- chunks: ArchiveChunk[];
373
- clipUrl?: string;
374
- description: string;
375
- version: string;
376
- raw: RawClip;
377
- isDownloading: boolean;
378
- archives?: ArchiveChunk[];
379
- constructor(raw: RawClip);
380
- get isTimelapse(): boolean;
381
- update(raw: RawClip): void;
382
- }
383
-
384
- declare interface ClipParams {
385
- cameraId: number;
386
- startTime: Date;
387
- endTime: Date;
388
- name: string;
389
- description?: string;
390
- }
391
-
392
- declare interface ClipsQuery {
393
- cameraId: number;
394
- from: Date;
395
- to: Date;
396
- }
397
-
398
345
  declare interface Connection {
399
346
  state: CONNECTION_STATE;
400
347
  stop: () => void;
@@ -439,8 +386,8 @@ declare type DetectedObject = Car | LicensePlate | {
439
386
  };
440
387
 
441
388
  declare interface DetectedObjectOption {
442
- id: string;
443
- name: string;
389
+ value: string;
390
+ label: string;
444
391
  color: string;
445
392
  highlightColor: string;
446
393
  type: 'detectedObject';
@@ -641,7 +588,7 @@ declare interface IApi {
641
588
  UpdateCamgroup: (params: any) => Observable<ApiResult<RawCamgroup>>;
642
589
  };
643
590
  sound: {
644
- GetPushSoundServiceUrl: (id: number) => Observable<any>;
591
+ GetPushSoundServiceUrl: (id: number) => Observable<ApiResult<string>>;
645
592
  };
646
593
  thumbnails: {
647
594
  GetThumbnailsInfo: (params: {
@@ -673,6 +620,7 @@ declare interface InitParams {
673
620
  widgetId: string;
674
621
  widgetToken: string;
675
622
  };
623
+ clientId?: string;
676
624
  tokenStorage?: Storage_2;
677
625
  tokenStorageKey?: string;
678
626
  apiUrl?: string;
@@ -693,42 +641,6 @@ declare type IntervalState = {
693
641
  request: Observable<Thumbnail[]>;
694
642
  };
695
643
 
696
- declare class LibraryStore extends ApiStore {
697
- private notification?;
698
- data: crossfilter.Crossfilter<Clip>;
699
- clipsByCameraId: crossfilter.Dimension<Clip, number>;
700
- clipsByCreationDate: crossfilter.Dimension<Clip, number>;
701
- clipsByStart: crossfilter.Dimension<Clip, number>;
702
- clipsByEnd: crossfilter.Dimension<Clip, number>;
703
- clipsByType: crossfilter.Dimension<Clip, string>;
704
- clipsById: crossfilter.Dimension<Clip, number>;
705
- clipsMap: Map<number, Clip>;
706
- loaded: boolean;
707
- loading: boolean;
708
- updates: number;
709
- constructor(notification?: NotificationService | undefined);
710
- /**
711
- * Fetches all clips from the server and updates the store
712
- */
713
- fetch(): Observable<Clip[]>;
714
- add: (clips: Clip[]) => void;
715
- addOrUpdate: (clips: Clip[]) => void;
716
- removeFromStore: (clips: {
717
- id: number;
718
- }[]) => void;
719
- getClips({ cameraId, from, to }: ClipsQuery): Clip[];
720
- getTimelapses(): Clip[];
721
- getRecentlyAdded(): Clip[];
722
- all(): Clip[];
723
- getOnly(type: 'clips' | 'timelapses' | null, sortDirection?: 'asc' | 'desc'): Clip[];
724
- createClip: (data: ClipParams) => void;
725
- createTimelapse: (data: TimelapseParams) => void;
726
- rename(clip: Clip, name: string): void;
727
- delete(clip: Clip): void;
728
- protected afterInit(): void;
729
- dispose(): void;
730
- }
731
-
732
644
  declare interface LicensePlate {
733
645
  Type: 'LicensePlate';
734
646
  Value: string;
@@ -804,20 +716,11 @@ declare interface PendingRequest_2 {
804
716
  request: Observable<Thumbnail[]>;
805
717
  }
806
718
 
807
- declare enum PREFERENCES {
808
- DEFAULT_VIDEO_RESIZE_MODE = "defaultVideoResizeMode",
809
- RESIZE_MODE_PER_CAMERA = "camerasResizeMode",
810
- FISHEYE_CAMERAS = "fisheyeCameras",
811
- UTC = "utc",
812
- HOUR12 = "hour12",
813
- START_OF_WEEK = "startOfWeek"
814
- }
815
-
816
719
  declare type Preferences = z.infer<typeof preferencesSchema>;
817
720
 
818
721
  declare const preferencesSchema: z.ZodObject<{
819
- defaultVideoResizeMode: z.ZodOptional<z.ZodNativeEnum<typeof VideoResizeMode>>;
820
- camerasResizeMode: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNativeEnum<typeof VideoResizeMode>], null>, "many">>;
722
+ defaultVideoResizeMode: z.ZodOptional<z.ZodEnum<["fill", "contain"]>>;
723
+ camerasResizeMode: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodEnum<["fill", "contain"]>], null>, "many">>;
821
724
  fisheyeCameras: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
822
725
  params: z.ZodObject<{
823
726
  x: z.ZodNumber;
@@ -827,13 +730,13 @@ declare const preferencesSchema: z.ZodObject<{
827
730
  }, "strip", z.ZodTypeAny, {
828
731
  x: number;
829
732
  y: number;
830
- r: number;
831
733
  s: number;
734
+ r: number;
832
735
  }, {
833
736
  x: number;
834
737
  y: number;
835
- r: number;
836
738
  s: number;
739
+ r: number;
837
740
  }>;
838
741
  positions: z.ZodOptional<z.ZodTuple<[z.ZodObject<{
839
742
  lat: z.ZodNumber;
@@ -876,8 +779,8 @@ declare const preferencesSchema: z.ZodObject<{
876
779
  params: {
877
780
  x: number;
878
781
  y: number;
879
- r: number;
880
782
  s: number;
783
+ r: number;
881
784
  };
882
785
  positions?: [{
883
786
  lat: number;
@@ -896,8 +799,8 @@ declare const preferencesSchema: z.ZodObject<{
896
799
  params: {
897
800
  x: number;
898
801
  y: number;
899
- r: number;
900
802
  s: number;
803
+ r: number;
901
804
  };
902
805
  positions?: [{
903
806
  lat: number;
@@ -920,14 +823,14 @@ declare const preferencesSchema: z.ZodObject<{
920
823
  utc: boolean;
921
824
  hour12: boolean;
922
825
  startOfWeek: "monday" | "sunday";
923
- defaultVideoResizeMode?: VideoResizeMode | undefined;
924
- camerasResizeMode?: [number, VideoResizeMode][] | undefined;
925
- fisheyeCameras?: [number, [number, number, number] | {
826
+ defaultVideoResizeMode?: "contain" | "fill" | undefined;
827
+ camerasResizeMode?: [number, "contain" | "fill"][] | undefined;
828
+ fisheyeCameras?: [number, {
926
829
  params: {
927
830
  x: number;
928
831
  y: number;
929
- r: number;
930
832
  s: number;
833
+ r: number;
931
834
  };
932
835
  positions?: [{
933
836
  lat: number;
@@ -942,16 +845,16 @@ declare const preferencesSchema: z.ZodObject<{
942
845
  lon: number;
943
846
  fov: number;
944
847
  }] | undefined;
945
- } | null][] | undefined;
848
+ } | [number, number, number] | null][] | undefined;
946
849
  }, {
947
- defaultVideoResizeMode?: VideoResizeMode | undefined;
948
- camerasResizeMode?: [number, VideoResizeMode][] | undefined;
949
- fisheyeCameras?: [number, [number, number, number] | {
850
+ defaultVideoResizeMode?: "contain" | "fill" | undefined;
851
+ camerasResizeMode?: [number, "contain" | "fill"][] | undefined;
852
+ fisheyeCameras?: [number, {
950
853
  params: {
951
854
  x: number;
952
855
  y: number;
953
- r: number;
954
856
  s: number;
857
+ r: number;
955
858
  };
956
859
  positions?: [{
957
860
  lat: number;
@@ -966,7 +869,7 @@ declare const preferencesSchema: z.ZodObject<{
966
869
  lon: number;
967
870
  fov: number;
968
871
  }] | undefined;
969
- } | null][] | undefined;
872
+ } | [number, number, number] | null][] | undefined;
970
873
  utc?: boolean | undefined;
971
874
  hour12?: boolean | undefined;
972
875
  startOfWeek?: "monday" | "sunday" | undefined;
@@ -1293,10 +1196,6 @@ declare class ThumbnailsStore extends ApiStore {
1293
1196
  }) => Thumbnail;
1294
1197
  }
1295
1198
 
1296
- declare type TimelapseParams = ClipParams & {
1297
- duration: number;
1298
- };
1299
-
1300
1199
  declare class Token {
1301
1200
  accessToken: string;
1302
1201
  accessTokenExpires: Date;
@@ -1315,7 +1214,7 @@ declare class Token {
1315
1214
  constructor(raw: RawToken);
1316
1215
  }
1317
1216
 
1318
- declare class ToolkitApp {
1217
+ declare class ToolkitApp implements App {
1319
1218
  readonly name: string;
1320
1219
  initialized: boolean;
1321
1220
  cameras: CamerasStore;
@@ -1325,13 +1224,12 @@ declare class ToolkitApp {
1325
1224
  thumbnails: ThumbnailsStore;
1326
1225
  account: AccountStore;
1327
1226
  notification: NotificationService;
1328
- library: LibraryStore;
1329
1227
  auth: Auth;
1330
1228
  api: Api<IApi> & IApi;
1331
1229
  private disposables;
1332
1230
  private tokenUpdateReactions;
1333
1231
  constructor(name: string);
1334
- init({ token, tokenStorage: storage, tokenStorageKey, apiUrl, tokenServiceUrl }: InitParams, name?: string): ToolkitApp;
1232
+ init({ clientId, token, tokenStorage: storage, tokenStorageKey, apiUrl, tokenServiceUrl }: InitParams, name?: string): ToolkitApp;
1335
1233
  dispose: () => void;
1336
1234
  /**
1337
1235
  * Adds a reaction to token changes
@@ -1344,9 +1242,4 @@ declare class ToolkitApp {
1344
1242
 
1345
1243
  declare type User = RawUser;
1346
1244
 
1347
- declare enum VideoResizeMode {
1348
- Fit = "contain",
1349
- Stretch = "fill"
1350
- }
1351
-
1352
1245
  export { }
package/dist/core.js CHANGED
@@ -1 +1 @@
1
- import{reaction as e,computed as t,observe as r,runInAction as i,makeObservable as n,observable as a,action as s,when as o}from"mobx";import{Subject as l,BehaviorSubject as u,switchMap as c,EMPTY as d,timer as h,filter as f,delay as b,take as p,mergeMap as v,catchError as m,throwError as y,takeUntil as g,Observable as w,of as O,retry as j,startWith as I,pairwise as P,concatMap as A,Subscription as T,shareReplay as k,skip as S,exhaustMap as C,map as B}from"rxjs";import E from"jqueryless-signalr";import{StatusCodes as _}from"http-status-codes";import{mergeMap as R,shareReplay as N,retry as D,filter as U,map as q,tap as M,expand as F,last as x,share as z}from"rxjs/operators";import{z as W}from"zod";import"@react-spring/web";import"backoff-rxjs";import"transformation-matrix";import L from"crossfilter2";import G from"string-natural-compare";import V from"i18next";import $ from"react";const H={archives:{PopulateArchive:null,GetArchives:null,GetClips:null,UpdateClip:null,DeleteClip:null,SaveClip:null,SaveTimelaps:null,SaveArchive:null,DeleteArchive:null,ShareClip:null,GetSharedClips:null,UpdateSharedClip:null,DeleteSharedClip:null},cameras:{GetCameras:null,UpdateCamera:null,GetSensorDataSchema:null,GetSensorEvents:null,GetSensorEventsPage:null,GetLicensePlateLookUp:null,GetSensorEventsLprPage:null,GetPeopleCountingData:null,AddUserSensorEvent:null,AcknowledgeSensorEvent:null,MoveCamera:null,MoveCameraContinuousStart:null,MoveCameraContinuousStop:null,GoHomePtzCamera:null,SetHomePtzCamera:null},camgroups:{GetCamgroups:null,DeleteCamgroup:null,AddCamgroup:null,UpdateCamgroup:null},sound:{GetPushSoundServiceUrl:null},thumbnails:{GetThumbnailsInfo:null,GetThumbnailInfo:null,GetHeatMapsInfo:null},users:{GetUser:null,UserUpdateProfile:null}},K={cameras:[{name:"OnCameraMotionEvent",explicit:!0},{name:"OnCameraAdded"},{name:"OnCameraUpdated"},{name:"OnSystemCameraUpdated"},{name:"OnCameraDeleted"}],users:[{name:"OnUserUpdateProfile"}],camgroups:[{name:"OnAdd"},{name:"OnUpdate"},{name:"OnDelete"}],archives:[{name:"OnTimelapsAdded"},{name:"OnClipAdded"},{name:"OnClipUpdated"},{name:"OnClipDeleted"},{name:"OnArchiveAdded"},{name:"OnArchiveUpdated"},{name:"OnArchiveDeleted"},{name:"OnArchiveRecordCreated"}]};var Y,J,Z,Q,X;!function(e){e[e.CONNECTING=0]="CONNECTING",e[e.CONNECTED=1]="CONNECTED",e[e.RECONNECTING=2]="RECONNECTING",e[e.DISCONNECTED=3]="DISCONNECTED"}(Y||(Y={})),function(e){e[e.INFO=0]="INFO",e[e.WARN=1]="WARN",e[e.ERROR=2]="ERROR"}(J||(J={}));class ee{static create(e,t,r){return new ee(null!==e?e:H,t,r)}constructor(t,r,i){Object.defineProperty(this,"connectionShutdown$",{enumerable:!0,configurable:!0,writable:!0,value:new l}),Object.defineProperty(this,"connection$",{enumerable:!0,configurable:!0,writable:!0,value:new u(null)}),Object.defineProperty(this,"events",{enumerable:!0,configurable:!0,writable:!0,value:new l}),Object.defineProperty(this,"logLevel",{enumerable:!0,configurable:!0,writable:!0,value:J.ERROR}),Object.defineProperty(this,"authStore",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"createConnection",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"apiConfig",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"log",{enumerable:!0,configurable:!0,writable:!0,value:(e,...t)=>{if(e<this.logLevel)return;console[["log","warn","error"][e]](...t)}}),Object.defineProperty(this,"createHubMethod",{enumerable:!0,configurable:!0,writable:!0,value:(e,t)=>{const r=(...i)=>this.connection$.pipe(f(Boolean),f((e=>e.state===Y.CONNECTED)),p(1)).pipe(v((r=>new Promise(((n,a)=>{r.proxies[e].invoke(t,...i).done((e=>n(e))).fail((e=>a(e)))})))),m((e=>e instanceof Error&&e.message&&("Connection started reconnecting before invocation result was received."===e.message||"Connection was disconnected before invocation result was received."===e.message)?(this.log(J.WARN,e.message),r(...i)):e instanceof Error&&e.message&&e.message.startsWith("Caller is not authorized to invoke the ")?(this.log(J.WARN,e.message),this.connection$.getValue().stop(),this.authStore.invalidateToken(),r(...i)):y((()=>e)))),g(this.connectionShutdown$));return r}}),Object.defineProperty(this,"subscribeToEvents",{enumerable:!0,configurable:!0,writable:!0,value:e=>{Object.entries(K).forEach((([t,r])=>{r&&e.proxies[t]&&e.state===Y.CONNECTED&&r.filter((({explicit:e})=>e)).forEach((({name:r})=>{e.proxies[t].invoke("SubscribeToEvent",r)}))}))}}),this.apiConfig=t,this.init(),this.createConnection=i,this.authStore=r,e((()=>r.token),(e=>{if(!e)return void this.shutdownConnection();if(e.invalid)return;if(!e.accessToken)return;const t=this.connection$.getValue();t&&t.state!==Y.DISCONNECTED?t.qs.access_token=e.accessToken:this.connect(e)})),this.connection$.pipe(c((e=>null!==e||!r.isAuthenticated||r.token&&r.token.invalid?d:(this.log(J.WARN,"disconnected by some reason"),h(5e3)))),f((()=>r.isAuthenticated&&!!r.token&&!r.token.invalid))).subscribe((()=>{this.connect(r.token),this.log(J.WARN,"attempting to reconnect")})),this.connection$.pipe(f(Boolean),b(100)).subscribe(this.subscribeToEvents)}connect(e){if(this.connection$.getValue()&&this.connection$.getValue().state===Y.CONNECTED)return;const{accessToken:t}=e,r=this.createConnection(t);Object.keys(this.apiConfig).forEach((e=>r.createHubProxy(e))),Object.entries(K).forEach((([e,t])=>{t&&r.proxies[e]&&t.forEach((({name:t})=>{r.proxies[e].on(t,(r=>this.events.next({hub:e,event:t,data:r})))}))})),r.start().done((()=>{this.log(J.INFO,"connected"),this.connection$.next(r)})).fail((e=>{var t,r,i;!e.source||401!==(null===(t=e.source)||void 0===t?void 0:t.status)&&403!==(null===(r=e.source)||void 0===r?void 0:r.status)&&409!==(null===(i=e.source)||void 0===i?void 0:i.status)||this.authStore.invalidateToken(),this.log(J.ERROR,"connection failed",e)})),r.error((e=>{if(e.source&&(401===e.source.status||403===e.source.status||409===e.source.status))return this.log(J.WARN,"authentication error, invalidating token"),this.authStore.invalidateToken();this.log(J.ERROR,"connection error",e)})),r.disconnected((()=>{this.connection$.getValue()?this.log(J.WARN,"disconnected",this.connection$.getValue().lastError):this.log(J.WARN,"disconnected. this connection is already null"),this.connection$.next(null)})),r.reconnecting((()=>this.log(J.WARN,"reconnecting"))),r.reconnected((()=>{this.connection$.getValue()===r&&(this.log(J.WARN,"reconnected"),this.connection$.next(r))}))}shutdownConnection(){const e=this.connection$.getValue();e&&e.stop(),this.connectionShutdown$.next(null)}init(){Object.keys(this.apiConfig).forEach((e=>{this[e]={},Object.keys(this.apiConfig[e]).forEach((t=>{this[e][t]=this.createHubMethod(e,t)}))}))}}class te{constructor(e){Object.defineProperty(this,"accessToken",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"accessTokenExpires",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"accessTokenIssued",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clientId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"expiresIn",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"refreshToken",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"refreshTokenExpires",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"refreshTokenIssued",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tokenType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"userName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"invalid",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"widgetId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"widgetToken",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"json",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.json=e,this.accessToken=e.access_token||e.accessToken,this.accessTokenExpires=new Date(e.access_token_expires||e.accessTokenExpires),this.accessTokenIssued=new Date(e.access_token_issued||e.accessTokenIssued),this.clientId=e.client_id||e.clientId,this.expiresIn=e.expires_in||e.expiresIn,this.refreshToken=e.refresh_token||e.refreshToken,this.refreshTokenExpires=new Date(e.refresh_token_expires||e.refreshTokenExpires),this.refreshTokenIssued=new Date(e.refresh_token_issued||e.refreshTokenIssued),this.tokenType=e.token_type||e.tokenType,this.userName=e.userName,this.widgetId=e.widgetId,this.widgetToken=e.widgetToken,this.invalid=!1}}class re{get isAuthenticated(){return Boolean(this.token&&!this.isAuthenticating)}constructor({tokenServiceUrl:e,storage:o,tokenStorageKey:l,deviceInfo:u,clientId:b}){Object.defineProperty(this,"token",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"isAuthenticating",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"storage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tokenServiceUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tokenStorageKey",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"deviceInfo",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clientId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingUpdateTokenRequest",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"signOut",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.isAuthenticating||i((()=>this.token=null))}}),Object.defineProperty(this,"signIn",{enumerable:!0,configurable:!0,writable:!0,value:e=>{if(this.isAuthenticating)return;i((()=>this.isAuthenticating=!0)),!1===e.agreedWithTerms&&(e={...e,agreedWithTerms:void 0});return this.fetchToken(e).then((e=>(i((()=>{this.token=e,this.isAuthenticating=!1})),e))).catch((e=>{throw i((()=>{this.isAuthenticating=!1})),e}))}}),Object.defineProperty(this,"signInWithToken",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.isAuthenticating?console.warn("Attempt to sign in with token while authenticating"):i((()=>{this.token=new te(e)}))}}),Object.defineProperty(this,"invalidateToken",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.token&&i((()=>{this.token={...this.token,invalid:!0}}))}}),n(this,{token:a.ref,isAuthenticating:a,isAuthenticated:t,signOut:s,invalidateToken:s}),this.isAuthenticating=!0,this.storage=o,this.tokenServiceUrl=e,this.tokenStorageKey=l,this.deviceInfo=u,this.clientId=b;const p=function(e,i=!1){const n=t(e);return new w((e=>{const t=r(n,(({newValue:t})=>e.next(t)),i);return()=>t()}))}((()=>this.token)),g=p.pipe(c((e=>{if(null===e)return d;const t=O(e).pipe(v((e=>e.widgetId?this.fetchWidgetToken(e):this.updateToken(e.refreshToken))),j({delay:(e,t)=>e.status&&![500,502,503,504].includes(e.status)?y((()=>e)):h(2**Math.min(t+1,6)*1e3)}));if(!e.invalid){const r=Math.max(.75*(+e.accessTokenExpires-Date.now()),0);return h(r).pipe(v((()=>t)))}return t})),m((e=>(console.error(e),i((()=>this.token=null)),g))));g.subscribe((e=>{i((()=>this.token=e))})),p.pipe(I(null),P(),f((([e,t])=>!!(t||!t&&e))),A((([,e])=>this.storeToken(e)))).subscribe(),this.getInitialToken().then((e=>{i((()=>{this.token=e,this.isAuthenticating=!1}))}))}async getTokenFromStorage(){const e=await this.storage.getItem(this.tokenStorageKey);return e?new te(JSON.parse(e)):null}async storeToken(e){return!e||e.invalid?this.storage.removeItem(this.tokenStorageKey):this.storage.setItem(this.tokenStorageKey,JSON.stringify(e.json))}async getInitialToken(){const e=await this.getTokenFromStorage();return e||null}async fetchToken(e){const t={clientId:this.clientId,device:this.deviceInfo,...e},r=new Headers;r.append("Content-Type","application/json"),r.append("accept","application/json");const i=await fetch(this.tokenServiceUrl,{method:"POST",headers:r,body:JSON.stringify(t)});try{const e=await i.json();return 200!==i.status?Promise.reject({status:i.status,data:e}):new te(e)}catch(e){return Promise.reject(i)}}async updateToken(e){var t;try{return this.pendingUpdateTokenRequest&&this.pendingUpdateTokenRequest.refreshToken===e||(this.pendingUpdateTokenRequest={refreshToken:e,request:this.fetchToken({refreshToken:e})}),await this.pendingUpdateTokenRequest.request}finally{(null===(t=this.pendingUpdateTokenRequest)||void 0===t?void 0:t.refreshToken)===e&&(this.pendingUpdateTokenRequest=null)}}async fetchWidgetToken(e){const{widgetId:t,widgetToken:r}=e;if(!t||!r)throw new Error("token must contain widgetId and widgetToken");const i={widgetId:t,widgetToken:r},n=new Headers;n.append("Content-Type","application/json"),n.append("accept","application/json");const a=await fetch(this.tokenServiceUrl,{method:"POST",headers:n,body:JSON.stringify(i)});try{const e=await a.json();return 200!==a.status?Promise.reject({status:a.status,data:e}):new te({widgetId:t,widgetToken:r,...e})}catch(e){return Promise.reject(a)}}}!function(e){e[e.Motion=0]="Motion",e[e.Tampering=1]="Tampering",e[e.PanTiltZoom=2]="PanTiltZoom",e[e.CrossLine=3]="CrossLine",e[e.Intrusion=4]="Intrusion",e[e.LicensePlate=5]="LicensePlate",e[e.FaceDetection=6]="FaceDetection",e[e.Audio=7]="Audio",e[e.Analytic=8]="Analytic",e[e.SpeedDetection=9]="SpeedDetection",e[e.PeopleCounter=10]="PeopleCounter",e[e.Temperature=11]="Temperature",e[e.PoS=12]="PoS",e[e.GPS=13]="GPS",e[e.DigitalInput=14]="DigitalInput",e[e.Normal=15]="Normal",e[e.Suspicious=16]="Suspicious",e[e.Loitering=17]="Loitering",e[e.Vandalism=18]="Vandalism",e[e.Trespass=19]="Trespass",e[e.Emergency=20]="Emergency",e[e.LifeInDanger=21]="LifeInDanger",e[e.ErroneousAlert=22]="ErroneousAlert",e[e.Misidentification=23]="Misidentification",e[e.Fire=24]="Fire",e[e.MedicalDuress=25]="MedicalDuress",e[e.HoldUp=26]="HoldUp",e[e.CheckIn=27]="CheckIn",e[e.CheckOut=28]="CheckOut",e[e.ClockIn=29]="ClockIn",e[e.ClockOut=30]="ClockOut",e[e.ParkingStart=31]="ParkingStart",e[e.ParkingEnd=32]="ParkingEnd",e[e.ParkingViolation=33]="ParkingViolation",e[e.GateAccess=34]="GateAccess",e[e.DoorAccess=35]="DoorAccess",e[e.TemperatureCheck=36]="TemperatureCheck",e[e.IDCheck=37]="IDCheck",e[e.PPECheck=38]="PPECheck",e[e.WelfareCheck=39]="WelfareCheck",e[e.VehicleBreakIn=40]="VehicleBreakIn",e[e.DrugTrafficking=41]="DrugTrafficking",e[e.Assault=42]="Assault",e[e.PackageDelivery=43]="PackageDelivery",e[e.Uncategorized=999]="Uncategorized"}(Z||(Z={}));class ie{constructor(){Object.defineProperty(this,"values",{enumerable:!0,configurable:!0,writable:!0,value:new Map})}getItem(e){return this.values.get(e)||null}setItem(e,t){this.values.set(e,t)}removeItem(e){this.values.delete(e)}}class ne{constructor(){Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"disposables",{enumerable:!0,configurable:!0,writable:!0,value:[]})}initWith(e){this.api=e,this.afterInit&&this.afterInit()}dispose(){this.disposables.forEach((e=>{e instanceof T?e.closed||e.unsubscribe():e()}))}}!function(e){e.Initial="initial",e.InitiallyPaused="initially-paused",e.Playing="playing",e.Paused="paused",e.Reconnecting="reconnecting",e.Stalled="stalled",e.Error="error",e.Failed="failed"}(Q||(Q={})),function(e){e.Fit="contain",e.Stretch="fill"}(X||(X={}));const ae=W.object({lat:W.number(),lon:W.number(),fov:W.number()});var se,oe;!function(e){e.Ceiling="ceiling",e.Wall="wall"}(se||(se={})),function(e){e.DEFAULT_VIDEO_RESIZE_MODE="defaultVideoResizeMode",e.RESIZE_MODE_PER_CAMERA="camerasResizeMode",e.FISHEYE_CAMERAS="fisheyeCameras",e.UTC="utc",e.HOUR12="hour12",e.START_OF_WEEK="startOfWeek"}(oe||(oe={}));const le=W.nativeEnum(X),ue=W.object({params:W.object({x:W.number(),y:W.number(),r:W.number(),s:W.number()}),positions:W.tuple([ae,ae,ae]).optional()}),ce=W.tuple([W.number(),W.number(),W.number()]),de=W.object({[oe.DEFAULT_VIDEO_RESIZE_MODE]:le.optional(),[oe.RESIZE_MODE_PER_CAMERA]:W.array(W.tuple([W.number(),le])).optional(),[oe.FISHEYE_CAMERAS]:W.array(W.tuple([W.number(),W.union([ce,ue,W.null()])])).optional(),[oe.UTC]:W.boolean().default(!1),[oe.HOUR12]:W.boolean().default(!1),[oe.START_OF_WEEK]:W.enum(["monday","sunday"]).default("monday")});class he extends ne{constructor(e){super(),Object.defineProperty(this,"notification",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"user",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"auth",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"setUser",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.user=e}}),Object.defineProperty(this,"updateCustomPreferences",{enumerable:!0,configurable:!0,writable:!0,value:e=>{const t=O(null).pipe(R((()=>{if(!this.user)return y((()=>"user is not initialized"));const t={id:this.user.id,jsonField:JSON.stringify({...JSON.parse(this.user.jsonField||"{}"),...e}),version:this.user.version};return this.api.users.UserUpdateProfile(t)})),R((e=>e.success?O(e.resultItems[0]):y((()=>e.error)))),this.retryOnVersionMismatch(),N());return t.subscribe((e=>{this.setUser(e)})),t}}),Object.defineProperty(this,"getPreference",{enumerable:!0,configurable:!0,writable:!0,value:e=>this.preferences[e]}),Object.defineProperty(this,"retryOnVersionMismatch",{enumerable:!0,configurable:!0,writable:!0,value:()=>D({delay:(e,t)=>t>1?y((()=>e)):-4===(null==e?void 0:e.code)?this.loadUser$():y((()=>e))})}),n(this,{user:a.ref,setUser:s,userDisplayName:t,preferences:t,isSharingUserAccount:t})}get isSharingUserAccount(){var e;return(null===(e=this.user)||void 0===e?void 0:e.email.endsWith("@share.share"))||!1}get userDisplayName(){return this.user?this.user.firstName&&this.user.firstName.trim()||this.user.lastName&&this.user.lastName.trim()?[this.user.firstName,this.user.lastName].filter(Boolean).join(" ").trim():this.user.email:null}afterInit(){this.disposables.push(this.api.events.pipe(U((({hub:e,event:t})=>"users"===e&&"OnUserUpdateProfile"===t)),q((({data:e})=>e.resultItems[0]))).subscribe(this.setUser))}loadUser$(){return this.api.users.GetUser().pipe(R((e=>e.success?O(e.resultItems[0]):y((()=>e.error)))),M(this.setUser),N(1))}setAuthStore(t){this.auth=t,this.disposables.push(e((()=>this.auth.isAuthenticated),(()=>{this.auth.isAuthenticated&&this.loadUser$().subscribe()})))}async updateUserPassword(e){var t,r;const i=function(){throw new Error("Config not initialized")}().changePasswordUrl,n=null===(r=null===(t=this.auth)||void 0===t?void 0:t.token)||void 0===r?void 0:r.accessToken,a=JSON.stringify({currentPassword:e.previous,newPassword:e.new}),s=new Headers;s.append("content-type","application/json"),s.append("accept","application/json"),s.append("authorization",`bearer ${n}`);const o=await fetch(i,{method:"PUT",headers:s,body:a}),{status:l}=o;if(l!==_.OK){const e=await o.json();throw new Error(e.errors[0].message)}}updateUserSettings({firstName:e,lastName:t}){const r=O(null).pipe(R((()=>{if(!this.user)throw new Error("user is not initialized");return this.api.users.UserUpdateProfile({id:this.user.id,firstName:e,lastName:t,version:this.user.version})})),R((e=>e.success?O(e.resultItems[0]):y((()=>e.error)))),this.retryOnVersionMismatch(),N());return r.subscribe((e=>{this.setUser(e)})),r}updateUserLanguage(e){const t=O(null).pipe(R((()=>{if(!this.user)throw new Error("user is not initialized");return this.api.users.UserUpdateProfile({id:this.user.id,languageCode:e,version:this.user.version})})),R((e=>e.success?O(e.resultItems[0]):y((()=>e.error)))),this.retryOnVersionMismatch(),N());return t.subscribe((e=>{this.setUser(e)})),t}setDefaultGroup(e){const t=O(null).pipe(R((()=>{if(!this.user)return y((()=>"user is not initialized"));const t={id:this.user.id,layoutStartId:e,layoutStartType:"camgroup",version:this.user.version};return this.api.users.UserUpdateProfile(t)})),R((e=>e.success?O(e.resultItems[0]):y((()=>e.error)))),this.retryOnVersionMismatch(),N());return t.subscribe({next:e=>{var t;this.setUser(e),null===(t=this.notification)||void 0===t||t.success("Successfully set default group")},error:e=>{var t;console.error(e),null===(t=this.notification)||void 0===t||t.error(e.message)}}),t}get preferences(){var e;try{return de.parse(JSON.parse((null===(e=this.user)||void 0===e?void 0:e.jsonField)||"{}"))}catch(e){console.error(e)}return{[oe.DEFAULT_VIDEO_RESIZE_MODE]:void 0,[oe.RESIZE_MODE_PER_CAMERA]:void 0,[oe.FISHEYE_CAMERAS]:void 0,[oe.UTC]:!1,[oe.HOUR12]:!1,[oe.START_OF_WEEK]:"monday"}}}class fe{constructor(e){Object.defineProperty(this,"json",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"startTime",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"endTime",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"streamUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"duration",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isLive",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"cameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.json=JSON.stringify(e,null,2),this.startTime=new Date(e.startTime),this.endTime=new Date(e.endTime),this.streamUrl=e.streamUrl,this.cameraId=e.cameraId,this.duration=e.duration,this.id=e.id}}const be=5e-4;class pe extends ne{constructor(e){super(),Object.defineProperty(this,"camerasStore",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksById",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"pendingRequests",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervals",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"updates",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"getClosestChunkRight",{enumerable:!0,configurable:!0,writable:!0,value:({cameraId:e,time:t})=>{this.chunksByCameraId.filter(e),this.chunksByEnd.filter([t,1/0]);const r=this.chunksByStart.bottom(1);return this.chunksByCameraId.filterAll(),this.chunksByEnd.filterAll(),r[0]}}),Object.defineProperty(this,"getClosestChunkLeft",{enumerable:!0,configurable:!0,writable:!0,value:({cameraId:e,time:t})=>{this.chunksByCameraId.filter(e),this.chunksByStart.filter([-1/0,+t+be]);const r=this.chunksByStart.top(1);return this.chunksByCameraId.filterAll(),this.chunksByEnd.filterAll(),r[0]}}),Object.defineProperty(this,"fetchNextChunk",{enumerable:!0,configurable:!0,writable:!0,value:({cameraId:e,time:t})=>{if(this.knownIntervals.has(e)){const[r,i]=this.knownIntervals.get(e);if(r<=t&&i>=t){const r=this.getClosestChunkRight({cameraId:e,time:t});if(r)return O(r)}}return O({result:[],time:t}).pipe(F((({result:t,time:r})=>{if(t.length||r>=new Date)return d;const i=new Date(+r+36e5);return this.fetch(e,r,i).pipe(q((e=>({result:e,time:i}))))})),x(),q((()=>this.getClosestChunkRight({cameraId:e,time:t}))))}}),Object.defineProperty(this,"fetchPrevChunk",{enumerable:!0,configurable:!0,writable:!0,value:({cameraId:e,time:t})=>{if(this.knownIntervals.has(e)){const[r,i]=this.knownIntervals.get(e);if(r<=t&&i>=t){const r=this.getClosestChunkLeft({cameraId:e,time:t});if(r)return O(r)}}const r=this.camerasStore.camerasById.get(e);if(!r)return O(void 0);const i=new Date(Date.now()-3600*r.archiveDuration*1e3);return this.knownIntervals.get(e)&&this.knownIntervals.get(e)[0]<=i?O(void 0):O({result:[],time:t}).pipe(F((({result:t,time:r})=>{if(t.length||r<=i)return d;const n=new Date(Math.max(+r-36e5,+i));return this.fetch(e,n,r).pipe(q((e=>({result:e,time:n}))))})),x(),q((()=>this.getClosestChunkRight({cameraId:e,time:t}))))}}),n(this,{updates:a,add:s.bound}),this.data=L(),this.chunksByCameraId=this.data.dimension((e=>e.cameraId)),this.chunksByStart=this.data.dimension((e=>+e.startTime)),this.chunksByEnd=this.data.dimension((e=>+e.endTime)),this.pendingRequests=L(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.startTime)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.endTime)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId))}fetch(e,t,r){this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(r);const i=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),i)return i.request;if(this.knownIntervals.has(e)){const[i,n]=this.knownIntervals.get(e);if(i<=t&&n>=r)return O(this.getChunks({cameraId:e,from:t,to:r}));i<=t&&n<r&&(t=n),i>t&&n>=r&&(r=i),r<i&&(r=i),t>n&&(t=n)}const n=this.api.archives.PopulateArchive({cameraId:e,startTime:t,endTime:r}).pipe(q((e=>e.resultItems[0].chunks.map((e=>new fe(e))))),M(this.add),M((r=>this.extendKnownInterval(e,t,r))),N());return this.pendingRequests.add([{cameraId:e,startTime:t,endTime:r,request:n}]),n.pipe(M((()=>this.pendingRequests.remove((e=>e.request===n))))).subscribe(),n}extendKnownInterval(e,t,r){t=new Date(Math.min(+t,...r.map((e=>+e.startTime))));const i=new Date(Math.max(...r.map((e=>+e.endTime))));if(this.knownIntervals.has(e)){const r=this.knownIntervals.get(e);t<r[0]&&(r[0]=t),i>r[1]&&(r[1]=i)}else this.knownIntervals.set(e,[t,i])}add(e){const t=e.filter((e=>!this.chunksById.has(e.id)));t.forEach((e=>this.chunksById.set(e.id,e))),this.data.add(t),t.length&&this.updates++}getChunks({cameraId:e,from:t,to:r}){this.chunksByStart.filter([-1/0,+r+be]),this.chunksByEnd.filter([t,1/0]),e&&this.chunksByCameraId.filter(e);const i=this.chunksByStart.top(1/0);return e&&this.chunksByCameraId.filterAll(),this.chunksByStart.filterAll(),this.chunksByEnd.filterAll(),i}afterInit(){this.api.events.pipe(U((({hub:e,event:t})=>"archives"===e&&"OnArchiveChunksCreated"===t))).subscribe((({data:e})=>{this.add(e.resultItems.map((e=>new fe(e))))}))}}class ve{get isOnline(){return this.enabled&&"Started"===this.state}get supportsWebRTC(){return!!this.webRtcUrl}constructor(e){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"imageUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"streamUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"dashStreamUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"address",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"archiveDuration",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"dvrWindowLength",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stateUpdatedAt",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"raw",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"enabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isMicEnabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pin",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"webRtcUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isPtz",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"permissions",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.raw=e,this.id=e.id,this.name=e.name,this.isPtz=e.isPTZ,this.isMicEnabled=e.isMicEnabled,this.imageUrl=e.imageUrl,this.address=e.cameraAddress?JSON.parse(e.cameraAddress):null,this.streamUrl=e.streamUrl,this.dashStreamUrl=e.dashStreamUrl,this.enabled=e.enabled,this.state=this.raw.cameraState,this.dvrWindowLength=e.dvrWindowLength?1e3*e.dvrWindowLength:e.dvrWindowLength,this.archiveDuration=e.archiveDuration,this.pin=e.pin,this.webRtcUrl=e.webRtcUrl,this.permissions=e.permissions||0,this.stateUpdatedAt=new Date(e.cameraStateChangedTime)}}),Object.defineProperty(this,"can",{enumerable:!0,configurable:!0,writable:!0,value:e=>this.permissions&e}),n(this,{name:a,streamUrl:a,dashStreamUrl:a,enabled:a,isMicEnabled:a,state:a,pin:a,webRtcUrl:a,permissions:a,isOnline:t,update:s}),this.update(e)}}var me;!function(e){e[e.View=1]="View",e[e.SaveClip=2]="SaveClip",e[e.Share=4]="Share",e[e.Ptz=8]="Ptz",e[e.EditSettings=16]="EditSettings",e[e.Timelapse=32]="Timelapse",e[e.Delete=64]="Delete"}(me||(me={}));class ye extends ne{constructor(){super(),Object.defineProperty(this,"camerasById",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"loading",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"loaded",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"pendingLoadRequest",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"requestsCanceler",{enumerable:!0,configurable:!0,writable:!0,value:new l}),Object.defineProperty(this,"load",{enumerable:!0,configurable:!0,writable:!0,value:()=>{if(this.loaded)return O([]);if(this.pendingLoadRequest)return this.pendingLoadRequest;i((()=>this.loading=!0));const e=this.pendingLoadRequest=this.api.cameras.GetCameras({},null).pipe(v((e=>e.success?O(e.resultItems):(console.error(e.error),y((()=>e.error))))),k(1),g(this.requestsCanceler));return e.subscribe((e=>{this.pendingLoadRequest=void 0,i((()=>{this.add(e),this.loading=!1,this.loaded=!0}))})),e}}),Object.defineProperty(this,"add",{enumerable:!0,configurable:!0,writable:!0,value:e=>{e.forEach((e=>{this.camerasById.has(e.id)?this.camerasById.get(e.id).update(e):this.camerasById.set(e.id,new ve(e))})),this.data=Array.from(this.camerasById.values()).sort(((e,t)=>G(e.name,t.name,{caseInsensitive:!0})))}}),Object.defineProperty(this,"sync",{enumerable:!0,configurable:!0,writable:!0,value:()=>{const e=this.data.reduce(((e,t)=>Math.max(e,+t.stateUpdatedAt)),0);if(!e)return d;const t=this.api.cameras.GetCameras({},new Date(1e3*(Math.floor(e/1e3)+1))).pipe(v((e=>e.success?O(e.resultItems):(console.error(e.error),y((()=>e.error))))),k(1),g(this.requestsCanceler));return t.subscribe((e=>this.add(e))),t}}),n(this,{data:a.ref,loading:a,loaded:a,add:s}),this.disposables.push(o((()=>this.loaded),(()=>{this.api.connection$.pipe(S(1),C((()=>this.sync()))).subscribe()})))}afterInit(){this.disposables.push(this.api.events.pipe(f((({hub:e,event:t})=>"cameras"===e&&("OnCameraUpdated"===t||"OnSystemCameraUpdated"===t))),B((({data:e,event:t})=>e.resultItems?{data:e.resultItems[0],event:t}:{data:e,event:t}))).subscribe((({data:e,event:t})=>{const r=this.camerasById.get(e.id);if(!r)return console.warn("got update for unknown camera:",e.id);if("OnSystemCameraUpdated"===t){const t=r.raw;for(const[r,i]of Object.entries(e))null===i&&(e[r]=t[r])}r.update(e)})))}dispose(){this.requestsCanceler.next(),this.camerasById.clear(),this.data=[],this.loading=!1,this.loaded=!1,super.dispose()}}const ge={amber:{50:"#fff8e1",100:"#ffecb3",200:"#ffe082",300:"#ffd54f",400:"#ffca28",500:"#ffc107",600:"#ffb300",700:"#ffa000",800:"#ff8f00",900:"#ff6f00",A100:"#ffe57f",A200:"#ffd740",A400:"#ffc400",A700:"#ffab00"},blue:{50:"#e3f2fd",100:"#bbdefb",200:"#90caf9",300:"#64b5f6",400:"#42a5f5",500:"#2196f3",600:"#1e88e5",700:"#1976d2",800:"#1565c0",900:"#0d47a1",A100:"#82b1ff",A200:"#448aff",A400:"#2979ff",A700:"#2962ff"},blueGrey:{50:"#eceff1",100:"#cfd8dc",200:"#b0bec5",300:"#90a4ae",400:"#78909c",500:"#607d8b",600:"#546e7a",700:"#455a64",800:"#37474f",900:"#263238",A100:"#cfd8dc",A200:"#b0bec5",A400:"#78909c",A700:"#455a64"},brown:{50:"#efebe9",100:"#d7ccc8",200:"#bcaaa4",300:"#a1887f",400:"#8d6e63",500:"#795548",600:"#6d4c41",700:"#5d4037",800:"#4e342e",900:"#3e2723",A100:"#d7ccc8",A200:"#bcaaa4",A400:"#8d6e63",A700:"#5d4037"},cyan:{50:"#e0f7fa",100:"#b2ebf2",200:"#80deea",300:"#4dd0e1",400:"#26c6da",500:"#00bcd4",600:"#00acc1",700:"#0097a7",800:"#00838f",900:"#006064",A100:"#84ffff",A200:"#18ffff",A400:"#00e5ff",A700:"#00b8d4"},deepOrange:{50:"#fbe9e7",100:"#ffccbc",200:"#ffab91",300:"#ff8a65",400:"#ff7043",500:"#ff5722",600:"#f4511e",700:"#e64a19",800:"#d84315",900:"#bf360c",A100:"#ff9e80",A200:"#ff6e40",A400:"#ff3d00",A700:"#dd2c00"},deepPurple:{50:"#ede7f6",100:"#d1c4e9",200:"#b39ddb",300:"#9575cd",400:"#7e57c2",500:"#673ab7",600:"#5e35b1",700:"#512da8",800:"#4527a0",900:"#311b92",A100:"#b388ff",A200:"#7c4dff",A400:"#651fff",A700:"#6200ea"},green:{50:"#e8f5e9",100:"#c8e6c9",200:"#a5d6a7",300:"#81c784",400:"#66bb6a",500:"#4caf50",600:"#43a047",700:"#388e3c",800:"#2e7d32",900:"#1b5e20",A100:"#b9f6ca",A200:"#69f0ae",A400:"#00e676",A700:"#00c853"},grey:{50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"},indigo:{50:"#e8eaf6",100:"#c5cae9",200:"#9fa8da",300:"#7986cb",400:"#5c6bc0",500:"#3f51b5",600:"#3949ab",700:"#303f9f",800:"#283593",900:"#1a237e",A100:"#8c9eff",A200:"#536dfe",A400:"#3d5afe",A700:"#304ffe"},lightBlue:{50:"#e1f5fe",100:"#b3e5fc",200:"#81d4fa",300:"#4fc3f7",400:"#29b6f6",500:"#03a9f4",600:"#039be5",700:"#0288d1",800:"#0277bd",900:"#01579b",A100:"#80d8ff",A200:"#40c4ff",A400:"#00b0ff",A700:"#0091ea"},lightGreen:{50:"#f1f8e9",100:"#dcedc8",200:"#c5e1a5",300:"#aed581",400:"#9ccc65",500:"#8bc34a",600:"#7cb342",700:"#689f38",800:"#558b2f",900:"#33691e",A100:"#ccff90",A200:"#b2ff59",A400:"#76ff03",A700:"#64dd17"},lime:{50:"#f9fbe7",100:"#f0f4c3",200:"#e6ee9c",300:"#dce775",400:"#d4e157",500:"#cddc39",600:"#c0ca33",700:"#afb42b",800:"#9e9d24",900:"#827717",A100:"#f4ff81",A200:"#eeff41",A400:"#c6ff00",A700:"#aeea00"},orange:{50:"#fff3e0",100:"#ffe0b2",200:"#ffcc80",300:"#ffb74d",400:"#ffa726",500:"#ff9800",600:"#fb8c00",700:"#f57c00",800:"#ef6c00",900:"#e65100",A100:"#ffd180",A200:"#ffab40",A400:"#ff9100",A700:"#ff6d00"},pink:{50:"#fce4ec",100:"#f8bbd0",200:"#f48fb1",300:"#f06292",400:"#ec407a",500:"#e91e63",600:"#d81b60",700:"#c2185b",800:"#ad1457",900:"#880e4f",A100:"#ff80ab",A200:"#ff4081",A400:"#f50057",A700:"#c51162"},purple:{50:"#f3e5f5",100:"#e1bee7",200:"#ce93d8",300:"#ba68c8",400:"#ab47bc",500:"#9c27b0",600:"#8e24aa",700:"#7b1fa2",800:"#6a1b9a",900:"#4a148c",A100:"#ea80fc",A200:"#e040fb",A400:"#d500f9",A700:"#aa00ff"},red:{50:"#ffebee",100:"#ffcdd2",200:"#ef9a9a",300:"#e57373",400:"#ef5350",500:"#f44336",600:"#e53935",700:"#d32f2f",800:"#c62828",900:"#b71c1c",A100:"#ff8a80",A200:"#ff5252",A400:"#ff1744",A700:"#d50000"},teal:{50:"#e0f2f1",100:"#b2dfdb",200:"#80cbc4",300:"#4db6ac",400:"#26a69a",500:"#009688",600:"#00897b",700:"#00796b",800:"#00695c",900:"#004d40",A100:"#a7ffeb",A200:"#64ffda",A400:"#1de9b6",A700:"#00bfa5"},yellow:{50:"#fffde7",100:"#fff9c4",200:"#fff59d",300:"#fff176",400:"#ffee58",500:"#ffeb3b",600:"#fdd835",700:"#fbc02d",800:"#f9a825",900:"#f57f17",A100:"#ffff8d",A200:"#ffff00",A400:"#ffea00",A700:"#ffd600"}},we={Person:"red",Car:"green",Animal:"blue",LicensePlate:"cyan",Fire:"deepOrange",Smoke:"deepPurple"},Oe=["green","red","blue","purple","teal","amber","pink","cyan","lightGreen","deepOrange","deepPurple","lime","indigo","lightBlue"];class je extends ne{constructor(){super(),Object.defineProperty(this,"schemaDescription",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"fetchAnalyticEventSchema",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.api.cameras.GetSensorDataSchema("Analytic").subscribe({next:e=>{e.success?i((()=>{this.schemaDescription=e.resultItems})):console.error(e)},error:console.error})}}),n(this,{schemaDescription:a.ref,foundObjectTypes:t,foundObjectTypesForSelect:t,colorsByFoundObjectType:t})}get foundObjectTypes(){if(!this.schemaDescription.length)return[];const e=this.schemaDescription.filter((e=>"filter"===e.parameterType&&"Type"===e.fieldName&&"Analytic"===e.eventType))[0];return e?e.valueSet.includes("LicensePlate")?e.valueSet.split(", "):e.valueSet.split(", ").concat(["LicensePlate"]):[]}get foundObjectTypesForSelect(){const e=Object.entries(we).filter((([e])=>this.foundObjectTypes.includes(e))).map((([,e])=>e)),t=Oe.filter((t=>!e.includes(t)));let r=0;return this.foundObjectTypes.map((e=>{const i=e in we?we[e]:t[r++],n=ge[i];return{id:e,name:e.toLowerCase(),color:n[500],highlightColor:n.A400,type:"detectedObject"}}))}get colorsByFoundObjectType(){const e=new Map;return this.foundObjectTypesForSelect.forEach((t=>{e.set(t.id,t.highlightColor)})),e}afterInit(){this.fetchAnalyticEventSchema()}dispose(){super.dispose(),this.schemaDescription=[]}}var Ie="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Pe(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ae=function(e,t,r,i){for(var n=-1,a=null==e?0:e.length;++n<a;){var s=e[n];t(i,s,r(s),e)}return i};var Te=function(e){return function(t,r,i){for(var n=-1,a=Object(t),s=i(t),o=s.length;o--;){var l=s[e?o:++n];if(!1===r(a[l],l,a))break}return t}}();var ke=function(e,t){for(var r=-1,i=Array(e);++r<e;)i[r]=t(r);return i},Se="object"==typeof Ie&&Ie&&Ie.Object===Object&&Ie,Ce=Se,Be="object"==typeof self&&self&&self.Object===Object&&self,Ee=Ce||Be||Function("return this")(),_e=Ee.Symbol,Re=_e,Ne=Object.prototype,De=Ne.hasOwnProperty,Ue=Ne.toString,qe=Re?Re.toStringTag:void 0;var Me=function(e){var t=De.call(e,qe),r=e[qe];try{e[qe]=void 0;var i=!0}catch(e){}var n=Ue.call(e);return i&&(t?e[qe]=r:delete e[qe]),n},Fe=Object.prototype.toString;var xe=Me,ze=function(e){return Fe.call(e)},We=_e?_e.toStringTag:void 0;var Le=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":We&&We in Object(e)?xe(e):ze(e)};var Ge=function(e){return null!=e&&"object"==typeof e},Ve=Le,$e=Ge;var He=function(e){return $e(e)&&"[object Arguments]"==Ve(e)},Ke=Ge,Ye=Object.prototype,Je=Ye.hasOwnProperty,Ze=Ye.propertyIsEnumerable,Qe=He(function(){return arguments}())?He:function(e){return Ke(e)&&Je.call(e,"callee")&&!Ze.call(e,"callee")},Xe=Array.isArray,et={exports:{}};var tt=function(){return!1};!function(e,t){var r=Ee,i=tt,n=t&&!t.nodeType&&t,a=n&&e&&!e.nodeType&&e,s=a&&a.exports===n?r.Buffer:void 0,o=(s?s.isBuffer:void 0)||i;e.exports=o}(et,et.exports);var rt=et.exports,it=/^(?:0|[1-9]\d*)$/;var nt=function(e,t){var r=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==r||"symbol"!=r&&it.test(e))&&e>-1&&e%1==0&&e<t};var at=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991},st=Le,ot=at,lt=Ge,ut={};ut["[object Float32Array]"]=ut["[object Float64Array]"]=ut["[object Int8Array]"]=ut["[object Int16Array]"]=ut["[object Int32Array]"]=ut["[object Uint8Array]"]=ut["[object Uint8ClampedArray]"]=ut["[object Uint16Array]"]=ut["[object Uint32Array]"]=!0,ut["[object Arguments]"]=ut["[object Array]"]=ut["[object ArrayBuffer]"]=ut["[object Boolean]"]=ut["[object DataView]"]=ut["[object Date]"]=ut["[object Error]"]=ut["[object Function]"]=ut["[object Map]"]=ut["[object Number]"]=ut["[object Object]"]=ut["[object RegExp]"]=ut["[object Set]"]=ut["[object String]"]=ut["[object WeakMap]"]=!1;var ct=function(e){return lt(e)&&ot(e.length)&&!!ut[st(e)]};var dt=function(e){return function(t){return e(t)}},ht={exports:{}};!function(e,t){var r=Se,i=t&&!t.nodeType&&t,n=i&&e&&!e.nodeType&&e,a=n&&n.exports===i&&r.process,s=function(){try{var e=n&&n.require&&n.require("util").types;return e||a&&a.binding&&a.binding("util")}catch(e){}}();e.exports=s}(ht,ht.exports);var ft=ht.exports,bt=ct,pt=dt,vt=ft&&ft.isTypedArray,mt=vt?pt(vt):bt,yt=ke,gt=Qe,wt=Xe,Ot=rt,jt=nt,It=mt,Pt=Object.prototype.hasOwnProperty;var At=function(e,t){var r=wt(e),i=!r&&gt(e),n=!r&&!i&&Ot(e),a=!r&&!i&&!n&&It(e),s=r||i||n||a,o=s?yt(e.length,String):[],l=o.length;for(var u in e)!t&&!Pt.call(e,u)||s&&("length"==u||n&&("offset"==u||"parent"==u)||a&&("buffer"==u||"byteLength"==u||"byteOffset"==u)||jt(u,l))||o.push(u);return o},Tt=Object.prototype;var kt=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||Tt)};var St=function(e,t){return function(r){return e(t(r))}}(Object.keys,Object),Ct=kt,Bt=St,Et=Object.prototype.hasOwnProperty;var _t=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)},Rt=Le,Nt=_t;var Dt=function(e){if(!Nt(e))return!1;var t=Rt(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t},Ut=Dt,qt=at;var Mt=function(e){return null!=e&&qt(e.length)&&!Ut(e)},Ft=At,xt=function(e){if(!Ct(e))return Bt(e);var t=[];for(var r in Object(e))Et.call(e,r)&&"constructor"!=r&&t.push(r);return t},zt=Mt;var Wt=function(e){return zt(e)?Ft(e):xt(e)},Lt=Te,Gt=Wt;var Vt=Mt;var $t=function(e,t){return function(r,i){if(null==r)return r;if(!Vt(r))return e(r,i);for(var n=r.length,a=t?n:-1,s=Object(r);(t?a--:++a<n)&&!1!==i(s[a],a,s););return r}}((function(e,t){return e&&Lt(e,t,Gt)}));var Ht=function(e,t,r,i){return $t(e,(function(e,n,a){t(i,e,r(e),a)})),i};var Kt=function(){this.__data__=[],this.size=0};var Yt=function(e,t){return e===t||e!=e&&t!=t},Jt=Yt;var Zt=function(e,t){for(var r=e.length;r--;)if(Jt(e[r][0],t))return r;return-1},Qt=Zt,Xt=Array.prototype.splice;var er=Zt;var tr=Zt;var rr=Zt;var ir=Kt,nr=function(e){var t=this.__data__,r=Qt(t,e);return!(r<0)&&(r==t.length-1?t.pop():Xt.call(t,r,1),--this.size,!0)},ar=function(e){var t=this.__data__,r=er(t,e);return r<0?void 0:t[r][1]},sr=function(e){return tr(this.__data__,e)>-1},or=function(e,t){var r=this.__data__,i=rr(r,e);return i<0?(++this.size,r.push([e,t])):r[i][1]=t,this};function lr(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var i=e[t];this.set(i[0],i[1])}}lr.prototype.clear=ir,lr.prototype.delete=nr,lr.prototype.get=ar,lr.prototype.has=sr,lr.prototype.set=or;var ur=lr,cr=ur;var dr=function(){this.__data__=new cr,this.size=0};var hr=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r};var fr=function(e){return this.__data__.get(e)};var br,pr=function(e){return this.__data__.has(e)},vr=Ee["__core-js_shared__"],mr=(br=/[^.]+$/.exec(vr&&vr.keys&&vr.keys.IE_PROTO||""))?"Symbol(src)_1."+br:"";var yr=function(e){return!!mr&&mr in e},gr=Function.prototype.toString;var wr=function(e){if(null!=e){try{return gr.call(e)}catch(e){}try{return e+""}catch(e){}}return""},Or=Dt,jr=yr,Ir=_t,Pr=wr,Ar=/^\[object .+?Constructor\]$/,Tr=Function.prototype,kr=Object.prototype,Sr=Tr.toString,Cr=kr.hasOwnProperty,Br=RegExp("^"+Sr.call(Cr).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");var Er=function(e){return!(!Ir(e)||jr(e))&&(Or(e)?Br:Ar).test(Pr(e))},_r=function(e,t){return null==e?void 0:e[t]};var Rr=function(e,t){var r=_r(e,t);return Er(r)?r:void 0},Nr=Rr(Ee,"Map"),Dr=Rr(Object,"create"),Ur=Dr;var qr=function(){this.__data__=Ur?Ur(null):{},this.size=0};var Mr=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},Fr=Dr,xr=Object.prototype.hasOwnProperty;var zr=function(e){var t=this.__data__;if(Fr){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return xr.call(t,e)?t[e]:void 0},Wr=Dr,Lr=Object.prototype.hasOwnProperty;var Gr=Dr;var Vr=qr,$r=Mr,Hr=zr,Kr=function(e){var t=this.__data__;return Wr?void 0!==t[e]:Lr.call(t,e)},Yr=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=Gr&&void 0===t?"__lodash_hash_undefined__":t,this};function Jr(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var i=e[t];this.set(i[0],i[1])}}Jr.prototype.clear=Vr,Jr.prototype.delete=$r,Jr.prototype.get=Hr,Jr.prototype.has=Kr,Jr.prototype.set=Yr;var Zr=Jr,Qr=ur,Xr=Nr;var ei=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e};var ti=function(e,t){var r=e.__data__;return ei(t)?r["string"==typeof t?"string":"hash"]:r.map},ri=ti;var ii=ti;var ni=ti;var ai=ti;var si=function(){this.size=0,this.__data__={hash:new Zr,map:new(Xr||Qr),string:new Zr}},oi=function(e){var t=ri(this,e).delete(e);return this.size-=t?1:0,t},li=function(e){return ii(this,e).get(e)},ui=function(e){return ni(this,e).has(e)},ci=function(e,t){var r=ai(this,e),i=r.size;return r.set(e,t),this.size+=r.size==i?0:1,this};function di(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var i=e[t];this.set(i[0],i[1])}}di.prototype.clear=si,di.prototype.delete=oi,di.prototype.get=li,di.prototype.has=ui,di.prototype.set=ci;var hi=di,fi=ur,bi=Nr,pi=hi;var vi=ur,mi=dr,yi=hr,gi=fr,wi=pr,Oi=function(e,t){var r=this.__data__;if(r instanceof fi){var i=r.__data__;if(!bi||i.length<199)return i.push([e,t]),this.size=++r.size,this;r=this.__data__=new pi(i)}return r.set(e,t),this.size=r.size,this};function ji(e){var t=this.__data__=new vi(e);this.size=t.size}ji.prototype.clear=mi,ji.prototype.delete=yi,ji.prototype.get=gi,ji.prototype.has=wi,ji.prototype.set=Oi;var Ii=ji;var Pi=hi,Ai=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Ti=function(e){return this.__data__.has(e)};function ki(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new Pi;++t<r;)this.add(e[t])}ki.prototype.add=ki.prototype.push=Ai,ki.prototype.has=Ti;var Si=ki;var Ci=function(e,t){return e.has(t)},Bi=Si,Ei=function(e,t){for(var r=-1,i=null==e?0:e.length;++r<i;)if(t(e[r],r,e))return!0;return!1},_i=Ci;var Ri=function(e,t,r,i,n,a){var s=1&r,o=e.length,l=t.length;if(o!=l&&!(s&&l>o))return!1;var u=a.get(e),c=a.get(t);if(u&&c)return u==t&&c==e;var d=-1,h=!0,f=2&r?new Bi:void 0;for(a.set(e,t),a.set(t,e);++d<o;){var b=e[d],p=t[d];if(i)var v=s?i(p,b,d,t,e,a):i(b,p,d,e,t,a);if(void 0!==v){if(v)continue;h=!1;break}if(f){if(!Ei(t,(function(e,t){if(!_i(f,t)&&(b===e||n(b,e,r,i,a)))return f.push(t)}))){h=!1;break}}else if(b!==p&&!n(b,p,r,i,a)){h=!1;break}}return a.delete(e),a.delete(t),h};var Ni=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e,i){r[++t]=[i,e]})),r};var Di=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r},Ui=Ee.Uint8Array,qi=Yt,Mi=Ri,Fi=Ni,xi=Di,zi=_e?_e.prototype:void 0,Wi=zi?zi.valueOf:void 0;var Li=function(e,t,r,i,n,a,s){switch(r){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!a(new Ui(e),new Ui(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return qi(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var o=Fi;case"[object Set]":var l=1&i;if(o||(o=xi),e.size!=t.size&&!l)return!1;var u=s.get(e);if(u)return u==t;i|=2,s.set(e,t);var c=Mi(o(e),o(t),i,n,a,s);return s.delete(e),c;case"[object Symbol]":if(Wi)return Wi.call(e)==Wi.call(t)}return!1};var Gi=function(e,t){for(var r=-1,i=t.length,n=e.length;++r<i;)e[n+r]=t[r];return e},Vi=Xe;var $i=function(e,t,r){var i=t(e);return Vi(e)?i:Gi(i,r(e))};var Hi=function(e,t){for(var r=-1,i=null==e?0:e.length,n=0,a=[];++r<i;){var s=e[r];t(s,r,e)&&(a[n++]=s)}return a},Ki=function(){return[]},Yi=Object.prototype.propertyIsEnumerable,Ji=Object.getOwnPropertySymbols,Zi=$i,Qi=Ji?function(e){return null==e?[]:(e=Object(e),Hi(Ji(e),(function(t){return Yi.call(e,t)})))}:Ki,Xi=Wt;var en=function(e){return Zi(e,Xi,Qi)},tn=Object.prototype.hasOwnProperty;var rn=function(e,t,r,i,n,a){var s=1&r,o=en(e),l=o.length;if(l!=en(t).length&&!s)return!1;for(var u=l;u--;){var c=o[u];if(!(s?c in t:tn.call(t,c)))return!1}var d=a.get(e),h=a.get(t);if(d&&h)return d==t&&h==e;var f=!0;a.set(e,t),a.set(t,e);for(var b=s;++u<l;){var p=e[c=o[u]],v=t[c];if(i)var m=s?i(v,p,c,t,e,a):i(p,v,c,e,t,a);if(!(void 0===m?p===v||n(p,v,r,i,a):m)){f=!1;break}b||(b="constructor"==c)}if(f&&!b){var y=e.constructor,g=t.constructor;y==g||!("constructor"in e)||!("constructor"in t)||"function"==typeof y&&y instanceof y&&"function"==typeof g&&g instanceof g||(f=!1)}return a.delete(e),a.delete(t),f},nn=Rr(Ee,"DataView"),an=Rr(Ee,"Promise"),sn=Rr(Ee,"Set"),on=nn,ln=Nr,un=an,cn=sn,dn=Rr(Ee,"WeakMap"),hn=Le,fn=wr,bn="[object Map]",pn="[object Promise]",vn="[object Set]",mn="[object WeakMap]",yn="[object DataView]",gn=fn(on),wn=fn(ln),On=fn(un),jn=fn(cn),In=fn(dn),Pn=hn;(on&&Pn(new on(new ArrayBuffer(1)))!=yn||ln&&Pn(new ln)!=bn||un&&Pn(un.resolve())!=pn||cn&&Pn(new cn)!=vn||dn&&Pn(new dn)!=mn)&&(Pn=function(e){var t=hn(e),r="[object Object]"==t?e.constructor:void 0,i=r?fn(r):"";if(i)switch(i){case gn:return yn;case wn:return bn;case On:return pn;case jn:return vn;case In:return mn}return t});var An=Ii,Tn=Ri,kn=Li,Sn=rn,Cn=Pn,Bn=Xe,En=rt,_n=mt,Rn="[object Arguments]",Nn="[object Array]",Dn="[object Object]",Un=Object.prototype.hasOwnProperty;var qn=function(e,t,r,i,n,a){var s=Bn(e),o=Bn(t),l=s?Nn:Cn(e),u=o?Nn:Cn(t),c=(l=l==Rn?Dn:l)==Dn,d=(u=u==Rn?Dn:u)==Dn,h=l==u;if(h&&En(e)){if(!En(t))return!1;s=!0,c=!1}if(h&&!c)return a||(a=new An),s||_n(e)?Tn(e,t,r,i,n,a):kn(e,t,l,r,i,n,a);if(!(1&r)){var f=c&&Un.call(e,"__wrapped__"),b=d&&Un.call(t,"__wrapped__");if(f||b){var p=f?e.value():e,v=b?t.value():t;return a||(a=new An),n(p,v,r,i,a)}}return!!h&&(a||(a=new An),Sn(e,t,r,i,n,a))},Mn=Ge;var Fn=function e(t,r,i,n,a){return t===r||(null==t||null==r||!Mn(t)&&!Mn(r)?t!=t&&r!=r:qn(t,r,i,n,e,a))},xn=Ii,zn=Fn;var Wn=_t;var Ln=function(e){return e==e&&!Wn(e)},Gn=Ln,Vn=Wt;var $n=function(e,t){return function(r){return null!=r&&(r[e]===t&&(void 0!==t||e in Object(r)))}},Hn=function(e,t,r,i){var n=r.length,a=n,s=!i;if(null==e)return!a;for(e=Object(e);n--;){var o=r[n];if(s&&o[2]?o[1]!==e[o[0]]:!(o[0]in e))return!1}for(;++n<a;){var l=(o=r[n])[0],u=e[l],c=o[1];if(s&&o[2]){if(void 0===u&&!(l in e))return!1}else{var d=new xn;if(i)var h=i(u,c,l,e,t,d);if(!(void 0===h?zn(c,u,3,i,d):h))return!1}}return!0},Kn=function(e){for(var t=Vn(e),r=t.length;r--;){var i=t[r],n=e[i];t[r]=[i,n,Gn(n)]}return t},Yn=$n;var Jn=function(e){var t=Kn(e);return 1==t.length&&t[0][2]?Yn(t[0][0],t[0][1]):function(r){return r===e||Hn(r,e,t)}},Zn=Le,Qn=Ge;var Xn=function(e){return"symbol"==typeof e||Qn(e)&&"[object Symbol]"==Zn(e)},ea=Xe,ta=Xn,ra=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ia=/^\w*$/;var na=function(e,t){if(ea(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!ta(e))||(ia.test(e)||!ra.test(e)||null!=t&&e in Object(t))},aa=hi;function sa(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var r=function(){var i=arguments,n=t?t.apply(this,i):i[0],a=r.cache;if(a.has(n))return a.get(n);var s=e.apply(this,i);return r.cache=a.set(n,s)||a,s};return r.cache=new(sa.Cache||aa),r}sa.Cache=aa;var oa=sa;var la=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ua=/\\(\\)?/g,ca=function(e){var t=oa(e,(function(e){return 500===r.size&&r.clear(),e})),r=t.cache;return t}((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(la,(function(e,r,i,n){t.push(i?n.replace(ua,"$1"):r||e)})),t}));var da=function(e,t){for(var r=-1,i=null==e?0:e.length,n=Array(i);++r<i;)n[r]=t(e[r],r,e);return n},ha=Xe,fa=Xn,ba=_e?_e.prototype:void 0,pa=ba?ba.toString:void 0;var va=function e(t){if("string"==typeof t)return t;if(ha(t))return da(t,e)+"";if(fa(t))return pa?pa.call(t):"";var r=t+"";return"0"==r&&1/t==-1/0?"-0":r},ma=va;var ya=Xe,ga=na,wa=ca,Oa=function(e){return null==e?"":ma(e)};var ja=function(e,t){return ya(e)?e:ga(e,t)?[e]:wa(Oa(e))},Ia=Xn;var Pa=function(e){if("string"==typeof e||Ia(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t},Aa=ja,Ta=Pa;var ka=function(e,t){for(var r=0,i=(t=Aa(t,e)).length;null!=e&&r<i;)e=e[Ta(t[r++])];return r&&r==i?e:void 0},Sa=ka;var Ca=ja,Ba=Qe,Ea=Xe,_a=nt,Ra=at,Na=Pa;var Da=function(e,t){return null!=e&&t in Object(e)},Ua=function(e,t,r){for(var i=-1,n=(t=Ca(t,e)).length,a=!1;++i<n;){var s=Na(t[i]);if(!(a=null!=e&&r(e,s)))break;e=e[s]}return a||++i!=n?a:!!(n=null==e?0:e.length)&&Ra(n)&&_a(s,n)&&(Ea(e)||Ba(e))};var qa=Fn,Ma=function(e,t,r){var i=null==e?void 0:Sa(e,t);return void 0===i?r:i},Fa=function(e,t){return null!=e&&Ua(e,t,Da)},xa=na,za=Ln,Wa=$n,La=Pa;var Ga=ka;var Va=function(e){return function(t){return null==t?void 0:t[e]}},$a=function(e){return function(t){return Ga(t,e)}},Ha=na,Ka=Pa;var Ya=Jn,Ja=function(e,t){return xa(e)&&za(t)?Wa(La(e),t):function(r){var i=Ma(r,e);return void 0===i&&i===t?Fa(r,e):qa(t,i,3)}},Za=function(e){return e},Qa=Xe,Xa=function(e){return Ha(e)?Va(Ka(e)):$a(e)};var es=function(e){return"function"==typeof e?e:null==e?Za:"object"==typeof e?Qa(e)?Ja(e[0],e[1]):Ya(e):Xa(e)},ts=Ae,rs=Ht,is=es,ns=Xe;var as=Pe(function(e,t){return function(r,i){var n=ns(r)?ts:rs,a=t?t():{};return n(r,e,is(i),a)}}((function(e,t,r){e[r?0:1].push(t)}),(function(){return[[],[]]})));var ss=function(e,t,r,i){for(var n=e.length,a=r+(i?1:-1);i?a--:++a<n;)if(t(e[a],a,e))return a;return-1},os=function(e){return e!=e},ls=function(e,t,r){for(var i=r-1,n=e.length;++i<n;)if(e[i]===t)return i;return-1};var us=function(e,t,r){return t==t?ls(e,t,r):ss(e,os,r)};var cs=function(e,t){return!!(null==e?0:e.length)&&us(e,t,0)>-1};var ds=function(e,t,r){for(var i=-1,n=null==e?0:e.length;++i<n;)if(r(t,e[i]))return!0;return!1};var hs=sn,fs=function(){},bs=hs&&1/Di(new hs([,-0]))[1]==1/0?function(e){return new hs(e)}:fs,ps=Si,vs=cs,ms=ds,ys=Ci,gs=bs,ws=Di;var Os=function(e,t,r){var i=-1,n=vs,a=e.length,s=!0,o=[],l=o;if(r)s=!1,n=ms;else if(a>=200){var u=t?null:gs(e);if(u)return ws(u);s=!1,n=ys,l=new ps}else l=t?[]:o;e:for(;++i<a;){var c=e[i],d=t?t(c):c;if(c=r||0!==c?c:0,s&&d==d){for(var h=l.length;h--;)if(l[h]===d)continue e;t&&l.push(d),o.push(c)}else n(l,d,r)||(l!==o&&l.push(d),o.push(c))}return o},js=es,Is=Os;var Ps=Pe((function(e,t){return e&&e.length?Is(e,js(t)):[]}));const As=new Set(["LicensePlate","FaceDetection","Analytic","SpeedDetection","Temperature","PoS","GPS","DigitalInput","Loitering"]);class Ts{get startTime(){return new Date(this.raw.startTime)}get endTime(){return new Date(this.raw.endTime)}get isLive(){return!As.has(this.type)&&+this.startTime==+this.endTime}get acknowledged(){return"sensorId"in this.raw&&!!this.raw.ackEventType}constructor(e){if(Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"cameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"raw",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"thumbnailUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"thumbnailWidth",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"thumbnailHeight",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"detectedObjects",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"faces",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"instant",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.raw=e}}),n(this,{startTime:t,endTime:t,acknowledged:t,isLive:t,raw:a.ref,update:s}),this.raw=e,this.id=e.id,this.type=e.eventType,this.cameraId=e.sensorId,("Analytic"===this.type||"FaceDetection"===this.type||"Loitering"===this.type)&&e.data)try{const t=JSON.parse(e.data);t.FoundObjects&&(this.detectedObjects=t.FoundObjects),t.Faces&&(this.type="FaceDetection",this.faces=t.Faces),t.ThumbnailSize&&(this.thumbnailWidth=t.ThumbnailSize.Width,this.thumbnailHeight=t.ThumbnailSize.Height),this.thumbnailUrl=t.ThumbnailUrl}catch{console.warn("invalid data",e.data),this.type="Motion"}this.instant=As.has(this.type),this.detectedObjects||(this.detectedObjects=[])}}function ks(e){if(e.length<2)return e;const t=[e[0]];for(let r=1;r<e.length;r++){const i=t.length-1,n=t[i],a=e[r];a[0]>n[1]?t.push(a):t[i]=[n[0],new Date(Math.max(+n[1],+a[1]))]}return t}window.CameraEvent=Ts;const Ss=()=>!0,Cs=5e-4;class Bs extends ne{constructor(e){super(),Object.defineProperty(this,"camerasStore",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByFoundObjects",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByColor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequests",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervals",{enumerable:!0,configurable:!0,writable:!0,value:L()}),Object.defineProperty(this,"knownIntervalsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervalsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervalsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsById",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"updates",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"updatesByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"recentAdditions",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:e=>{for(const t of e){const e=this.eventsById.get(t.id);if(!e)return;e.update(t.raw),this.data.remove((e=>e.id===t.id)),this.data.add([e])}}}),Object.defineProperty(this,"add",{enumerable:!0,configurable:!0,writable:!0,value:e=>{var t;const r=e.filter((e=>!this.eventsById.has(e.id)));for(const e of r)this.eventsById.set(e.id,e);if(this.data.add(r),r.length){const e=new Set(r.map((e=>e.cameraId)));for(const r of e)this.updatesByCameraId.set(r,(null!==(t=this.updatesByCameraId.get(r))&&void 0!==t?t:0)+1);this.updates++}}}),Object.defineProperty(this,"processNewEvents",{enumerable:!0,configurable:!0,writable:!0,value:({data:e})=>{const t=Ps(e.filter((e=>"PeopleCounter"!==e.eventType&&this.camerasStore.camerasById.has(e.sensorId))).reverse(),"id").map((e=>new Ts(e))),[r,i]=as(t,(e=>this.eventsById.has(e.id)));this.update(r),this.add(i),i.length&&(this.recentAdditions=i.map((e=>e.id)))}}),n(this,{updates:a,recentAdditions:a.ref,processNewEvents:s,update:s,add:s,dispose:s}),this.data=L(),this.eventsByCameraId=this.data.dimension((e=>e.cameraId)),this.eventsByStart=this.data.dimension((e=>+e.startTime)),this.eventsByEnd=this.data.dimension((e=>+e.endTime)),this.eventsByType=this.data.dimension((e=>e.type)),this.eventsByFoundObjects=this.data.dimension((e=>e.detectedObjects.map((e=>e.Type))),!0),this.eventsByColor=this.data.dimension((e=>e.detectedObjects.reduce(((e,t)=>{var r,i;return e.concat(..."Colors"in t&&null!==(i=null===(r=t.Colors)||void 0===r?void 0:r.map((e=>e.Color)))&&void 0!==i?i:[])}),[])),!0),this.pendingRequests=L(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.startTime)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.endTime)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId)),this.knownIntervalsByCameraId=this.knownIntervals.dimension((e=>e.cameraId)),this.knownIntervalsByStart=this.knownIntervals.dimension((e=>+e.from)),this.knownIntervalsByEnd=this.knownIntervals.dimension((e=>+e.to))}populateEvents(e,t,r){const i=null===r?new Date(Date.now()-6e5):r;-1===e?this.knownIntervalsByCameraId.filter(-1):this.knownIntervalsByCameraId.filter((t=>-1===t||t===e)),this.knownIntervalsByStart.filter([Number.NEGATIVE_INFINITY,i]),this.knownIntervalsByEnd.filter([t,Number.POSITIVE_INFINITY]);const n=this.knownIntervalsByStart.bottom(Number.POSITIVE_INFINITY),a=[];if(this.knownIntervalsByCameraId.filterAll(),this.knownIntervalsByStart.filterAll(),this.knownIntervalsByEnd.filterAll(),n.length){const s=ks(n.map((e=>[e.from,e.to])));s[0][0]>t&&a.push([t,s[0][0]]);for(let e=0;e<s.length-1;e++)a.push([s[e][1],s[e+1][0]]);s[ks.length-1][1]<i&&a.push([s[ks.length-1][1],i]),a.length&&(t=a[0][0],+a[a.length-1][1]<=+i&&(r=a[a.length-1][1]),this.knownIntervals.add([{cameraId:e,from:t,to:i}]))}else this.knownIntervals.add([{cameraId:e,from:t,to:i}]);this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(i);const s=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),s)return;if(n.length&&!a.length)return;const o=i=>this.api.cameras.GetSensorEventsPage({sensorIds:[e],sensorType:"camera",sensorEventTypes:[],startTime:t,endTime:r,rowsLimit:100,isDescending:!0,pageToken:i},null,[]).pipe(R((e=>e.success?O(e):(console.error(e.error),y((()=>e.error)))))),l=o().pipe(F((e=>e.pageInfo.haveMore?o(e.pageInfo.nextPageToken):d)),q((e=>e.resultItems.map((e=>new Ts(e))))),z());this.pendingRequests.add([{cameraId:e,startTime:t,endTime:r||new Date,request:l}]),l.subscribe({next:this.add,error:e=>{console.error(e),this.pendingRequests.remove((e=>e.request===l))},complete:()=>{this.pendingRequests.remove((e=>e.request===l))}})}getEvents({cameraIds:e,from:t,to:r,detectedObjectTypes:i,eventTypes:n,colors:a,probability:s}){this.eventsByStart.filter([+t,r?+r+Cs:Number.POSITIVE_INFINITY]),(null==e?void 0:e.length)&&this.eventsByCameraId.filter((t=>e.includes(t))),(null==n?void 0:n.length)&&this.eventsByType.filter((e=>n.includes(e))),(null==i?void 0:i.length)&&this.eventsByFoundObjects.filter((e=>i.includes(e))),(null==a?void 0:a.size)&&this.eventsByColor.filter((e=>a.has(e)));let o=this.eventsByStart.top(Number.POSITIVE_INFINITY);return(null==n?void 0:n.length)&&this.eventsByType.filterAll(),(null==e?void 0:e.length)&&this.eventsByCameraId.filterAll(),(null==i?void 0:i.length)&&this.eventsByFoundObjects.filterAll(),(null==a?void 0:a.size)&&this.eventsByColor.filterAll(),this.eventsByStart.filterAll(),void 0!==s&&(null==i?void 0:i.length)&&(o=o.filter((e=>e.detectedObjects.some((e=>e.Probability>=s&&i.includes(e.Type)))))),o}getOverlappedEvents({cameraId:e,from:t,to:r}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([Number.NEGATIVE_INFINITY,+r+Cs]),this.eventsByEnd.filter([+t,Number.POSITIVE_INFINITY]);const i=this.eventsByStart.bottom(Number.POSITIVE_INFINITY);return this.eventsByCameraId.filterAll(),this.eventsByStart.filterAll(),this.eventsByEnd.filterAll(),i}getLastNonAnalyticEventBefore({cameraId:e,date:t}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([Number.NEGATIVE_INFINITY,+t]),this.eventsByType.filter((e=>"Analytic"!==e));const r=this.eventsByStart.top(1);return this.eventsByType.filterAll(),this.eventsByStart.filterAll(),this.eventsByCameraId.filterAll(),r[0]}getLastObjectBefore({cameraId:e,date:t,objectFilters:r}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([Number.NEGATIVE_INFINITY,+t]),this.eventsByType.filter((e=>"Analytic"===e));const{cars:i,people:n,misc:a}=r;n&&i&&a||this.eventsByFoundObjects.filter((e=>a?n||i?!(!n||!i)||(n?"Car"!==e:"Person"!==e):"Person"!==e&&"Car"!==e:n&&i?"Person"===e||"Car"===e:n?"Person"===e:"Car"===e));const s=this.eventsByStart.top(1);return this.eventsByFoundObjects.filterAll(),this.eventsByType.filterAll(),this.eventsByStart.filterAll(),this.eventsByCameraId.filterAll(),s[0]}getRunningEvent(e){this.eventsByCameraId.filter(e);const[t]=this.eventsByStart.top(1);if(this.eventsByCameraId.filterAll(),null==t?void 0:t.isLive)return t}getFirstNonAnalyticEventAfter({cameraId:e,date:t}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([+t+Cs,Number.POSITIVE_INFINITY]),this.eventsByType.filter((e=>"Analytic"!==e));const r=this.eventsByEnd.bottom(1);return this.eventsByType.filterAll(),this.eventsByCameraId.filterAll(),this.eventsByStart.filterAll(),r[0]}getFirstObjectAfter({cameraId:e,date:t,objectFilters:r}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([+t+Cs,Number.POSITIVE_INFINITY]),this.eventsByType.filter((e=>"Analytic"===e));const{cars:i,people:n,misc:a}=r;n&&i&&a||this.eventsByFoundObjects.filter((e=>a?n||i?!(!n||!i)||(n?"Car"!==e:"Person"!==e):"Person"!==e&&"Car"!==e:n&&i?"Person"===e||"Car"===e:n?"Person"===e:"Car"===e));const s=this.eventsByStart.bottom(1);return this.eventsByFoundObjects.filterAll(),this.eventsByType.filterAll(),this.eventsByStart.filterAll(),this.eventsByCameraId.filterAll(),s[0]}afterInit(){this.api.events.pipe(U((({hub:e,event:t})=>"cameras"===e&&"OnCameraMotionEvent"===t))).subscribe(this.processNewEvents)}dispose(){super.dispose(),this.data.remove(Ss),this.updates++}}const Es=5e-4;class _s extends ne{constructor(){super(),Object.defineProperty(this,"thumbnails",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"thumbnailsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"thumbnailsByDate",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequests",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCount",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fetchThumbnails",{enumerable:!0,configurable:!0,writable:!0,value:(e,t,r,i)=>{this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(r),this.pendingRequestsByCount.filter(i);const n=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),this.pendingRequestsByCount.filterAll(),n)return n.request;const a=this.api.thumbnails.GetThumbnailsInfo({cameraId:e,from:t,to:r,count:i}).pipe(R((e=>e.success?O(e.resultItems):y((()=>e.error)))),q((t=>t.filter((e=>e.url)).map(this.toThumbnail(e)))),N());return this.pendingRequests.add([{cameraId:e,from:t,to:r,count:i,request:a}]),a.subscribe((e=>{this.thumbnails.add(e),this.pendingRequests.remove((e=>e.request===a))})),a}}),Object.defineProperty(this,"toThumbnail",{enumerable:!0,configurable:!0,writable:!0,value:e=>({realtimestamp:t,url:r})=>({cameraId:e,url:r,timestamp:new Date(t)})}),this.thumbnails=L(),this.thumbnailsByCameraId=this.thumbnails.dimension((e=>e.cameraId)),this.thumbnailsByDate=this.thumbnails.dimension((e=>+e.timestamp)),this.pendingRequests=L(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.from)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.to)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId)),this.pendingRequestsByCount=this.pendingRequests.dimension((e=>e.count))}getIntervalState(e,t,r){const i=this.getThumbnail({cameraId:e,from:t,to:r});if(i)return{state:"fulfilled",data:i};this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter([-1/0,+r+Es]),this.pendingRequestsByEnd.filter([t,1/0]);let n=this.pendingRequests.allFiltered();return this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),n=n.filter((e=>1===e.count?+e.from==+t&&+e.to==+r:Math.abs((+e.to-+e.from)/e.count-(+r-+t))<=1)),n.length?{state:"pending",request:n[0].request}:null}fetchThumbnail(e,t,r){const i=this.getIntervalState(e,t,r);if(null!==i){if("fulfilled"===i.state)return O(i.data);if("pending"===i.state)return i.request.pipe(q((()=>this.getThumbnail({cameraId:e,from:t,to:r}))))}const n=this.api.thumbnails.GetThumbnailInfo({cameraId:e,from:t,to:r}).pipe(R((e=>e.success?O(e.resultItems):y((()=>e.error)))),q((t=>t.filter((e=>e.url)).map(this.toThumbnail(e)))),N());return n.subscribe((e=>{this.thumbnails.add(e),this.pendingRequests.remove((e=>e.request===n))})),this.pendingRequests.add([{cameraId:e,from:t,to:r,count:1,request:n}]),n.pipe(q((()=>this.getThumbnail({cameraId:e,from:t,to:r}))))}getThumbnail({cameraId:e,from:t,to:r}){this.thumbnailsByCameraId.filter(e),this.thumbnailsByDate.filter([+t,+r+(+t==+r?Es:0)]);const i=this.thumbnails.allFiltered()[0];return this.thumbnailsByDate.filterAll(),this.thumbnailsByCameraId.filterAll(),i}getThumbnails({cameraId:e,from:t,to:r}){this.thumbnailsByCameraId.filter(e),this.thumbnailsByDate.filter([+t,+r+Es]);const i=this.thumbnails.allFiltered();return this.thumbnailsByDate.filterAll(),this.thumbnailsByCameraId.filterAll(),i}}const Rs=V.createInstance();class Ns{constructor(e){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"cameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"startTime",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"endTime",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"createdAt",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"duration",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunks",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clipUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"description",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"version",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"raw",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isDownloading",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"archives",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),n(this,{name:a,clipUrl:a,isDownloading:a,update:s}),this.update(e)}get isTimelapse(){return this.type.startsWith("Timelaps")}update(e){var t;this.raw=e,this.id=e.id,this.createdAt=new Date(e.timeCreated),this.startTime=new Date(e.startTime),this.endTime=new Date(e.endTime),this.type=e.recordType,this.duration=e.duration,this.cameraId=e.cameraId,this.name=null!==(t=e.name)&&void 0!==t?t:e.tagName,this.description=e.description,this.clipUrl=e.clipUrl,this.version=e.version}}class Ds extends ne{constructor(e){super(),Object.defineProperty(this,"notification",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clipsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clipsByCreationDate",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clipsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clipsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clipsByType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clipsById",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clipsMap",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"loaded",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"loading",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"updates",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"add",{enumerable:!0,configurable:!0,writable:!0,value:e=>{const t=e.filter((e=>!this.clipsMap.has(e.id)));t.forEach((e=>this.clipsMap.set(e.id,e))),this.data.add(t),t.length&&this.updates++}}),Object.defineProperty(this,"addOrUpdate",{enumerable:!0,configurable:!0,writable:!0,value:e=>{const[t,r]=as(e,(e=>this.clipsMap.has(e.id)));r.forEach((e=>this.clipsMap.set(e.id,e))),this.data.add(r),t.forEach((e=>{var t;return null===(t=this.clipsMap.get(e.id))||void 0===t?void 0:t.update(e.raw)})),r.length&&this.updates++}}),Object.defineProperty(this,"removeFromStore",{enumerable:!0,configurable:!0,writable:!0,value:e=>{e.length&&(e.forEach((({id:e})=>{this.data.remove((t=>t.id===e)),this.clipsMap.delete(e)})),this.updates++)}}),Object.defineProperty(this,"createClip",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.api.archives.SaveArchive({...e,recordType:"Archive"}).pipe(R((e=>e.success?O(e.resultItems.map((e=>new Ns(e)))):y((()=>e.error))))).subscribe({next:t=>{var r;null===(r=this.notification)||void 0===r||r.success(Rs.t("archiveManager.clipCreatedMessage",{name:e.name}),{duration:3e3}),this.add(t)},error:t=>{var r;console.error(t),null===(r=this.notification)||void 0===r||r.error(Rs.t("archiveManager.clipNotSavedMessage",{name:e.name}))}})}}),Object.defineProperty(this,"createTimelapse",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.api.archives.SaveArchive({...e,recordType:"Timelaps"}).pipe(R((e=>e.success?O(e.resultItems.map((e=>new Ns(e)))):y((()=>e.error))))).subscribe({next:t=>{var r;null===(r=this.notification)||void 0===r||r.success(Rs.t("archiveManager.timelapseSavedMessage",{name:e.name})),this.add(t)},error:t=>{var r;console.error(t),null===(r=this.notification)||void 0===r||r.error(Rs.t("archiveManager.timelapseNotSavedMessage",{name:e.name}))}})}}),n(this,{loaded:a,loading:a,updates:a,add:s,addOrUpdate:s,removeFromStore:s}),this.data=L(),this.clipsByCameraId=this.data.dimension((e=>e.cameraId)),this.clipsByCreationDate=this.data.dimension((e=>+e.createdAt)),this.clipsByStart=this.data.dimension((e=>+e.startTime)),this.clipsByEnd=this.data.dimension((e=>+e.endTime)),this.clipsByType=this.data.dimension((e=>e.type)),this.clipsById=this.data.dimension((e=>e.id))}fetch(){this.loaded||this.loading||(this.loading=!0);const e=this.api.archives.GetArchives({}).pipe(R((e=>e.success?O(e.resultItems.map((e=>new Ns(e)))):(console.error(e.error),[]))),N());return e.subscribe((e=>{i((()=>{this.loaded=!0,this.loading=!1,this.add(e)}))})),e}getClips({cameraId:e,from:t,to:r}){this.clipsByStart.filter([-1/0,+r+5e-4]),this.clipsByEnd.filter([t,1/0]),this.clipsByType.filter("Archive"),e&&this.clipsByCameraId.filter(e);const i=this.clipsByStart.top(1/0);return e&&this.clipsByCameraId.filterAll(),this.clipsByStart.filterAll(),this.clipsByEnd.filterAll(),this.clipsByType.filterAll(),i}getTimelapses(){this.clipsByType.filterFunction((e=>e.startsWith("Timelaps")));const e=this.clipsByStart.top(1/0);return this.clipsByType.filterAll(),e}getRecentlyAdded(){const e=Date.now()-864e5;this.clipsByCreationDate.filterFunction((t=>t>e));const t=this.clipsByCreationDate.top(1/0);return this.clipsByCreationDate.filterAll(),t}all(){return this.clipsByStart.top(1/0)}getOnly(e,t="asc"){if(null===e){return"desc"===t?this.clipsByStart.top(1/0):this.clipsByStart.bottom(1/0)}this.clipsByType.filterFunction((t=>"clips"===e?!t.startsWith("Timelaps"):t.startsWith("Timelaps")));const r="desc"===t?this.clipsByStart.top(1/0):this.clipsByStart.bottom(1/0);return this.clipsByType.filterAll(),r}rename(e,t){this.api.archives.SaveArchive({...e.raw,name:t}).pipe(R((e=>e.success?O(e.resultItems):y((()=>e.error))))).subscribe({next:t=>{var r,i;null===(r=this.clipsMap.get(e.id))||void 0===r||r.update(t[0]),null===(i=this.notification)||void 0===i||i.success(Rs.t("clips.renameSuccess"),{duration:3e3})},error:e=>{var t;console.error(e),null===(t=this.notification)||void 0===t||t.error(Rs.t("clips.renameError"))}})}delete(e){this.api.archives.DeleteArchive({id:e.id,version:e.version,cameraId:e.cameraId}).pipe(R((e=>e.success?O(e.resultItems.map((e=>new Ns(e)))):y((()=>e.error))))).subscribe({next:()=>{var t;this.removeFromStore([e]),null===(t=this.notification)||void 0===t||t.success(Rs.t("clipDeleted",{name:e.name}))},error:t=>{var r;console.error(t),null===(r=this.notification)||void 0===r||r.error(Rs.t("archiveManager.archiveNotDeletedMessage",{name:e.name}))}})}afterInit(){this.api.events.pipe(U((({hub:e,event:t})=>"archives"===e&&"OnArchiveAdded"===t))).subscribe((({data:e})=>{this.add(e.resultItems.map((e=>new Ns(e))))})),this.api.events.pipe(U((({hub:e,event:t})=>"archives"===e&&"OnTimelapsAdded"===t))).subscribe((({data:e})=>{this.addOrUpdate(e.resultItems.map((e=>new Ns({...e,recordType:"Timelaps"}))))})),this.api.events.pipe(U((({hub:e,event:t})=>"archives"===e&&"OnArchiveDeleted"===t))).subscribe((({data:e})=>{this.removeFromStore(e.resultItems)}))}dispose(){this.data.remove(Ss),this.clipsMap.clear(),this.updates++,super.dispose()}}class Us{constructor(e){Object.defineProperty(this,"notifier",{enumerable:!0,configurable:!0,writable:!0,value:e})}error(e){this.notifier.error(e)}success(e,t){this.notifier.success(e,t)}warn(e){this.notifier.warn(e)}}const qs="default",Ms=new Map;class Fs{constructor(t){Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"initialized",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"cameras",{enumerable:!0,configurable:!0,writable:!0,value:new ye}),Object.defineProperty(this,"archives",{enumerable:!0,configurable:!0,writable:!0,value:new pe(this.cameras)}),Object.defineProperty(this,"events",{enumerable:!0,configurable:!0,writable:!0,value:new Bs(this.cameras)}),Object.defineProperty(this,"eventSchema",{enumerable:!0,configurable:!0,writable:!0,value:new je}),Object.defineProperty(this,"thumbnails",{enumerable:!0,configurable:!0,writable:!0,value:new _s}),Object.defineProperty(this,"account",{enumerable:!0,configurable:!0,writable:!0,value:new he}),Object.defineProperty(this,"notification",{enumerable:!0,configurable:!0,writable:!0,value:new Us({success:console.log,warn:console.warn,error:console.error})}),Object.defineProperty(this,"library",{enumerable:!0,configurable:!0,writable:!0,value:new Ds(this.notification)}),Object.defineProperty(this,"auth",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"disposables",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"tokenUpdateReactions",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.disposables.forEach((e=>{e instanceof T?e.closed||e.unsubscribe():e()})),this.tokenUpdateReactions.forEach((e=>e())),this.tokenUpdateReactions.clear(),this.auth.signOut(),this.cameras.dispose(),this.events.dispose(),this.thumbnails.dispose(),this.eventSchema.dispose(),this.account.dispose(),this.library.dispose(),Ms.delete(this.name)}}),Object.defineProperty(this,"onTokenUpdate",{enumerable:!0,configurable:!0,writable:!0,value:t=>{if(!this.auth)throw new Error("app has to be inited first");const r=e((()=>this.auth.token),(e=>t((null==e?void 0:e.json)||null)));return this.tokenUpdateReactions.add(r),()=>{r(),this.tokenUpdateReactions.delete(r)}}}),n(this,{initialized:a}),this.disposables.push(o((()=>!!this.account.user),(()=>{this.cameras.load()})))}init({token:e,tokenStorage:t=new ie,tokenStorageKey:r,apiUrl:n="https://services.3deye.me/reactiveapi",tokenServiceUrl:a="https://admin.3deye.me/webapi/v3/auth/token"},s=qs){if(r||(r=`@3deye-toolkit/${s}/token`),Ms.has(s))return console.warn("Can`t init two apps with the same name"),Ms.get(s);if(this.auth&&s===this.name)return console.warn("Can`t init already inited app"),this;if(this.auth||this.name===qs&&s!==qs)return new Fs(s).init({token:e,tokenStorage:t,tokenStorageKey:r,apiUrl:n,tokenServiceUrl:a},s);const o=e&&"clientId"in e?e.clientId:"WebApp";return e&&t.setItem(r,JSON.stringify(e)),this.auth=new re({tokenServiceUrl:a,tokenStorageKey:r,storage:t,clientId:o,deviceInfo:null}),this.api=ee.create(H,this.auth,(e=>E(n,{qs:{access_token:e}}))),this.cameras.initWith(this.api),this.archives.initWith(this.api),this.library.initWith(this.api),this.events.initWith(this.api),this.eventSchema.initWith(this.api),this.thumbnails.initWith(this.api),this.account.initWith(this.api),this.account.setAuthStore(this.auth),i((()=>{this.initialized=!0})),Ms.set(s,this),this}}const xs=new Fs(qs),zs=$.createContext(null);export{zs as AppContext,xs as app};
1
+ import e from"jqueryless-signalr";import{makeObservable as t,observable as n,action as s,computed as r,reaction as i,when as a,runInAction as o,observe as u}from"mobx";import{Subscription as c,filter as l,map as h,mergeMap as d,of as p,throwError as f,tap as m,shareReplay as v,retry as y,expand as g,EMPTY as b,last as I,Subject as w,skip as T,exhaustMap as k,takeUntil as S,share as C,BehaviorSubject as B,switchMap as _,timer as E,delay as O,take as A,catchError as R,Observable as j,startWith as N,pairwise as q,concatMap as U}from"rxjs";import D from"string-natural-compare";import P from"crossfilter2";import{z as F}from"zod";import x from"react";var M="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function z(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var L="object"==typeof M&&M&&M.Object===Object&&M,W=L,V="object"==typeof self&&self&&self.Object===Object&&self,G=W||V||Function("return this")(),$=G.Symbol,H=$,Y=Object.prototype,K=Y.hasOwnProperty,J=Y.toString,Z=H?H.toStringTag:void 0;var Q=function(e){var t=K.call(e,Z),n=e[Z];try{e[Z]=void 0;var s=!0}catch(e){}var r=J.call(e);return s&&(t?e[Z]=n:delete e[Z]),r},X=Object.prototype.toString;var ee=Q,te=function(e){return X.call(e)},ne=$?$.toStringTag:void 0;var se=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":ne&&ne in Object(e)?ee(e):te(e)};var re=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)},ie=se,ae=re;var oe,ue=function(e){if(!ae(e))return!1;var t=ie(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t},ce=G["__core-js_shared__"],le=(oe=/[^.]+$/.exec(ce&&ce.keys&&ce.keys.IE_PROTO||""))?"Symbol(src)_1."+oe:"";var he=function(e){return!!le&&le in e},de=Function.prototype.toString;var pe=function(e){if(null!=e){try{return de.call(e)}catch(e){}try{return e+""}catch(e){}}return""},fe=ue,me=he,ve=re,ye=pe,ge=/^\[object .+?Constructor\]$/,be=Function.prototype,Ie=Object.prototype,we=be.toString,Te=Ie.hasOwnProperty,ke=RegExp("^"+we.call(Te).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");var Se=function(e){return!(!ve(e)||me(e))&&(fe(e)?ke:ge).test(ye(e))},Ce=function(e,t){return null==e?void 0:e[t]};var Be=function(e,t){var n=Ce(e,t);return Se(n)?n:void 0},_e=Be(Object,"create"),Ee=_e;var Oe=function(){this.__data__=Ee?Ee(null):{},this.size=0};var Ae=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},Re=_e,je=Object.prototype.hasOwnProperty;var Ne=function(e){var t=this.__data__;if(Re){var n=t[e];return"__lodash_hash_undefined__"===n?void 0:n}return je.call(t,e)?t[e]:void 0},qe=_e,Ue=Object.prototype.hasOwnProperty;var De=_e;var Pe=Oe,Fe=Ae,xe=Ne,Me=function(e){var t=this.__data__;return qe?void 0!==t[e]:Ue.call(t,e)},ze=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=De&&void 0===t?"__lodash_hash_undefined__":t,this};function Le(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var s=e[t];this.set(s[0],s[1])}}Le.prototype.clear=Pe,Le.prototype.delete=Fe,Le.prototype.get=xe,Le.prototype.has=Me,Le.prototype.set=ze;var We=Le;var Ve=function(){this.__data__=[],this.size=0};var Ge=function(e,t){return e===t||e!=e&&t!=t},$e=Ge;var He=function(e,t){for(var n=e.length;n--;)if($e(e[n][0],t))return n;return-1},Ye=He,Ke=Array.prototype.splice;var Je=He;var Ze=He;var Qe=He;var Xe=Ve,et=function(e){var t=this.__data__,n=Ye(t,e);return!(n<0)&&(n==t.length-1?t.pop():Ke.call(t,n,1),--this.size,!0)},tt=function(e){var t=this.__data__,n=Je(t,e);return n<0?void 0:t[n][1]},nt=function(e){return Ze(this.__data__,e)>-1},st=function(e,t){var n=this.__data__,s=Qe(n,e);return s<0?(++this.size,n.push([e,t])):n[s][1]=t,this};function rt(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var s=e[t];this.set(s[0],s[1])}}rt.prototype.clear=Xe,rt.prototype.delete=et,rt.prototype.get=tt,rt.prototype.has=nt,rt.prototype.set=st;var it=rt,at=Be(G,"Map"),ot=We,ut=it,ct=at;var lt=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e};var ht=function(e,t){var n=e.__data__;return lt(t)?n["string"==typeof t?"string":"hash"]:n.map},dt=ht;var pt=ht;var ft=ht;var mt=ht;var vt=function(){this.size=0,this.__data__={hash:new ot,map:new(ct||ut),string:new ot}},yt=function(e){var t=dt(this,e).delete(e);return this.size-=t?1:0,t},gt=function(e){return pt(this,e).get(e)},bt=function(e){return ft(this,e).has(e)},It=function(e,t){var n=mt(this,e),s=n.size;return n.set(e,t),this.size+=n.size==s?0:1,this};function wt(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var s=e[t];this.set(s[0],s[1])}}wt.prototype.clear=vt,wt.prototype.delete=yt,wt.prototype.get=gt,wt.prototype.has=bt,wt.prototype.set=It;var Tt=wt,kt=Tt;function St(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function(){var s=arguments,r=t?t.apply(this,s):s[0],i=n.cache;if(i.has(r))return i.get(r);var a=e.apply(this,s);return n.cache=i.set(r,a)||i,a};return n.cache=new(St.Cache||kt),n}St.Cache=kt;var Ct=St;class Bt{values=new Map;getItem(e){return this.values.get(e)||null}setItem(e,t){this.values.set(e,t)}removeItem(e){this.values.delete(e)}}function _t(e){if(e.length<2)return e;const t=[e[0]];for(let n=1;n<e.length;n++){const s=t.length-1,r=t[s],i=e[n];i[0]>r[1]?t.push(i):t[s]=[r[0],new Date(Math.max(+r[1],+i[1]))]}return t}const Et=()=>!0;class Ot{api;disposables=[];initWith(e){this.api=e,this.afterInit&&this.afterInit()}dispose(){for(const e of this.disposables)e instanceof c?e.closed||e.unsubscribe():e()}}var At;!function(e){e.DEFAULT_VIDEO_RESIZE_MODE="defaultVideoResizeMode",e.RESIZE_MODE_PER_CAMERA="camerasResizeMode",e.FISHEYE_CAMERAS="fisheyeCameras",e.UTC="utc",e.HOUR12="hour12",e.START_OF_WEEK="startOfWeek"}(At||(At={}));const Rt=F.enum(["fill","contain"]),jt=F.object({lat:F.number(),lon:F.number(),fov:F.number()}),Nt=F.object({params:F.object({x:F.number(),y:F.number(),r:F.number(),s:F.number()}),positions:F.tuple([jt,jt,jt]).optional()}),qt=F.tuple([F.number(),F.number(),F.number()]),Ut=F.object({[At.DEFAULT_VIDEO_RESIZE_MODE]:Rt.optional(),[At.RESIZE_MODE_PER_CAMERA]:F.array(F.tuple([F.number(),Rt])).optional(),[At.FISHEYE_CAMERAS]:F.array(F.tuple([F.number(),F.union([qt,Nt,F.null()])])).optional(),[At.UTC]:F.boolean().default(!1),[At.HOUR12]:F.boolean().default(!1),[At.START_OF_WEEK]:F.enum(["monday","sunday"]).default("monday")});class Dt extends Ot{notification;user=null;auth;constructor(e){super(),this.notification=e,t(this,{user:n.ref,setUser:s,userDisplayName:r,preferences:r,isSharingUserAccount:r})}get isSharingUserAccount(){return this.user?.email.endsWith("@share.share")||!1}get userDisplayName(){return this.user?this.user.firstName?.trim()||this.user.lastName?.trim()?[this.user.firstName,this.user.lastName].filter(Boolean).join(" ").trim():this.user.email:null}afterInit(){this.disposables.push(this.api.events.pipe(l((({hub:e,event:t})=>"users"===e&&"OnUserUpdateProfile"===t)),h((({data:e})=>e.resultItems[0]))).subscribe(this.setUser))}loadUser$(){return this.api.users.GetUser().pipe(d((e=>e.success?p(e.resultItems[0]):f((()=>e.error)))),m(this.setUser),v(1))}setUser=e=>{this.user=e};setAuthStore(e){this.auth=e,this.disposables.push(i((()=>this.auth.isAuthenticated),(()=>{this.auth.isAuthenticated&&this.loadUser$().subscribe()})))}async updateUserPassword(e){const t=function(){throw new Error("Config not initialized")}().changePasswordUrl,n=this.auth?.token?.accessToken,s=JSON.stringify({currentPassword:e.previous,newPassword:e.new}),r=new Headers;r.append("content-type","application/json"),r.append("accept","application/json"),r.append("authorization",`bearer ${n}`);const i=await fetch(t,{method:"PUT",headers:r,body:s}),{status:a}=i;if(200!==a){const e=await i.json();throw new Error(e.errors[0].message)}}updateUserSettings({firstName:e,lastName:t}){const n=p(null).pipe(d((()=>{if(!this.user)throw new Error("user is not initialized");return this.api.users.UserUpdateProfile({id:this.user.id,firstName:e,lastName:t,version:this.user.version})})),d((e=>e.success?p(e.resultItems[0]):f((()=>e.error)))),this.retryOnVersionMismatch(),v());return n.subscribe((e=>{this.setUser(e)})),n}updateUserLanguage(e){const t=p(null).pipe(d((()=>{if(!this.user)throw new Error("user is not initialized");return this.api.users.UserUpdateProfile({id:this.user.id,languageCode:e,version:this.user.version})})),d((e=>e.success?p(e.resultItems[0]):f((()=>e.error)))),this.retryOnVersionMismatch(),v());return t.subscribe((e=>{this.setUser(e)})),t}updateCustomPreferences=e=>{const t=p(null).pipe(d((()=>{if(!this.user)return f((()=>"user is not initialized"));const t={id:this.user.id,jsonField:JSON.stringify({...JSON.parse(this.user.jsonField||"{}"),...e}),version:this.user.version};return this.api.users.UserUpdateProfile(t)})),d((e=>e.success?p(e.resultItems[0]):f((()=>e.error)))),this.retryOnVersionMismatch(),v());return t.subscribe((e=>{this.setUser(e)})),t};setDefaultGroup(e){const t=p(null).pipe(d((()=>{if(!this.user)return f((()=>"user is not initialized"));const t={id:this.user.id,layoutStartId:e,layoutStartType:"camgroup",version:this.user.version};return this.api.users.UserUpdateProfile(t)})),d((e=>e.success?p(e.resultItems[0]):f((()=>e.error)))),this.retryOnVersionMismatch(),v());return t.subscribe({next:e=>{this.setUser(e),this.notification?.success("Successfully set default group")},error:e=>{console.error(e),this.notification?.error(e.message)}}),t}get preferences(){try{return Ut.parse(JSON.parse(this.user?.jsonField||"{}"))}catch(e){console.error(e)}return{[At.DEFAULT_VIDEO_RESIZE_MODE]:void 0,[At.RESIZE_MODE_PER_CAMERA]:void 0,[At.FISHEYE_CAMERAS]:void 0,[At.UTC]:!1,[At.HOUR12]:!1,[At.START_OF_WEEK]:"monday"}}getPreference=e=>this.preferences[e];retryOnVersionMismatch=()=>y({delay:(e,t)=>t>1?f((()=>e)):-4===e?.code?this.loadUser$():f((()=>e))})}class Pt{json;startTime;endTime;streamUrl;duration;isLive=!1;cameraId;id;constructor(e){this.json=JSON.stringify(e,null,2),this.startTime=new Date(e.startTime),this.endTime=new Date(e.endTime),this.streamUrl=e.streamUrl,this.cameraId=e.cameraId,this.duration=e.duration,this.id=e.id}}class Ft{id;name;imageUrl;streamUrl;dashStreamUrl;address;archiveDuration;dvrWindowLength;stateUpdatedAt;raw;enabled;isMicEnabled;state;pin;webRtcUrl;isPtz;permissions;get isOnline(){return this.enabled&&"Started"===this.state}get supportsWebRTC(){return!!this.webRtcUrl}constructor(e){t(this,{name:n,streamUrl:n,dashStreamUrl:n,enabled:n,isMicEnabled:n,state:n,pin:n,webRtcUrl:n,permissions:n,isOnline:r,update:s}),this.update(e)}update=e=>{this.raw=e,this.id=e.id,this.name=e.name,this.isPtz=e.isPTZ,this.isMicEnabled=e.isMicEnabled,this.imageUrl=e.imageUrl,this.address=e.cameraAddress?JSON.parse(e.cameraAddress):null,this.streamUrl=e.streamUrl,this.dashStreamUrl=e.dashStreamUrl,this.enabled=e.enabled,this.state=this.raw.cameraState,this.dvrWindowLength=e.dvrWindowLength?1e3*e.dvrWindowLength:e.dvrWindowLength,this.archiveDuration=e.archiveDuration,this.pin=e.pin,this.webRtcUrl=e.webRtcUrl,this.permissions=e.permissions||0,this.stateUpdatedAt=new Date(e.cameraStateChangedTime)};can=e=>!!(this.permissions&e)}var xt;!function(e){e[e.View=1]="View",e[e.SaveClip=2]="SaveClip",e[e.Share=4]="Share",e[e.Ptz=8]="Ptz",e[e.EditSettings=16]="EditSettings",e[e.Timelapse=32]="Timelapse",e[e.Delete=64]="Delete"}(xt||(xt={}));const Mt=new Set(["LicensePlate","FaceDetection","Analytic","SpeedDetection","Temperature","PoS","GPS","DigitalInput","Loitering"]);class zt{id;cameraId;type;raw;thumbnailUrl;thumbnailWidth=0;thumbnailHeight=0;detectedObjects;faces;instant;get startTime(){return new Date(this.raw.startTime)}get endTime(){return new Date(this.raw.endTime)}get isLive(){return!Mt.has(this.type)&&+this.startTime==+this.endTime}get acknowledged(){return"sensorId"in this.raw&&!!this.raw.ackEventType}update=e=>{this.raw=e};constructor(e){if(t(this,{startTime:r,endTime:r,acknowledged:r,isLive:r,raw:n.ref,update:s}),this.raw=e,this.id=e.id,this.type=e.eventType,this.cameraId=e.sensorId,("Analytic"===this.type||"FaceDetection"===this.type||"Loitering"===this.type)&&e.data)try{const t=JSON.parse(e.data);t.FoundObjects&&(this.detectedObjects=t.FoundObjects),t.Faces&&(this.type="FaceDetection",this.faces=t.Faces),t.ThumbnailSize&&(this.thumbnailWidth=t.ThumbnailSize.Width,this.thumbnailHeight=t.ThumbnailSize.Height),this.thumbnailUrl=t.ThumbnailUrl}catch{console.warn("invalid data",e.data),this.type="Motion"}this.instant=Mt.has(this.type),this.detectedObjects||(this.detectedObjects=[])}}const Lt=5e-4;class Wt extends Ot{camerasStore;data;chunksByCameraId;chunksByStart;chunksByEnd;chunksById=new Map;pendingRequests;pendingRequestsByEnd;pendingRequestsByStart;pendingRequestsByCameraId;knownIntervals=new Map;updates=0;constructor(e){super(),this.camerasStore=e,t(this,{updates:n,add:s.bound}),this.data=P(),this.chunksByCameraId=this.data.dimension((e=>e.cameraId)),this.chunksByStart=this.data.dimension((e=>+e.startTime)),this.chunksByEnd=this.data.dimension((e=>+e.endTime)),this.pendingRequests=P(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.startTime)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.endTime)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId))}fetch(e,t,n){this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(n);const s=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),s)return s.request;if(this.knownIntervals.has(e)){const[s,r]=this.knownIntervals.get(e);if(s<=t&&r>=n)return p(this.getChunks({cameraId:e,from:t,to:n}));s<=t&&r<n&&(t=r),s>t&&r>=n&&(n=s),n<s&&(n=s),t>r&&(t=r)}const r=this.api.archives.PopulateArchive({cameraId:e,startTime:t,endTime:n}).pipe(h((e=>e.resultItems[0].chunks.map((e=>new Pt(e))))),m(this.add),m((n=>this.extendKnownInterval(e,t,n))),v());return this.pendingRequests.add([{cameraId:e,startTime:t,endTime:n,request:r}]),r.pipe(m((()=>this.pendingRequests.remove((e=>e.request===r))))).subscribe(),r}extendKnownInterval(e,t,n){t=new Date(Math.min(+t,...n.map((e=>+e.startTime))));const s=new Date(Math.max(...n.map((e=>+e.endTime))));if(this.knownIntervals.has(e)){const n=this.knownIntervals.get(e);t<n[0]&&(n[0]=t),s>n[1]&&(n[1]=s)}else this.knownIntervals.set(e,[t,s])}add(e){const t=e.filter((e=>!this.chunksById.has(e.id)));t.forEach((e=>this.chunksById.set(e.id,e))),this.data.add(t),t.length&&this.updates++}getChunks({cameraId:e,from:t,to:n}){this.chunksByStart.filter([-1/0,+n+Lt]),this.chunksByEnd.filter([t,1/0]),e&&this.chunksByCameraId.filter(e);const s=this.chunksByStart.top(1/0);return e&&this.chunksByCameraId.filterAll(),this.chunksByStart.filterAll(),this.chunksByEnd.filterAll(),s}getClosestChunkRight=({cameraId:e,time:t})=>{this.chunksByCameraId.filter(e),this.chunksByEnd.filter([t,1/0]);const n=this.chunksByStart.bottom(1);return this.chunksByCameraId.filterAll(),this.chunksByEnd.filterAll(),n[0]};getClosestChunkLeft=({cameraId:e,time:t})=>{this.chunksByCameraId.filter(e),this.chunksByStart.filter([-1/0,+t+Lt]);const n=this.chunksByStart.top(1);return this.chunksByCameraId.filterAll(),this.chunksByEnd.filterAll(),n[0]};fetchNextChunk=({cameraId:e,time:t})=>{if(this.knownIntervals.has(e)){const[n,s]=this.knownIntervals.get(e);if(n<=t&&s>=t){const n=this.getClosestChunkRight({cameraId:e,time:t});if(n)return p(n)}}return p({result:[],time:t}).pipe(g((({result:t,time:n})=>{if(t.length||n>=new Date)return b;const s=new Date(+n+36e5);return this.fetch(e,n,s).pipe(h((e=>({result:e,time:s}))))})),I(),h((()=>this.getClosestChunkRight({cameraId:e,time:t}))))};fetchPrevChunk=({cameraId:e,time:t})=>{if(this.knownIntervals.has(e)){const[n,s]=this.knownIntervals.get(e);if(n<=t&&s>=t){const n=this.getClosestChunkLeft({cameraId:e,time:t});if(n)return p(n)}}const n=this.camerasStore.camerasById.get(e);if(!n)return p(void 0);const s=new Date(Date.now()-3600*n.archiveDuration*1e3);return this.knownIntervals.get(e)&&this.knownIntervals.get(e)[0]<=s?p(void 0):p({result:[],time:t}).pipe(g((({result:t,time:n})=>{if(t.length||n<=s)return b;const r=new Date(Math.max(+n-36e5,+s));return this.fetch(e,r,n).pipe(h((e=>({result:e,time:r}))))})),I(),h((()=>this.getClosestChunkRight({cameraId:e,time:t}))))};afterInit(){this.api.events.pipe(l((({hub:e,event:t})=>"archives"===e&&"OnArchiveChunksCreated"===t))).subscribe((({data:e})=>{this.add(e.resultItems.map((e=>new Pt(e))))}))}}class Vt extends Ot{camerasById=new Map;data=[];loading=!1;loaded=!1;pendingLoadRequest;requestsCanceler=new w;constructor(){super(),t(this,{data:n.ref,loading:n,loaded:n,add:s}),this.disposables.push(a((()=>this.loaded),(()=>{this.api.connection$.pipe(T(1),k((()=>this.sync()))).subscribe()})))}load=()=>{if(this.loaded)return p([]);if(this.pendingLoadRequest)return this.pendingLoadRequest;o((()=>{this.loading=!0})),this.pendingLoadRequest=this.api.cameras.GetCameras({},null).pipe(d((e=>e.success?p(e.resultItems):(console.error(e.error),f((()=>e.error))))),v(1),S(this.requestsCanceler));const e=this.pendingLoadRequest;return e.subscribe((e=>{this.pendingLoadRequest=void 0,o((()=>{this.add(e),this.loading=!1,this.loaded=!0}))})),e};add=e=>{for(const t of e)this.camerasById.has(t.id)?this.camerasById.get(t.id)?.update(t):this.camerasById.set(t.id,new Ft(t));this.data=Array.from(this.camerasById.values()).sort(((e,t)=>D(e.name,t.name,{caseInsensitive:!0})))};sync=()=>{const e=this.data.reduce(((e,t)=>Math.max(e,+t.stateUpdatedAt)),0);if(!e)return b;const t=this.api.cameras.GetCameras({},new Date(1e3*(Math.floor(e/1e3)+1))).pipe(d((e=>e.success?p(e.resultItems):(console.error(e.error),f((()=>e.error))))),v(1),S(this.requestsCanceler));return t.subscribe((e=>this.add(e))),t};afterInit(){this.disposables.push(this.api.events.pipe(l((({hub:e,event:t})=>"cameras"===e&&("OnCameraUpdated"===t||"OnSystemCameraUpdated"===t))),h((({data:e,event:t})=>"resultItems"in e?{data:e.resultItems[0],event:t}:{data:e,event:t}))).subscribe((({data:e,event:t})=>{const n=this.camerasById.get(e.id);if(!n)return console.warn("got update for unknown camera:",e.id);if("OnSystemCameraUpdated"===t){const t=n.raw;for(const[n,s]of Object.entries(e))null===s&&(e[n]=t[n])}n.update(e)})))}dispose(){this.requestsCanceler.next(),this.camerasById.clear(),this.data=[],this.loading=!1,this.loaded=!1,super.dispose()}}var Gt=function(e,t,n,s){for(var r=-1,i=null==e?0:e.length;++r<i;){var a=e[r];t(s,a,n(a),e)}return s};var $t=function(e){return function(t,n,s){for(var r=-1,i=Object(t),a=s(t),o=a.length;o--;){var u=a[e?o:++r];if(!1===n(i[u],u,i))break}return t}}();var Ht=function(e,t){for(var n=-1,s=Array(e);++n<e;)s[n]=t(n);return s};var Yt=function(e){return null!=e&&"object"==typeof e},Kt=se,Jt=Yt;var Zt=function(e){return Jt(e)&&"[object Arguments]"==Kt(e)},Qt=Yt,Xt=Object.prototype,en=Xt.hasOwnProperty,tn=Xt.propertyIsEnumerable,nn=Zt(function(){return arguments}())?Zt:function(e){return Qt(e)&&en.call(e,"callee")&&!tn.call(e,"callee")},sn=Array.isArray,rn={exports:{}};var an=function(){return!1};!function(e,t){var n=G,s=an,r=t&&!t.nodeType&&t,i=r&&e&&!e.nodeType&&e,a=i&&i.exports===r?n.Buffer:void 0,o=(a?a.isBuffer:void 0)||s;e.exports=o}(rn,rn.exports);var on=rn.exports,un=/^(?:0|[1-9]\d*)$/;var cn=function(e,t){var n=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==n||"symbol"!=n&&un.test(e))&&e>-1&&e%1==0&&e<t};var ln=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991},hn=se,dn=ln,pn=Yt,fn={};fn["[object Float32Array]"]=fn["[object Float64Array]"]=fn["[object Int8Array]"]=fn["[object Int16Array]"]=fn["[object Int32Array]"]=fn["[object Uint8Array]"]=fn["[object Uint8ClampedArray]"]=fn["[object Uint16Array]"]=fn["[object Uint32Array]"]=!0,fn["[object Arguments]"]=fn["[object Array]"]=fn["[object ArrayBuffer]"]=fn["[object Boolean]"]=fn["[object DataView]"]=fn["[object Date]"]=fn["[object Error]"]=fn["[object Function]"]=fn["[object Map]"]=fn["[object Number]"]=fn["[object Object]"]=fn["[object RegExp]"]=fn["[object Set]"]=fn["[object String]"]=fn["[object WeakMap]"]=!1;var mn=function(e){return pn(e)&&dn(e.length)&&!!fn[hn(e)]};var vn=function(e){return function(t){return e(t)}},yn={exports:{}};!function(e,t){var n=L,s=t&&!t.nodeType&&t,r=s&&e&&!e.nodeType&&e,i=r&&r.exports===s&&n.process,a=function(){try{var e=r&&r.require&&r.require("util").types;return e||i&&i.binding&&i.binding("util")}catch(e){}}();e.exports=a}(yn,yn.exports);var gn=yn.exports,bn=mn,In=vn,wn=gn&&gn.isTypedArray,Tn=wn?In(wn):bn,kn=Ht,Sn=nn,Cn=sn,Bn=on,_n=cn,En=Tn,On=Object.prototype.hasOwnProperty;var An=function(e,t){var n=Cn(e),s=!n&&Sn(e),r=!n&&!s&&Bn(e),i=!n&&!s&&!r&&En(e),a=n||s||r||i,o=a?kn(e.length,String):[],u=o.length;for(var c in e)!t&&!On.call(e,c)||a&&("length"==c||r&&("offset"==c||"parent"==c)||i&&("buffer"==c||"byteLength"==c||"byteOffset"==c)||_n(c,u))||o.push(c);return o},Rn=Object.prototype;var jn=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||Rn)};var Nn=function(e,t){return function(n){return e(t(n))}}(Object.keys,Object),qn=jn,Un=Nn,Dn=Object.prototype.hasOwnProperty;var Pn=ue,Fn=ln;var xn=function(e){return null!=e&&Fn(e.length)&&!Pn(e)},Mn=An,zn=function(e){if(!qn(e))return Un(e);var t=[];for(var n in Object(e))Dn.call(e,n)&&"constructor"!=n&&t.push(n);return t},Ln=xn;var Wn=function(e){return Ln(e)?Mn(e):zn(e)},Vn=$t,Gn=Wn;var $n=xn;var Hn=function(e,t){return function(n,s){if(null==n)return n;if(!$n(n))return e(n,s);for(var r=n.length,i=t?r:-1,a=Object(n);(t?i--:++i<r)&&!1!==s(a[i],i,a););return n}}((function(e,t){return e&&Vn(e,t,Gn)}));var Yn=function(e,t,n,s){return Hn(e,(function(e,r,i){t(s,e,n(e),i)})),s},Kn=it;var Jn=it,Zn=at,Qn=Tt;var Xn=it,es=function(){this.__data__=new Kn,this.size=0},ts=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},ns=function(e){return this.__data__.get(e)},ss=function(e){return this.__data__.has(e)},rs=function(e,t){var n=this.__data__;if(n instanceof Jn){var s=n.__data__;if(!Zn||s.length<199)return s.push([e,t]),this.size=++n.size,this;n=this.__data__=new Qn(s)}return n.set(e,t),this.size=n.size,this};function is(e){var t=this.__data__=new Xn(e);this.size=t.size}is.prototype.clear=es,is.prototype.delete=ts,is.prototype.get=ns,is.prototype.has=ss,is.prototype.set=rs;var as=is;var os=Tt,us=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},cs=function(e){return this.__data__.has(e)};function ls(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new os;++t<n;)this.add(e[t])}ls.prototype.add=ls.prototype.push=us,ls.prototype.has=cs;var hs=ls;var ds=function(e,t){return e.has(t)},ps=hs,fs=function(e,t){for(var n=-1,s=null==e?0:e.length;++n<s;)if(t(e[n],n,e))return!0;return!1},ms=ds;var vs=function(e,t,n,s,r,i){var a=1&n,o=e.length,u=t.length;if(o!=u&&!(a&&u>o))return!1;var c=i.get(e),l=i.get(t);if(c&&l)return c==t&&l==e;var h=-1,d=!0,p=2&n?new ps:void 0;for(i.set(e,t),i.set(t,e);++h<o;){var f=e[h],m=t[h];if(s)var v=a?s(m,f,h,t,e,i):s(f,m,h,e,t,i);if(void 0!==v){if(v)continue;d=!1;break}if(p){if(!fs(t,(function(e,t){if(!ms(p,t)&&(f===e||r(f,e,n,s,i)))return p.push(t)}))){d=!1;break}}else if(f!==m&&!r(f,m,n,s,i)){d=!1;break}}return i.delete(e),i.delete(t),d};var ys=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e,s){n[++t]=[s,e]})),n};var gs=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=e})),n},bs=G.Uint8Array,Is=Ge,ws=vs,Ts=ys,ks=gs,Ss=$?$.prototype:void 0,Cs=Ss?Ss.valueOf:void 0;var Bs=function(e,t,n,s,r,i,a){switch(n){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!i(new bs(e),new bs(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return Is(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var o=Ts;case"[object Set]":var u=1&s;if(o||(o=ks),e.size!=t.size&&!u)return!1;var c=a.get(e);if(c)return c==t;s|=2,a.set(e,t);var l=ws(o(e),o(t),s,r,i,a);return a.delete(e),l;case"[object Symbol]":if(Cs)return Cs.call(e)==Cs.call(t)}return!1};var _s=function(e,t){for(var n=-1,s=t.length,r=e.length;++n<s;)e[r+n]=t[n];return e},Es=sn;var Os=function(e,t,n){var s=t(e);return Es(e)?s:_s(s,n(e))};var As=function(e,t){for(var n=-1,s=null==e?0:e.length,r=0,i=[];++n<s;){var a=e[n];t(a,n,e)&&(i[r++]=a)}return i},Rs=function(){return[]},js=Object.prototype.propertyIsEnumerable,Ns=Object.getOwnPropertySymbols,qs=Os,Us=Ns?function(e){return null==e?[]:(e=Object(e),As(Ns(e),(function(t){return js.call(e,t)})))}:Rs,Ds=Wn;var Ps=function(e){return qs(e,Ds,Us)},Fs=Object.prototype.hasOwnProperty;var xs=function(e,t,n,s,r,i){var a=1&n,o=Ps(e),u=o.length;if(u!=Ps(t).length&&!a)return!1;for(var c=u;c--;){var l=o[c];if(!(a?l in t:Fs.call(t,l)))return!1}var h=i.get(e),d=i.get(t);if(h&&d)return h==t&&d==e;var p=!0;i.set(e,t),i.set(t,e);for(var f=a;++c<u;){var m=e[l=o[c]],v=t[l];if(s)var y=a?s(v,m,l,t,e,i):s(m,v,l,e,t,i);if(!(void 0===y?m===v||r(m,v,n,s,i):y)){p=!1;break}f||(f="constructor"==l)}if(p&&!f){var g=e.constructor,b=t.constructor;g==b||!("constructor"in e)||!("constructor"in t)||"function"==typeof g&&g instanceof g&&"function"==typeof b&&b instanceof b||(p=!1)}return i.delete(e),i.delete(t),p},Ms=Be(G,"DataView"),zs=Be(G,"Promise"),Ls=Be(G,"Set"),Ws=Ms,Vs=at,Gs=zs,$s=Ls,Hs=Be(G,"WeakMap"),Ys=se,Ks=pe,Js="[object Map]",Zs="[object Promise]",Qs="[object Set]",Xs="[object WeakMap]",er="[object DataView]",tr=Ks(Ws),nr=Ks(Vs),sr=Ks(Gs),rr=Ks($s),ir=Ks(Hs),ar=Ys;(Ws&&ar(new Ws(new ArrayBuffer(1)))!=er||Vs&&ar(new Vs)!=Js||Gs&&ar(Gs.resolve())!=Zs||$s&&ar(new $s)!=Qs||Hs&&ar(new Hs)!=Xs)&&(ar=function(e){var t=Ys(e),n="[object Object]"==t?e.constructor:void 0,s=n?Ks(n):"";if(s)switch(s){case tr:return er;case nr:return Js;case sr:return Zs;case rr:return Qs;case ir:return Xs}return t});var or=as,ur=vs,cr=Bs,lr=xs,hr=ar,dr=sn,pr=on,fr=Tn,mr="[object Arguments]",vr="[object Array]",yr="[object Object]",gr=Object.prototype.hasOwnProperty;var br=function(e,t,n,s,r,i){var a=dr(e),o=dr(t),u=a?vr:hr(e),c=o?vr:hr(t),l=(u=u==mr?yr:u)==yr,h=(c=c==mr?yr:c)==yr,d=u==c;if(d&&pr(e)){if(!pr(t))return!1;a=!0,l=!1}if(d&&!l)return i||(i=new or),a||fr(e)?ur(e,t,n,s,r,i):cr(e,t,u,n,s,r,i);if(!(1&n)){var p=l&&gr.call(e,"__wrapped__"),f=h&&gr.call(t,"__wrapped__");if(p||f){var m=p?e.value():e,v=f?t.value():t;return i||(i=new or),r(m,v,n,s,i)}}return!!d&&(i||(i=new or),lr(e,t,n,s,r,i))},Ir=Yt;var wr=function e(t,n,s,r,i){return t===n||(null==t||null==n||!Ir(t)&&!Ir(n)?t!=t&&n!=n:br(t,n,s,r,e,i))},Tr=as,kr=wr;var Sr=re;var Cr=function(e){return e==e&&!Sr(e)},Br=Cr,_r=Wn;var Er=function(e,t){return function(n){return null!=n&&(n[e]===t&&(void 0!==t||e in Object(n)))}},Or=function(e,t,n,s){var r=n.length,i=r,a=!s;if(null==e)return!i;for(e=Object(e);r--;){var o=n[r];if(a&&o[2]?o[1]!==e[o[0]]:!(o[0]in e))return!1}for(;++r<i;){var u=(o=n[r])[0],c=e[u],l=o[1];if(a&&o[2]){if(void 0===c&&!(u in e))return!1}else{var h=new Tr;if(s)var d=s(c,l,u,e,t,h);if(!(void 0===d?kr(l,c,3,s,h):d))return!1}}return!0},Ar=function(e){for(var t=_r(e),n=t.length;n--;){var s=t[n],r=e[s];t[n]=[s,r,Br(r)]}return t},Rr=Er;var jr=function(e){var t=Ar(e);return 1==t.length&&t[0][2]?Rr(t[0][0],t[0][1]):function(n){return n===e||Or(n,e,t)}},Nr=se,qr=Yt;var Ur=function(e){return"symbol"==typeof e||qr(e)&&"[object Symbol]"==Nr(e)},Dr=sn,Pr=Ur,Fr=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,xr=/^\w*$/;var Mr=function(e,t){if(Dr(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!Pr(e))||(xr.test(e)||!Fr.test(e)||null!=t&&e in Object(t))},zr=Ct;var Lr=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Wr=/\\(\\)?/g,Vr=function(e){var t=zr(e,(function(e){return 500===n.size&&n.clear(),e})),n=t.cache;return t}((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(Lr,(function(e,n,s,r){t.push(s?r.replace(Wr,"$1"):n||e)})),t}));var Gr=function(e,t){for(var n=-1,s=null==e?0:e.length,r=Array(s);++n<s;)r[n]=t(e[n],n,e);return r},$r=sn,Hr=Ur,Yr=$?$.prototype:void 0,Kr=Yr?Yr.toString:void 0;var Jr=function e(t){if("string"==typeof t)return t;if($r(t))return Gr(t,e)+"";if(Hr(t))return Kr?Kr.call(t):"";var n=t+"";return"0"==n&&1/t==-1/0?"-0":n},Zr=Jr;var Qr=sn,Xr=Mr,ei=Vr,ti=function(e){return null==e?"":Zr(e)};var ni=function(e,t){return Qr(e)?e:Xr(e,t)?[e]:ei(ti(e))},si=Ur;var ri=function(e){if("string"==typeof e||si(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t},ii=ni,ai=ri;var oi=function(e,t){for(var n=0,s=(t=ii(t,e)).length;null!=e&&n<s;)e=e[ai(t[n++])];return n&&n==s?e:void 0},ui=oi;var ci=ni,li=nn,hi=sn,di=cn,pi=ln,fi=ri;var mi=function(e,t){return null!=e&&t in Object(e)},vi=function(e,t,n){for(var s=-1,r=(t=ci(t,e)).length,i=!1;++s<r;){var a=fi(t[s]);if(!(i=null!=e&&n(e,a)))break;e=e[a]}return i||++s!=r?i:!!(r=null==e?0:e.length)&&pi(r)&&di(a,r)&&(hi(e)||li(e))};var yi=wr,gi=function(e,t,n){var s=null==e?void 0:ui(e,t);return void 0===s?n:s},bi=function(e,t){return null!=e&&vi(e,t,mi)},Ii=Mr,wi=Cr,Ti=Er,ki=ri;var Si=oi;var Ci=function(e){return function(t){return null==t?void 0:t[e]}},Bi=function(e){return function(t){return Si(t,e)}},_i=Mr,Ei=ri;var Oi=jr,Ai=function(e,t){return Ii(e)&&wi(t)?Ti(ki(e),t):function(n){var s=gi(n,e);return void 0===s&&s===t?bi(n,e):yi(t,s,3)}},Ri=function(e){return e},ji=sn,Ni=function(e){return _i(e)?Ci(Ei(e)):Bi(e)};var qi=function(e){return"function"==typeof e?e:null==e?Ri:"object"==typeof e?ji(e)?Ai(e[0],e[1]):Oi(e):Ni(e)},Ui=Gt,Di=Yn,Pi=qi,Fi=sn;var xi=z(function(e,t){return function(n,s){var r=Fi(n)?Ui:Di,i=t?t():{};return r(n,e,Pi(s),i)}}((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]})));var Mi=function(e,t,n,s){for(var r=e.length,i=n+(s?1:-1);s?i--:++i<r;)if(t(e[i],i,e))return i;return-1},zi=function(e){return e!=e},Li=function(e,t,n){for(var s=n-1,r=e.length;++s<r;)if(e[s]===t)return s;return-1};var Wi=function(e,t,n){return t==t?Li(e,t,n):Mi(e,zi,n)};var Vi=function(e,t){return!!(null==e?0:e.length)&&Wi(e,t,0)>-1};var Gi=function(e,t,n){for(var s=-1,r=null==e?0:e.length;++s<r;)if(n(t,e[s]))return!0;return!1};var $i=Ls,Hi=function(){},Yi=$i&&1/gs(new $i([,-0]))[1]==1/0?function(e){return new $i(e)}:Hi,Ki=hs,Ji=Vi,Zi=Gi,Qi=ds,Xi=Yi,ea=gs;var ta=function(e,t,n){var s=-1,r=Ji,i=e.length,a=!0,o=[],u=o;if(n)a=!1,r=Zi;else if(i>=200){var c=t?null:Xi(e);if(c)return ea(c);a=!1,r=Qi,u=new Ki}else u=t?[]:o;e:for(;++s<i;){var l=e[s],h=t?t(l):l;if(l=n||0!==l?l:0,a&&h==h){for(var d=u.length;d--;)if(u[d]===h)continue e;t&&u.push(h),o.push(l)}else r(u,h,n)||(u!==o&&u.push(h),o.push(l))}return o},na=qi,sa=ta;var ra=z((function(e,t){return e&&e.length?sa(e,na(t)):[]}));const ia={Person:"red",Car:"green",Animal:"blue",LicensePlate:"cyan",Fire:"deepOrange",Smoke:"deepPurple"},aa={red:["#f44336","#ff1744"],green:["#4caf50","#00e676"],blue:["#2196f3","#2979ff"],purple:["#9c27b0","#d500f9"],teal:["#009688","#1de9b6"],amber:["#ff8f00","#ffc400"],pink:["#e91e63","#f50057"],cyan:["#00bcd4","#00e5ff"],lightGreen:["#9ccc65","#76ff03"],deepOrange:["#ff5722","#ff3d00"],deepPurple:["#7e57c2","#651fff"],lime:["#cddc39","#c6ff00"],indigo:["#3f51b5","#3d5afe"],lightBlue:["#03a9f4","#00b0ff"]};class oa extends Ot{schemaDescription=[];constructor(){super(),t(this,{schemaDescription:n.ref,foundObjectTypes:r,foundObjectTypesForSelect:r,colorsByFoundObjectType:r})}get foundObjectTypes(){if(!this.schemaDescription.length)return[];const e=this.schemaDescription.filter((e=>"filter"===e.parameterType&&"Type"===e.fieldName&&"Analytic"===e.eventType))[0];return e?e.valueSet.includes("LicensePlate")?e.valueSet.split(", "):e.valueSet.split(", ").concat(["LicensePlate"]):[]}get foundObjectTypesForSelect(){const e=Object.entries(ia).filter((([e])=>this.foundObjectTypes.includes(e))).map((([,e])=>e)),t=Object.keys(aa).filter((t=>!e.includes(t)));let n=0;return this.foundObjectTypes.map((e=>{const s=e in ia?ia[e]:t[n++],r=aa[s];return{value:e,label:e.toLowerCase(),color:r?.[0],highlightColor:r?.[1],type:"detectedObject"}}))}get colorsByFoundObjectType(){const e=new Map;for(const{value:t,highlightColor:n}of this.foundObjectTypesForSelect)e.set(t,n);return e}fetchAnalyticEventSchema=()=>{this.api.cameras.GetSensorDataSchema("Analytic").subscribe({next:e=>{e.success?o((()=>{this.schemaDescription=e.resultItems})):console.error(e)},error:console.error})};afterInit(){this.fetchAnalyticEventSchema()}dispose(){super.dispose(),this.schemaDescription=[]}}const ua=5e-4;class ca extends Ot{camerasStore;data;eventsByCameraId;eventsByStart;eventsByEnd;eventsByType;eventsByFoundObjects;eventsByColor;pendingRequests;pendingRequestsByEnd;pendingRequestsByStart;pendingRequestsByCameraId;knownIntervals=P();knownIntervalsByCameraId;knownIntervalsByStart;knownIntervalsByEnd;eventsById=new Map;updates=0;updatesByCameraId=new Map;recentAdditions=[];constructor(e){super(),this.camerasStore=e,t(this,{updates:n,recentAdditions:n.ref,processNewEvents:s,update:s,add:s,dispose:s}),this.data=P(),this.eventsByCameraId=this.data.dimension((e=>e.cameraId)),this.eventsByStart=this.data.dimension((e=>+e.startTime)),this.eventsByEnd=this.data.dimension((e=>+e.endTime)),this.eventsByType=this.data.dimension((e=>e.type)),this.eventsByFoundObjects=this.data.dimension((e=>e.detectedObjects.map((e=>e.Type))),!0),this.eventsByColor=this.data.dimension((e=>e.detectedObjects.reduce(((e,t)=>e.concat(..."Colors"in t?t.Colors?.map((e=>e.Color))??[]:[])),[])),!0),this.pendingRequests=P(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.startTime)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.endTime)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId)),this.knownIntervalsByCameraId=this.knownIntervals.dimension((e=>e.cameraId)),this.knownIntervalsByStart=this.knownIntervals.dimension((e=>+e.from)),this.knownIntervalsByEnd=this.knownIntervals.dimension((e=>+e.to))}populateEvents(e,t,n){const s=null===n?new Date(Date.now()-6e5):n;-1===e?this.knownIntervalsByCameraId.filter(-1):this.knownIntervalsByCameraId.filter((t=>-1===t||t===e)),this.knownIntervalsByStart.filter([Number.NEGATIVE_INFINITY,s]),this.knownIntervalsByEnd.filter([t,Number.POSITIVE_INFINITY]);const r=this.knownIntervalsByStart.bottom(Number.POSITIVE_INFINITY),i=[];if(this.knownIntervalsByCameraId.filterAll(),this.knownIntervalsByStart.filterAll(),this.knownIntervalsByEnd.filterAll(),r.length){const a=_t(r.map((e=>[e.from,e.to])));a[0][0]>t&&i.push([t,a[0][0]]);for(let e=0;e<a.length-1;e++)i.push([a[e][1],a[e+1][0]]);a[_t.length-1][1]<s&&i.push([a[_t.length-1][1],s]),i.length&&(t=i[0][0],+i[i.length-1][1]<=+s&&(n=i[i.length-1][1]),this.knownIntervals.add([{cameraId:e,from:t,to:s}]))}else this.knownIntervals.add([{cameraId:e,from:t,to:s}]);this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(s);const a=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),a)return;if(r.length&&!i.length)return;const o=s=>this.api.cameras.GetSensorEventsPage({sensorIds:[e],sensorType:"camera",sensorEventTypes:[],startTime:t,endTime:n,rowsLimit:100,isDescending:!0,pageToken:s},null,[]).pipe(d((e=>e.success?p(e):(console.error(e.error),f((()=>e.error)))))),u=o().pipe(g((e=>e.pageInfo.haveMore?o(e.pageInfo.nextPageToken):b)),h((e=>e.resultItems.map((e=>new zt(e))))),C());this.pendingRequests.add([{cameraId:e,startTime:t,endTime:n||new Date,request:u}]),u.subscribe({next:this.add,error:e=>{console.error(e),this.pendingRequests.remove((e=>e.request===u))},complete:()=>{this.pendingRequests.remove((e=>e.request===u))}})}update=e=>{for(const t of e){const e=this.eventsById.get(t.id);if(!e)return;e.update(t.raw),this.data.remove((e=>e.id===t.id)),this.data.add([e])}};add=e=>{const t=e.filter((e=>!this.eventsById.has(e.id)));for(const e of t)this.eventsById.set(e.id,e);if(this.data.add(t),t.length){const e=new Set(t.map((e=>e.cameraId)));for(const t of e)this.updatesByCameraId.set(t,(this.updatesByCameraId.get(t)??0)+1);this.updates++}};getEvents({cameraIds:e,from:t,to:n,detectedObjectTypes:s,eventTypes:r,colors:i,probability:a}){this.eventsByStart.filter([+t,n?+n+ua:Number.POSITIVE_INFINITY]),e?.length&&this.eventsByCameraId.filter((t=>e.includes(t))),r?.length&&this.eventsByType.filter((e=>r.includes(e))),s?.length&&this.eventsByFoundObjects.filter((e=>s.includes(e))),i?.size&&this.eventsByColor.filter((e=>i.has(e)));let o=this.eventsByStart.top(Number.POSITIVE_INFINITY);return r?.length&&this.eventsByType.filterAll(),e?.length&&this.eventsByCameraId.filterAll(),s?.length&&this.eventsByFoundObjects.filterAll(),i?.size&&this.eventsByColor.filterAll(),this.eventsByStart.filterAll(),void 0!==a&&s?.length&&(o=o.filter((e=>e.detectedObjects.some((e=>e.Probability>=a&&s.includes(e.Type)))))),o}getOverlappedEvents({cameraId:e,from:t,to:n}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([Number.NEGATIVE_INFINITY,+n+ua]),this.eventsByEnd.filter([+t,Number.POSITIVE_INFINITY]);const s=this.eventsByStart.bottom(Number.POSITIVE_INFINITY);return this.eventsByCameraId.filterAll(),this.eventsByStart.filterAll(),this.eventsByEnd.filterAll(),s}getLastNonAnalyticEventBefore({cameraId:e,date:t}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([Number.NEGATIVE_INFINITY,+t]),this.eventsByType.filter((e=>"Analytic"!==e));const n=this.eventsByStart.top(1);return this.eventsByType.filterAll(),this.eventsByStart.filterAll(),this.eventsByCameraId.filterAll(),n[0]}getLastObjectBefore({cameraId:e,date:t,objectFilters:n}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([Number.NEGATIVE_INFINITY,+t]),this.eventsByType.filter((e=>"Analytic"===e));const{cars:s,people:r,misc:i}=n;r&&s&&i||this.eventsByFoundObjects.filter((e=>i?r||s?!(!r||!s)||(r?"Car"!==e:"Person"!==e):"Person"!==e&&"Car"!==e:r&&s?"Person"===e||"Car"===e:r?"Person"===e:"Car"===e));const a=this.eventsByStart.top(1);return this.eventsByFoundObjects.filterAll(),this.eventsByType.filterAll(),this.eventsByStart.filterAll(),this.eventsByCameraId.filterAll(),a[0]}getRunningEvent(e){this.eventsByCameraId.filter(e);const[t]=this.eventsByStart.top(1);if(this.eventsByCameraId.filterAll(),t?.isLive)return t}getFirstNonAnalyticEventAfter({cameraId:e,date:t}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([+t+ua,Number.POSITIVE_INFINITY]),this.eventsByType.filter((e=>"Analytic"!==e));const n=this.eventsByEnd.bottom(1);return this.eventsByType.filterAll(),this.eventsByCameraId.filterAll(),this.eventsByStart.filterAll(),n[0]}getFirstObjectAfter({cameraId:e,date:t,objectFilters:n}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([+t+ua,Number.POSITIVE_INFINITY]),this.eventsByType.filter((e=>"Analytic"===e));const{cars:s,people:r,misc:i}=n;r&&s&&i||this.eventsByFoundObjects.filter((e=>i?r||s?!(!r||!s)||(r?"Car"!==e:"Person"!==e):"Person"!==e&&"Car"!==e:r&&s?"Person"===e||"Car"===e:r?"Person"===e:"Car"===e));const a=this.eventsByStart.bottom(1);return this.eventsByFoundObjects.filterAll(),this.eventsByType.filterAll(),this.eventsByStart.filterAll(),this.eventsByCameraId.filterAll(),a[0]}afterInit(){this.api.events.pipe(l((({hub:e,event:t})=>"cameras"===e&&"OnCameraMotionEvent"===t))).subscribe(this.processNewEvents)}processNewEvents=({data:e})=>{const t=ra(e.filter((e=>"PeopleCounter"!==e.eventType&&this.camerasStore.camerasById.has(e.sensorId))).reverse(),"id").map((e=>new zt(e))),[n,s]=xi(t,(e=>this.eventsById.has(e.id)));this.update(n),this.add(s),s.length&&(this.recentAdditions=s.map((e=>e.id)))};dispose(){super.dispose(),this.data.remove(Et),this.updates++}}const la=5e-4;class ha extends Ot{thumbnails;thumbnailsByCameraId;thumbnailsByDate;pendingRequests;pendingRequestsByEnd;pendingRequestsByStart;pendingRequestsByCameraId;pendingRequestsByCount;constructor(){super(),this.thumbnails=P(),this.thumbnailsByCameraId=this.thumbnails.dimension((e=>e.cameraId)),this.thumbnailsByDate=this.thumbnails.dimension((e=>+e.timestamp)),this.pendingRequests=P(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.from)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.to)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId)),this.pendingRequestsByCount=this.pendingRequests.dimension((e=>e.count))}fetchThumbnails=(e,t,n,s)=>{this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(n),this.pendingRequestsByCount.filter(s);const r=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),this.pendingRequestsByCount.filterAll(),r)return r.request;const i=this.api.thumbnails.GetThumbnailsInfo({cameraId:e,from:t,to:n,count:s}).pipe(d((e=>e.success?p(e.resultItems):f((()=>e.error)))),h((t=>t.filter((e=>e.url)).map(this.toThumbnail(e)))),v());return this.pendingRequests.add([{cameraId:e,from:t,to:n,count:s,request:i}]),i.subscribe((e=>{this.thumbnails.add(e),this.pendingRequests.remove((e=>e.request===i))})),i};getIntervalState(e,t,n){const s=this.getThumbnail({cameraId:e,from:t,to:n});if(s)return{state:"fulfilled",data:s};this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter([Number.NEGATIVE_INFINITY,+n+la]),this.pendingRequestsByEnd.filter([t,Number.POSITIVE_INFINITY]);let r=this.pendingRequests.allFiltered();return this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),r=r.filter((e=>1===e.count?+e.from==+t&&+e.to==+n:Math.abs((+e.to-+e.from)/e.count-(+n-+t))<=1)),r.length?{state:"pending",request:r[0].request}:null}fetchThumbnail(e,t,n){const s=this.getIntervalState(e,t,n);if(null!==s){if("fulfilled"===s.state)return p(s.data);if("pending"===s.state)return s.request.pipe(h((()=>this.getThumbnail({cameraId:e,from:t,to:n}))))}const r=this.api.thumbnails.GetThumbnailInfo({cameraId:e,from:t,to:n}).pipe(d((e=>e.success?p(e.resultItems):f((()=>e.error)))),h((t=>t.filter((e=>e.url)).map(this.toThumbnail(e)))),v());return r.subscribe((e=>{this.thumbnails.add(e),this.pendingRequests.remove((e=>e.request===r))})),this.pendingRequests.add([{cameraId:e,from:t,to:n,count:1,request:r}]),r.pipe(h((()=>this.getThumbnail({cameraId:e,from:t,to:n}))))}getThumbnail({cameraId:e,from:t,to:n}){this.thumbnailsByCameraId.filter(e),this.thumbnailsByDate.filter([+t,+n+(+t==+n?la:0)]);const s=this.thumbnails.allFiltered()[0];return this.thumbnailsByDate.filterAll(),this.thumbnailsByCameraId.filterAll(),s}getThumbnails({cameraId:e,from:t,to:n}){this.thumbnailsByCameraId.filter(e),this.thumbnailsByDate.filter([+t,+n+la]);const s=this.thumbnails.allFiltered();return this.thumbnailsByDate.filterAll(),this.thumbnailsByCameraId.filterAll(),s}toThumbnail=e=>({realtimestamp:t,url:n})=>({cameraId:e,url:n,timestamp:new Date(t)})}const da={archives:{PopulateArchive:null,GetArchives:null,GetClips:null,UpdateClip:null,DeleteClip:null,SaveClip:null,SaveTimelaps:null,SaveArchive:null,DeleteArchive:null,ShareClip:null,GetSharedClips:null,UpdateSharedClip:null,DeleteSharedClip:null},cameras:{GetCameras:null,UpdateCamera:null,GetSensorDataSchema:null,GetSensorEvents:null,GetSensorEventsPage:null,GetLicensePlateLookUp:null,GetSensorEventsLprPage:null,GetPeopleCountingData:null,AddUserSensorEvent:null,AcknowledgeSensorEvent:null,MoveCamera:null,MoveCameraContinuousStart:null,MoveCameraContinuousStop:null,GoHomePtzCamera:null,SetHomePtzCamera:null},camgroups:{GetCamgroups:null,DeleteCamgroup:null,AddCamgroup:null,UpdateCamgroup:null},sound:{GetPushSoundServiceUrl:null},thumbnails:{GetThumbnailsInfo:null,GetThumbnailInfo:null,GetHeatMapsInfo:null},users:{GetUser:null,UserUpdateProfile:null}};var pa,fa,ma={cameras:[{name:"OnCameraMotionEvent",explicit:!0},{name:"OnCameraAdded"},{name:"OnCameraUpdated"},{name:"OnSystemCameraUpdated"},{name:"OnCameraDeleted"}],users:[{name:"OnUserUpdateProfile"}],camgroups:[{name:"OnAdd"},{name:"OnUpdate"},{name:"OnDelete"}],archives:[{name:"OnTimelapsAdded"},{name:"OnClipAdded"},{name:"OnClipUpdated"},{name:"OnClipDeleted"},{name:"OnArchiveAdded"},{name:"OnArchiveUpdated"},{name:"OnArchiveDeleted"},{name:"OnArchiveRecordCreated"}]};!function(e){e[e.CONNECTING=0]="CONNECTING",e[e.CONNECTED=1]="CONNECTED",e[e.RECONNECTING=2]="RECONNECTING",e[e.DISCONNECTED=3]="DISCONNECTED"}(pa||(pa={})),function(e){e[e.INFO=0]="INFO",e[e.WARN=1]="WARN",e[e.ERROR=2]="ERROR"}(fa||(fa={}));class va{static create(e,t,n){return new va(null!==e?e:da,t,n)}connectionShutdown$=new w;connection$=new B(null);events=new w;logLevel=fa.ERROR;authStore;createConnection;apiConfig;constructor(e,t,n){this.apiConfig=e,this.init(),this.createConnection=n,this.authStore=t,i((()=>t.token),(e=>{if(!e)return void this.shutdownConnection();if(e.invalid)return;if(!e.accessToken)return;const t=this.connection$.getValue();t&&t.state!==pa.DISCONNECTED?t.qs.access_token=e.accessToken:this.connect(e)})),this.connection$.pipe(_((e=>null!==e||!t.isAuthenticated||t.token&&t.token.invalid?b:(this.log(fa.WARN,"disconnected by some reason"),E(5e3)))),l((()=>t.isAuthenticated&&!!t.token&&!t.token.invalid))).subscribe((()=>{this.connect(t.token),this.log(fa.WARN,"attempting to reconnect")})),this.connection$.pipe(l(Boolean),O(100)).subscribe(this.subscribeToEvents)}log=(e,...t)=>{if(e<this.logLevel)return;console[["log","warn","error"][e]](...t)};connect(e){if(this.connection$.getValue()&&this.connection$.getValue().state===pa.CONNECTED)return;const{accessToken:t}=e,n=this.createConnection(t);Object.keys(this.apiConfig).forEach((e=>n.createHubProxy(e))),Object.entries(ma).forEach((([e,t])=>{t&&n.proxies[e]&&t.forEach((({name:t})=>{n.proxies[e].on(t,(n=>this.events.next({hub:e,event:t,data:n})))}))})),n.start().done((()=>{this.log(fa.INFO,"connected"),this.connection$.next(n)})).fail((e=>{!e.source||401!==e.source?.status&&403!==e.source?.status&&409!==e.source?.status||this.authStore.invalidateToken(),this.log(fa.ERROR,"connection failed",e)})),n.error((e=>{if(e.source&&(401===e.source.status||403===e.source.status||409===e.source.status))return this.log(fa.WARN,"authentication error, invalidating token"),this.authStore.invalidateToken();this.log(fa.ERROR,"connection error",e)})),n.disconnected((()=>{this.connection$.getValue()?this.log(fa.WARN,"disconnected",this.connection$.getValue().lastError):this.log(fa.WARN,"disconnected. this connection is already null"),this.connection$.next(null)})),n.reconnecting((()=>this.log(fa.WARN,"reconnecting"))),n.reconnected((()=>{this.connection$.getValue()===n&&(this.log(fa.WARN,"reconnected"),this.connection$.next(n))}))}shutdownConnection(){const e=this.connection$.getValue();e&&e.stop(),this.connectionShutdown$.next(null)}init(){for(const[e,t]of Object.entries(this.apiConfig)){this[e]={};for(const n of Object.keys(t))this[e][n]=this.createHubMethod(e,n)}}createHubMethod=(e,t)=>{const n=(...s)=>this.connection$.pipe(l(Boolean),l((e=>e.state===pa.CONNECTED)),A(1)).pipe(d((n=>new Promise(((r,i)=>{n.proxies[e].invoke(t,...s).done((e=>r(e))).fail((e=>i(e)))})))),R((e=>e instanceof Error&&e.message&&("Connection started reconnecting before invocation result was received."===e.message||"Connection was disconnected before invocation result was received."===e.message)?(this.log(fa.WARN,e.message),n(...s)):e instanceof Error&&e.message&&e.message.startsWith("Caller is not authorized to invoke the ")?(this.log(fa.WARN,e.message),this.connection$.getValue().stop(),this.authStore.invalidateToken(),n(...s)):f((()=>e)))),S(this.connectionShutdown$));return n};subscribeToEvents=e=>{Object.entries(ma).forEach((([t,n])=>{n&&e.proxies[t]&&e.state===pa.CONNECTED&&n.filter((({explicit:e})=>e)).forEach((({name:n})=>{e.proxies[t].invoke("SubscribeToEvent",n)}))}))}}class ya{accessToken;accessTokenExpires;accessTokenIssued;clientId;expiresIn;refreshToken;refreshTokenExpires;refreshTokenIssued;tokenType;userName;invalid;widgetId;widgetToken;json;constructor(e){this.json=e,this.accessToken=e.access_token||e.accessToken,this.accessTokenExpires=new Date(e.access_token_expires||e.accessTokenExpires||(this.accessToken?1e3*JSON.parse(atob(this.accessToken.split(".")[1])).exp:0)),this.accessTokenIssued=new Date(e.access_token_issued||e.accessTokenIssued),this.clientId=e.client_id||e.clientId,this.expiresIn=e.expires_in||e.expiresIn,this.refreshToken=e.refresh_token||e.refreshToken,this.refreshTokenExpires=new Date(e.refresh_token_expires||e.refreshTokenExpires),this.refreshTokenIssued=new Date(e.refresh_token_issued||e.refreshTokenIssued),this.tokenType=e.token_type||e.tokenType,this.userName=e.userName,this.widgetId=e.widgetId,this.widgetToken=e.widgetToken,this.invalid=!1}}class ga{token=null;isAuthenticating=!1;storage;tokenServiceUrl;tokenStorageKey;deviceInfo;clientId;pendingUpdateTokenRequest=null;get isAuthenticated(){return Boolean(this.token&&!this.isAuthenticating)}constructor({tokenServiceUrl:e,storage:i,tokenStorageKey:a,deviceInfo:c,clientId:h}){t(this,{token:n.ref,isAuthenticating:n,isAuthenticated:r,signOut:s,invalidateToken:s}),this.isAuthenticating=!0,this.storage=i,this.tokenServiceUrl=e,this.tokenStorageKey=a,this.deviceInfo=c,this.clientId=h;const m=function(e,t=!1){const n=r(e);return new j((e=>{const s=u(n,(({newValue:t})=>e.next(t)),t);return()=>s()}))}((()=>this.token)),v=m.pipe(_((e=>{if(null===e)return b;const t=p(e).pipe(d((e=>e.widgetId?this.fetchWidgetToken(e):this.updateToken(e.refreshToken))),y({delay:(e,t)=>e.status&&![500,502,503,504].includes(e.status)?f((()=>e)):E(2**Math.min(t+1,6)*1e3)}));if(!e.invalid){const n=Math.max(.75*(+e.accessTokenExpires-Date.now()),0);return E(n).pipe(d((()=>t)))}return t})),R((e=>(console.error(e),o((()=>this.token=null)),v))));v.subscribe((e=>{o((()=>this.token=e))})),m.pipe(N(null),q(),l((([e,t])=>!!(t||!t&&e))),U((([,e])=>this.storeToken(e)))).subscribe(),this.getInitialToken().then((e=>{o((()=>{this.token=e,this.isAuthenticating=!1}))}))}signOut=()=>{this.isAuthenticating||o((()=>this.token=null))};signIn=e=>{if(this.isAuthenticating)return;o((()=>this.isAuthenticating=!0)),!1===e.agreedWithTerms&&(e={...e,agreedWithTerms:void 0});return this.fetchToken(e).then((e=>(o((()=>{this.token=e,this.isAuthenticating=!1})),e))).catch((e=>{throw o((()=>{this.isAuthenticating=!1})),e}))};signInWithToken=e=>{this.isAuthenticating?console.warn("Attempt to sign in with token while authenticating"):o((()=>{this.token=new ya(e)}))};invalidateToken=()=>{this.token&&o((()=>{this.token={...this.token,invalid:!0}}))};async getTokenFromStorage(){const e=await this.storage.getItem(this.tokenStorageKey);return e?new ya(JSON.parse(e)):null}async storeToken(e){return!e||e.invalid?this.storage.removeItem(this.tokenStorageKey):this.storage.setItem(this.tokenStorageKey,JSON.stringify(e.json))}async getInitialToken(){const e=await this.getTokenFromStorage();return e||null}async fetchToken(e){const t={clientId:this.clientId,client_id:this.clientId,device:this.deviceInfo,...e},n=new Headers;n.append("Content-Type","application/x-www-form-urlencoded"),n.append("accept","application/json");const s=await fetch(this.tokenServiceUrl,{method:"POST",headers:n,body:new URLSearchParams(t)});try{const e=await s.json();return 200!==s.status?Promise.reject({status:s.status,data:e}):new ya(e)}catch(e){return Promise.reject(s)}}async updateToken(e){try{return this.pendingUpdateTokenRequest&&this.pendingUpdateTokenRequest.refreshToken===e||(this.pendingUpdateTokenRequest={refreshToken:e,request:this.fetchToken({refreshToken:e,refresh_token:e})}),await this.pendingUpdateTokenRequest.request}finally{this.pendingUpdateTokenRequest?.refreshToken===e&&(this.pendingUpdateTokenRequest=null)}}async fetchWidgetToken(e){const{widgetId:t,widgetToken:n}=e;if(!t||!n)throw new Error("token must contain widgetId and widgetToken");const s={widgetId:t,widgetToken:n},r=new Headers;r.append("Content-Type","application/json"),r.append("accept","application/json");const i=await fetch(this.tokenServiceUrl,{method:"POST",headers:r,body:JSON.stringify(s)});try{const e=await i.json();return 200!==i.status?Promise.reject({status:i.status,data:e}):new ya({widgetId:t,widgetToken:n,...e})}catch(e){return Promise.reject(i)}}}class ba{notifier;constructor(e){this.notifier=e}error(e){this.notifier.error(e)}success(e,t){this.notifier.success(e,t)}warn(e){this.notifier.warn(e)}}const Ia="default",wa=new Map;class Ta{name;initialized=!1;cameras=new Vt;archives=new Wt(this.cameras);events=new ca(this.cameras);eventSchema=new oa;thumbnails=new ha;account=new Dt;notification=new ba({success:console.log,warn:console.warn,error:console.error});auth;api;disposables=[];tokenUpdateReactions=new Set;constructor(e){this.name=e,t(this,{initialized:n}),this.disposables.push(a((()=>!!this.account.user),(()=>{this.cameras.load()})))}init({clientId:t="WebApp",token:n,tokenStorage:s=new Bt,tokenStorageKey:r,apiUrl:i="https://services.3deye.me/reactiveapi",tokenServiceUrl:a="https://admin.3deye.me/webapi/v3/auth/token"},u=Ia){return r||(r=`@3deye-toolkit/${u}/token`),wa.has(u)?(console.warn("Can`t init two apps with the same name"),wa.get(u)):this.auth&&u===this.name?(console.warn("Can`t init already inited app"),this):this.auth||this.name===Ia&&u!==Ia?new Ta(u).init({token:n,tokenStorage:s,tokenStorageKey:r,apiUrl:i,tokenServiceUrl:a},u):(t=n&&"clientId"in n?n.clientId:t,n&&s.setItem(r,JSON.stringify(n)),this.auth=new ga({tokenServiceUrl:a,tokenStorageKey:r,storage:s,clientId:t,deviceInfo:null}),this.api=va.create(da,this.auth,(t=>e(i,{qs:{access_token:t}}))),this.cameras.initWith(this.api),this.archives.initWith(this.api),this.events.initWith(this.api),this.eventSchema.initWith(this.api),this.thumbnails.initWith(this.api),this.account.initWith(this.api),this.account.setAuthStore(this.auth),o((()=>{this.initialized=!0})),wa.set(u,this),this)}dispose=()=>{for(const e of this.disposables)e instanceof c?e.closed||e.unsubscribe():e();for(const e of this.tokenUpdateReactions)e();this.tokenUpdateReactions.clear(),this.auth.signOut(),this.cameras.dispose(),this.events.dispose(),this.thumbnails.dispose(),this.eventSchema.dispose(),this.account.dispose(),wa.delete(this.name)};onTokenUpdate=e=>{if(!this.auth)throw new Error("app has to be inited first");const t=i((()=>this.auth.token),(t=>e(t?.json||null)));return this.tokenUpdateReactions.add(t),()=>{t(),this.tokenUpdateReactions.delete(t)}}}var ka=new Ta(Ia);var Sa=x.createContext(null);export{Sa as AppContext,ka as app};
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.37.0"
8
+ "packageVersion": "7.47.4"
9
9
  }
10
10
  ]
11
11
  }
package/package.json CHANGED
@@ -1,23 +1,18 @@
1
1
  {
2
2
  "name": "@3deye-toolkit/core",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "module": "dist/core.js",
5
5
  "types": "dist/core.d.ts",
6
6
  "files": [
7
7
  "dist"
8
8
  ],
9
9
  "dependencies": {
10
- "@react-spring/web": "^9.7.3",
11
- "backoff-rxjs": "^7.0.0",
12
10
  "crossfilter2": "^1.5.4",
13
- "http-status-codes": "^2.2.0",
14
- "i18next": "23.5.1",
15
11
  "jqueryless-signalr": "1.0.0",
16
12
  "lodash": "4.17.21",
17
13
  "mobx": "^6.10.2",
18
14
  "rxjs": "^7.8.1",
19
15
  "string-natural-compare": "^3.0.1",
20
- "transformation-matrix": "^2.15.0",
21
16
  "zod": "^3.22.2"
22
17
  },
23
18
  "peerDependencies": {