@uniformdev/context 17.7.1-alpha.34 → 18.0.0

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.
@@ -1,16 +1,16 @@
1
1
  import * as mitt from 'mitt';
2
- import { c as components, e as external } from './v2-manifest.swagger-200ca5ee.js';
2
+ import { c as components, e as external } from './v2-manifest.swagger-74a3dcac.js';
3
3
 
4
- declare type Quirks = {
4
+ type Quirks = {
5
5
  [key: string]: string;
6
6
  };
7
- declare type Tests = {
7
+ type Tests = {
8
8
  [key: string]: string;
9
9
  };
10
- declare type ScoreVector = {
10
+ type ScoreVector = {
11
11
  [key: string]: number;
12
12
  };
13
- declare type EnrichmentData = {
13
+ type EnrichmentData = {
14
14
  /** Enrichment category name */
15
15
  cat: string;
16
16
  /** Enrichment key value */
@@ -19,11 +19,11 @@ declare type EnrichmentData = {
19
19
  str: number;
20
20
  };
21
21
  /** An event that has occurred (i.e. an analytics track) which may trigger an Event signal */
22
- declare type EventData = {
22
+ type EventData = {
23
23
  /** The event name that has been fired */
24
24
  event: string;
25
25
  };
26
- declare type VisitorData = {
26
+ type VisitorData = {
27
27
  /**
28
28
  * Quirk key-value data.
29
29
  * NOTE: Context.quirks is more commonly correct if you need to read quirks data.
@@ -61,37 +61,37 @@ declare const emptyVisitorData: () => VisitorData;
61
61
  /**
62
62
  * Expresses a 'patch' to the Uniform Context state
63
63
  */
64
- declare type ContextState = {
64
+ type ContextState = {
65
65
  cookies: Record<string, string>;
66
66
  url?: URL;
67
67
  quirks: Quirks;
68
68
  enrichments: EnrichmentData[];
69
69
  events: EventData[];
70
70
  };
71
- declare type ContextStateUpdate = {
71
+ type ContextStateUpdate = {
72
72
  state: Partial<ContextState>;
73
73
  previousState: Partial<ContextState>;
74
74
  visitor: VisitorData;
75
75
  scores: ScoreVector;
76
76
  };
77
77
 
78
- declare type StorageCommand<TID extends string = string, TData = unknown> = {
78
+ type StorageCommand<TID extends string = string, TData = unknown> = {
79
79
  type: TID;
80
80
  data: TData;
81
81
  };
82
82
  /** Commands that can be issued to alter the storage of Uniform Context data */
83
- declare type StorageCommands = ModifyScoreCommand | ModifySessionScoreCommand | SetConsentCommand | SetQuirkCommand | SetTestCommand | IdentifyCommand | SetControlGroupCommand;
83
+ type StorageCommands = ModifyScoreCommand | ModifySessionScoreCommand | SetConsentCommand | SetQuirkCommand | SetTestCommand | IdentifyCommand | SetControlGroupCommand;
84
84
  /**
85
85
  * Changes the visitor's permanent score for a given dimension
86
86
  */
87
- declare type ModifyScoreCommand = StorageCommand<'modscore', {
87
+ type ModifyScoreCommand = StorageCommand<'modscore', {
88
88
  dimension: string;
89
89
  delta: number;
90
90
  }>;
91
91
  /**
92
92
  * Changes the visitor's session (time-based) score for a given dimension
93
93
  */
94
- declare type ModifySessionScoreCommand = StorageCommand<'modscoreS', {
94
+ type ModifySessionScoreCommand = StorageCommand<'modscoreS', {
95
95
  dimension: string;
96
96
  delta: number;
97
97
  }>;
@@ -100,14 +100,14 @@ declare type ModifySessionScoreCommand = StorageCommand<'modscoreS', {
100
100
  * Setting consent to false will trigger deletion of any stored data for the visitor.
101
101
  * Scores are still collected in-memory when consent is false; just not persisted.
102
102
  */
103
- declare type SetConsentCommand = StorageCommand<'consent', boolean>;
103
+ type SetConsentCommand = StorageCommand<'consent', boolean>;
104
104
  /** Sets a permanent quirk key and value for the visitor */
105
- declare type SetQuirkCommand = StorageCommand<'setquirk', {
105
+ type SetQuirkCommand = StorageCommand<'setquirk', {
106
106
  key: string;
107
107
  value: string;
108
108
  }>;
109
109
  /** Sets a specific variant as being this visitor's variant on an A/B test */
110
- declare type SetTestCommand = StorageCommand<'settest', {
110
+ type SetTestCommand = StorageCommand<'settest', {
111
111
  test: string;
112
112
  variant: string;
113
113
  }>;
@@ -116,7 +116,7 @@ declare type SetTestCommand = StorageCommand<'settest', {
116
116
  * NOTE: this only has an effect when using an external cross-device transition storage system.
117
117
  * NOTE: you cannot read the identified visitor ID back from the storage system once it is set.
118
118
  */
119
- declare type IdentifyCommand = StorageCommand<'identify', {
119
+ type IdentifyCommand = StorageCommand<'identify', {
120
120
  identity: string;
121
121
  }>;
122
122
  /**
@@ -125,12 +125,12 @@ declare type IdentifyCommand = StorageCommand<'identify', {
125
125
  * In most cases this should not be sent as the membership is computed automatically for visitors;
126
126
  * this command is intended mostly for diagnostics and testing purposes.
127
127
  */
128
- declare type SetControlGroupCommand = StorageCommand<'setcontrol', boolean>;
128
+ type SetControlGroupCommand = StorageCommand<'setcontrol', boolean>;
129
129
 
130
- declare type TransitionDataStoreOptions = {
130
+ type TransitionDataStoreOptions = {
131
131
  initialData?: Partial<VisitorData>;
132
132
  };
133
- declare type ServerToClientTransitionState = Pick<Partial<VisitorData>, 'quirks' | 'tests'> & {
133
+ type ServerToClientTransitionState = Pick<Partial<VisitorData>, 'quirks' | 'tests'> & {
134
134
  /**
135
135
  * Server Score Vector - the resultant scores _on the server side_ after the server/edge render completes
136
136
  * Note that the client side does not trust these scores; they are only used until it's done with initial
@@ -139,7 +139,7 @@ declare type ServerToClientTransitionState = Pick<Partial<VisitorData>, 'quirks'
139
139
  ssv?: ScoreVector;
140
140
  };
141
141
  declare const SERVER_STATE_ID = "__UNIFORM_DATA__";
142
- declare type TransitionDataStoreEvents = {
142
+ type TransitionDataStoreEvents = {
143
143
  /**
144
144
  * Fired when the data is updated asynchronously
145
145
  * (i.e. a promise resolves with new data from a backend)
@@ -203,7 +203,7 @@ declare abstract class TransitionDataStore {
203
203
  getClientTransitionState(): ServerToClientTransitionState | undefined;
204
204
  }
205
205
 
206
- declare type DecayOptions = {
206
+ type DecayOptions = {
207
207
  now: number;
208
208
  lastUpd: number | undefined;
209
209
  scores: ScoreVector;
@@ -217,9 +217,9 @@ declare type DecayOptions = {
217
217
  *
218
218
  * @returns true if any decay was applied, false otherwise
219
219
  */
220
- declare type DecayFunction = (options: DecayOptions) => boolean;
220
+ type DecayFunction = (options: DecayOptions) => boolean;
221
221
 
222
- declare type VisitorDataStoreOptions = {
222
+ type VisitorDataStoreOptions = {
223
223
  /** Transition storage used to transfer server or edge side execution state to the client. Unused for client side only. */
224
224
  transitionStore?: TransitionDataStore;
225
225
  /** Duration of a 'visit' measured by this number of milliseconds without performing any updates */
@@ -246,7 +246,7 @@ declare type VisitorDataStoreOptions = {
246
246
  /** Called when a log message is emitted from the data store */
247
247
  onLogMessage?: (message: LogMessage) => void;
248
248
  };
249
- declare type VisitorDataStoreEvents = {
249
+ type VisitorDataStoreEvents = {
250
250
  /**
251
251
  * Fired when the stored data is updated.
252
252
  * This is fired for any update, whether from integrated or transition storage.
@@ -320,18 +320,18 @@ declare class ManifestInstance {
320
320
  getDimensionByKey(scoreKey: string): EnrichmentCategory | Signal | undefined;
321
321
  }
322
322
 
323
- declare type SharedTypes = external['uniform-context-types.swagger.yml']['components']['schemas'];
324
- declare type ManifestV2 = components['schemas']['ManifestV2'];
325
- declare type PersonalizationManifest = components['schemas']['PersonalizationManifest'];
326
- declare type Signal = SharedTypes['Signal'];
327
- declare type SignalCriteriaGroup = SharedTypes['SignalCriteriaGroup'];
328
- declare type SignalCriteria = SharedTypes['SignalCriteria'];
329
- declare type EnrichmentCategory = SharedTypes['EnrichmentCategory'];
330
- declare type StringMatch = SharedTypes['StringMatch'];
331
- declare type NumberMatch = SharedTypes['NumberMatch'];
332
- declare type TestDefinition = SharedTypes['Test'];
333
- declare type AggregateDimension = SharedTypes['AggregateDimension'];
334
- declare type AggregateDimensionInput = SharedTypes['AggregateDimensionInput'];
323
+ type SharedTypes = external['uniform-context-types.swagger.yml']['components']['schemas'];
324
+ type ManifestV2 = components['schemas']['ManifestV2'];
325
+ type PersonalizationManifest = components['schemas']['PersonalizationManifest'];
326
+ type Signal = SharedTypes['Signal'];
327
+ type SignalCriteriaGroup = SharedTypes['SignalCriteriaGroup'];
328
+ type SignalCriteria = SharedTypes['SignalCriteria'];
329
+ type EnrichmentCategory = SharedTypes['EnrichmentCategory'];
330
+ type StringMatch = SharedTypes['StringMatch'];
331
+ type NumberMatch = SharedTypes['NumberMatch'];
332
+ type TestDefinition = SharedTypes['Test'];
333
+ type AggregateDimension = SharedTypes['AggregateDimension'];
334
+ type AggregateDimensionInput = SharedTypes['AggregateDimensionInput'];
335
335
 
336
336
  declare class GroupCriteriaEvaluator {
337
337
  #private;
@@ -342,7 +342,7 @@ declare class GroupCriteriaEvaluator {
342
342
  /**
343
343
  * The result of evaluating a signal criteria.
344
344
  */
345
- declare type CriteriaEvaluatorResult = {
345
+ type CriteriaEvaluatorResult = {
346
346
  /** Whether the criteria evaluated to true or not */
347
347
  result: boolean;
348
348
  /**
@@ -352,7 +352,7 @@ declare type CriteriaEvaluatorResult = {
352
352
  */
353
353
  changed: boolean;
354
354
  };
355
- declare type CriteriaEvaluatorParameters = {
355
+ type CriteriaEvaluatorParameters = {
356
356
  /** The update being made to the Context state */
357
357
  update: ContextStateUpdate;
358
358
  /** Current criteria to evaluate the update against */
@@ -368,20 +368,20 @@ declare type CriteriaEvaluatorParameters = {
368
368
  /** Function to emit log notices to the Context log */
369
369
  onLogMessage?: (message: LogMessage) => void;
370
370
  };
371
- declare type SignalData = Signal & {
371
+ type SignalData = Signal & {
372
372
  id: string;
373
373
  };
374
374
  /**
375
375
  * A type that evaluates a signal criteria type and
376
376
  * decides if it matches the current Context state or not.
377
377
  */
378
- declare type CriteriaEvaluator = ((parameters: CriteriaEvaluatorParameters) => CriteriaEvaluatorResult) & {
378
+ type CriteriaEvaluator = ((parameters: CriteriaEvaluatorParameters) => CriteriaEvaluatorResult) & {
379
379
  /** If true the criteria will always execute even if a short-circuit would normally skip it */
380
380
  alwaysExecute?: boolean;
381
381
  };
382
382
 
383
383
  /** Defines all error codes and their parameter(s) */
384
- declare type LogMessages = {
384
+ type LogMessages = {
385
385
  /** Context constructed */
386
386
  1: MessageFunc;
387
387
  /** Context received data update */
@@ -465,10 +465,10 @@ declare type LogMessages = {
465
465
  701: MessageFunc;
466
466
  };
467
467
 
468
- declare type Severity = 'debug' | 'info' | 'warn' | 'error';
469
- declare type MessageCategory = 'context' | 'storage' | 'testing' | 'personalization' | 'gtag' | 'signals';
470
- declare type OutputSeverity = Severity | 'none';
471
- declare type MessageFunc<TArg = void> = (arg: TArg) => [
468
+ type Severity = 'debug' | 'info' | 'warn' | 'error';
469
+ type MessageCategory = 'context' | 'storage' | 'testing' | 'personalization' | 'gtag' | 'signals';
470
+ type OutputSeverity = Severity | 'none';
471
+ type MessageFunc<TArg = void> = (arg: TArg) => [
472
472
  /** Category of the message */
473
473
  MessageCategory,
474
474
  /** Log message text */
@@ -476,16 +476,16 @@ declare type MessageFunc<TArg = void> = (arg: TArg) => [
476
476
  /** Log message */
477
477
  ...unknown[]
478
478
  ];
479
- declare type LogMessage = LogMessageSingle | LogMessageGroup;
480
- declare type LogMessageSingle<TID extends keyof LogMessages = keyof LogMessages> = [
479
+ type LogMessage = LogMessageSingle | LogMessageGroup;
480
+ type LogMessageSingle<TID extends keyof LogMessages = keyof LogMessages> = [
481
481
  severity: Severity,
482
482
  id: TID,
483
483
  ...args: Parameters<LogMessages[TID]>
484
484
  ];
485
- declare type LogMessageGroup<TID extends keyof LogMessages = keyof LogMessages> = [severity: Severity, id: TID, group: 'GROUP', ...args: Parameters<LogMessages[TID]>] | [severity: Severity, id: TID, group: 'ENDGROUP'];
486
- declare type LogDrain = (message: LogMessage) => void;
485
+ type LogMessageGroup<TID extends keyof LogMessages = keyof LogMessages> = [severity: Severity, id: TID, group: 'GROUP', ...args: Parameters<LogMessages[TID]>] | [severity: Severity, id: TID, group: 'ENDGROUP'];
486
+ type LogDrain = (message: LogMessage) => void;
487
487
 
488
- declare type VariantMatchCriteria = {
488
+ type VariantMatchCriteria = {
489
489
  /**
490
490
  * Operation for match criteria
491
491
  *
@@ -498,7 +498,7 @@ declare type VariantMatchCriteria = {
498
498
  */
499
499
  name?: string;
500
500
  };
501
- declare type DimensionMatch = {
501
+ type DimensionMatch = {
502
502
  /**
503
503
  * Left hand side of the match expression (name of dimension in score vector)
504
504
  * NOTE: if the dimension is not present in the score vector, it will be treated as if it has a value of 0
@@ -537,25 +537,25 @@ declare type DimensionMatch = {
537
537
  };
538
538
 
539
539
  /** Content that is tagged for adding enrichment score when triggered by behavior (i.e. being shown that content) */
540
- declare type BehaviorTag = {
540
+ type BehaviorTag = {
541
541
  beh?: EnrichmentData[];
542
542
  };
543
543
  /** Defines the shape of a personalized content variant */
544
- declare type PersonalizedVariant = {
544
+ type PersonalizedVariant = {
545
545
  /** A unique identifier for this variation */
546
546
  id: string;
547
547
  /** Match criteria for this variation */
548
548
  pz?: VariantMatchCriteria;
549
549
  };
550
550
  /** The result of computing personalized content from variations */
551
- declare type PersonalizedResult<TVariant> = {
551
+ type PersonalizedResult<TVariant> = {
552
552
  /** Whether or not this result contains a personalized result */
553
553
  personalized: boolean;
554
554
  /** Matching variations */
555
555
  variations: Array<TVariant>;
556
556
  };
557
557
  /** Defines the shape of a A/B test variant */
558
- declare type TestVariant = {
558
+ type TestVariant = {
559
559
  /** The identifier for this variant. This value persisted to storage when a variant is selected. */
560
560
  id: string;
561
561
  /**
@@ -565,7 +565,7 @@ declare type TestVariant = {
565
565
  testDistribution?: number;
566
566
  };
567
567
  /** The result of computing an A/B test result */
568
- declare type TestResult<TVariant> = {
568
+ type TestResult<TVariant> = {
569
569
  /** The selected variation */
570
570
  result: TVariant | undefined;
571
571
  /**
@@ -576,7 +576,7 @@ declare type TestResult<TVariant> = {
576
576
  variantAssigned: boolean;
577
577
  };
578
578
 
579
- declare type PersonalizeOptions<TVariant> = {
579
+ type PersonalizeOptions<TVariant> = {
580
580
  /** Name of placement (sent to analytics) */
581
581
  name: string;
582
582
  /** Possible variants to place */
@@ -589,7 +589,7 @@ declare function personalizeVariations<TVariant extends PersonalizedVariant>({ n
589
589
  context: Context;
590
590
  }): PersonalizedResult<TVariant>;
591
591
 
592
- declare type TestOptions<TVariant extends TestVariant> = {
592
+ type TestOptions<TVariant extends TestVariant> = {
593
593
  /** The name of the test that is being run, must be included in the manifest. */
594
594
  name: string;
595
595
  /** Variations that are being tested. */
@@ -605,11 +605,11 @@ declare const testVariations: <TVariant extends TestVariant>({ name, context, va
605
605
  * The plugin should attach event handlers in its creation function.
606
606
  * @returns A function that detaches any event handlers when called
607
607
  */
608
- declare type ContextPlugin = {
608
+ type ContextPlugin = {
609
609
  logDrain?: LogDrain;
610
610
  init?: (context: Context) => () => void;
611
611
  };
612
- declare type ContextOptions = {
612
+ type ContextOptions = {
613
613
  /** The Context Manifest to load (from the Context API) */
614
614
  manifest: ManifestV2;
615
615
  /**
@@ -622,7 +622,7 @@ declare type ContextOptions = {
622
622
  plugins?: Array<ContextPlugin>;
623
623
  } & Omit<VisitorDataStoreOptions, 'manifest' | 'onServerTransitionScoresReceived'>;
624
624
  /** Emitted when a personalization runs */
625
- declare type PersonalizationEvent = {
625
+ type PersonalizationEvent = {
626
626
  /** Name of the personalized placement */
627
627
  name: string;
628
628
  /** Selected variant ID(s) */
@@ -637,7 +637,7 @@ declare type PersonalizationEvent = {
637
637
  changed: boolean;
638
638
  };
639
639
  /** Emitted event when an A/B test runs */
640
- declare type TestEvent = {
640
+ type TestEvent = {
641
641
  /** Name (public ID) of the A/B test */
642
642
  name: string;
643
643
  /** ID of the variant that was selected */
@@ -649,7 +649,7 @@ declare type TestEvent = {
649
649
  */
650
650
  variantAssigned: boolean;
651
651
  };
652
- declare type ContextEvents = {
652
+ type ContextEvents = {
653
653
  /**
654
654
  * Fired when the scores are updated.
655
655
  * The event is NOT fired if an update does not result in any score changes.
@@ -735,11 +735,11 @@ declare class Context implements Context {
735
735
  * 1: Uniform Optimize.
736
736
  * 2: Uniform Context.
737
737
  */
738
- declare type DevToolsUiVersion = 1 | 2;
738
+ type DevToolsUiVersion = 1 | 2;
739
739
  /**
740
740
  * The data state provided to the devtools for rendering.
741
741
  */
742
- declare type DevToolsState = {
742
+ type DevToolsState = {
743
743
  /** Current computed visitor scores (includes aggregates) */
744
744
  scores: Readonly<ScoreVector>;
745
745
  /** Current visitor data (includes quirks, raw scores, tests, consent, etc) */
@@ -752,7 +752,7 @@ declare type DevToolsState = {
752
752
  manifest: ManifestV2;
753
753
  };
754
754
  /** Mutations the DevTools can take on the data it receives */
755
- declare type DevToolsActions = {
755
+ type DevToolsActions = {
756
756
  /** Standard updates; maps to Context.update() */
757
757
  update: (newData: Partial<ContextState>) => Promise<void>;
758
758
  /** Raw updates to the storage subsystem. Maps to Context.storage.updateData() */
@@ -760,33 +760,33 @@ declare type DevToolsActions = {
760
760
  /** Forget the current visitor and clear data on this device */
761
761
  forget: () => Promise<void>;
762
762
  };
763
- declare type DevToolsEvent<Type extends string = string, TEventData = unknown> = {
763
+ type DevToolsEvent<Type extends string = string, TEventData = unknown> = {
764
764
  /** The integration ID that is required */
765
765
  type: Type;
766
766
  } & TEventData;
767
- declare type DevToolsEvents = DevToolsLogEvent | DevToolsDataEvent | DevToolsHelloEvent | DevToolsUpdateEvent | DevToolsRawCommandsEvent | DevToolsForgetEvent;
767
+ type DevToolsEvents = DevToolsLogEvent | DevToolsDataEvent | DevToolsHelloEvent | DevToolsUpdateEvent | DevToolsRawCommandsEvent | DevToolsForgetEvent;
768
768
  /** A log message emitted as an event to the browser extension */
769
- declare type DevToolsLogEvent = DevToolsEvent<'uniform:context:log', {
769
+ type DevToolsLogEvent = DevToolsEvent<'uniform:context:log', {
770
770
  message: LogMessage;
771
771
  }>;
772
772
  /** Emitted when data is updated in Context to the devtools */
773
- declare type DevToolsDataEvent = DevToolsEvent<'uniform:context:data', {
773
+ type DevToolsDataEvent = DevToolsEvent<'uniform:context:data', {
774
774
  data: DevToolsState;
775
775
  }>;
776
776
  /** A hello message emitted as an event from the browser extension to test if the page contains Context */
777
- declare type DevToolsHelloEvent = DevToolsEvent<'uniform:context:hello', {
777
+ type DevToolsHelloEvent = DevToolsEvent<'uniform:context:hello', {
778
778
  uiVersion: DevToolsUiVersion;
779
779
  }>;
780
780
  /** Devtools requests a normal update cycle (regular data update, re-eval signals, etc) */
781
- declare type DevToolsUpdateEvent = DevToolsEvent<'uniform-in:context:update', {
781
+ type DevToolsUpdateEvent = DevToolsEvent<'uniform-in:context:update', {
782
782
  newData: Partial<ContextState>;
783
783
  }>;
784
784
  /** Devtools requests a raw update cycle (explicitly set scores of dimensions in durations, etc) */
785
- declare type DevToolsRawCommandsEvent = DevToolsEvent<'uniform-in:context:commands', {
785
+ type DevToolsRawCommandsEvent = DevToolsEvent<'uniform-in:context:commands', {
786
786
  commands: StorageCommands[];
787
787
  }>;
788
788
  /** A request to forget me from the DevTools */
789
- declare type DevToolsForgetEvent = DevToolsEvent<'uniform-in:context:forget', unknown>;
789
+ type DevToolsForgetEvent = DevToolsEvent<'uniform-in:context:forget', unknown>;
790
790
  declare global {
791
791
  interface Window {
792
792
  /** Window var set by enableContextDevTools() to enable embedded devtools to receive Context instance and attach events to it. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniformdev/context",
3
- "version": "17.7.1-alpha.34+084da3172",
3
+ "version": "18.0.0",
4
4
  "description": "Uniform Context core package",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "main": "./dist/index.js",
@@ -45,7 +45,7 @@
45
45
  "sideEffects": false,
46
46
  "scripts": {
47
47
  "build": "run-s update-openapi build:ts",
48
- "build:ts": "tsup --minify",
48
+ "build:ts": "tsup",
49
49
  "dev": "run-s update-openapi dev:ts",
50
50
  "dev:ts": "tsup --watch",
51
51
  "clean": "rimraf dist",
@@ -58,8 +58,8 @@
58
58
  },
59
59
  "devDependencies": {
60
60
  "@types/js-cookie": "3.0.2",
61
- "@types/yargs": "17.0.17",
62
- "@uniformdev/cli": "^17.7.1-alpha.34+084da3172",
61
+ "@types/yargs": "17.0.19",
62
+ "@uniformdev/cli": "18.0.0",
63
63
  "benny": "3.7.1",
64
64
  "yargs": "17.6.2"
65
65
  },
@@ -76,5 +76,5 @@
76
76
  "publishConfig": {
77
77
  "access": "public"
78
78
  },
79
- "gitHead": "084da31729798e2c1a1f26ba38c764caabebc958"
79
+ "gitHead": "ed311bfb657d4b90e7d7c80c046cf2f115a94abe"
80
80
  }