@simplybusiness/services 0.21.5 → 0.22.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.
Files changed (108) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/index.js +1198 -17
  3. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  4. package/dist/esm/index.js +1193 -4
  5. package/package.json +7 -6
  6. package/src/snowplow/event-definitions/intervention.ts +2 -2
  7. package/dist/cjs/address-lookup/index.js +0 -98
  8. package/dist/cjs/address-lookup/index.js.map +0 -1
  9. package/dist/cjs/address-lookup/types.js +0 -7
  10. package/dist/cjs/address-lookup/types.js.map +0 -1
  11. package/dist/cjs/airbrake/index.js +0 -45
  12. package/dist/cjs/airbrake/index.js.map +0 -1
  13. package/dist/cjs/index.js.map +0 -1
  14. package/dist/cjs/mocks/eventDefinitions.js +0 -90
  15. package/dist/cjs/mocks/eventDefinitions.js.map +0 -1
  16. package/dist/cjs/mocks/scripts-mock.js +0 -59
  17. package/dist/cjs/mocks/scripts-mock.js.map +0 -1
  18. package/dist/cjs/mocks/snowplowBrowserTrackerMock.js +0 -7
  19. package/dist/cjs/mocks/snowplowBrowserTrackerMock.js.map +0 -1
  20. package/dist/cjs/snowplow/Snowplow.js +0 -174
  21. package/dist/cjs/snowplow/Snowplow.js.map +0 -1
  22. package/dist/cjs/snowplow/SnowplowContext.js +0 -61
  23. package/dist/cjs/snowplow/SnowplowContext.js.map +0 -1
  24. package/dist/cjs/snowplow/constants.js +0 -13
  25. package/dist/cjs/snowplow/constants.js.map +0 -1
  26. package/dist/cjs/snowplow/contexts.js +0 -68
  27. package/dist/cjs/snowplow/contexts.js.map +0 -1
  28. package/dist/cjs/snowplow/event-definitions/base.js +0 -56
  29. package/dist/cjs/snowplow/event-definitions/base.js.map +0 -1
  30. package/dist/cjs/snowplow/event-definitions/index.js +0 -65
  31. package/dist/cjs/snowplow/event-definitions/index.js.map +0 -1
  32. package/dist/cjs/snowplow/event-definitions/intervention.js +0 -33
  33. package/dist/cjs/snowplow/event-definitions/intervention.js.map +0 -1
  34. package/dist/cjs/snowplow/event-definitions/personalised_cover.js +0 -122
  35. package/dist/cjs/snowplow/event-definitions/personalised_cover.js.map +0 -1
  36. package/dist/cjs/snowplow/event-definitions/qcp.js +0 -348
  37. package/dist/cjs/snowplow/event-definitions/qcp.js.map +0 -1
  38. package/dist/cjs/snowplow/event-definitions/questionnaire.js +0 -115
  39. package/dist/cjs/snowplow/event-definitions/questionnaire.js.map +0 -1
  40. package/dist/cjs/snowplow/event-definitions/redaction.js +0 -154
  41. package/dist/cjs/snowplow/event-definitions/redaction.js.map +0 -1
  42. package/dist/cjs/snowplow/event-definitions/referral.js +0 -37
  43. package/dist/cjs/snowplow/event-definitions/referral.js.map +0 -1
  44. package/dist/cjs/snowplow/getSnowplowConfig.js +0 -16
  45. package/dist/cjs/snowplow/getSnowplowConfig.js.map +0 -1
  46. package/dist/cjs/snowplow/index.js +0 -25
  47. package/dist/cjs/snowplow/index.js.map +0 -1
  48. package/dist/cjs/snowplow/types.js +0 -6
  49. package/dist/cjs/snowplow/types.js.map +0 -1
  50. package/dist/cjs/utils/index.js +0 -21
  51. package/dist/cjs/utils/index.js.map +0 -1
  52. package/dist/cjs/utils/isObject.js +0 -15
  53. package/dist/cjs/utils/isObject.js.map +0 -1
  54. package/dist/cjs/utils/testUtils.js +0 -43
  55. package/dist/cjs/utils/testUtils.js.map +0 -1
  56. package/dist/cjs/utils/text.js +0 -45
  57. package/dist/cjs/utils/text.js.map +0 -1
  58. package/dist/esm/address-lookup/index.js +0 -88
  59. package/dist/esm/address-lookup/index.js.map +0 -1
  60. package/dist/esm/address-lookup/types.js +0 -5
  61. package/dist/esm/address-lookup/types.js.map +0 -1
  62. package/dist/esm/airbrake/index.js +0 -35
  63. package/dist/esm/airbrake/index.js.map +0 -1
  64. package/dist/esm/index.js.map +0 -1
  65. package/dist/esm/mocks/eventDefinitions.js +0 -80
  66. package/dist/esm/mocks/eventDefinitions.js.map +0 -1
  67. package/dist/esm/mocks/scripts-mock.js +0 -49
  68. package/dist/esm/mocks/scripts-mock.js.map +0 -1
  69. package/dist/esm/mocks/snowplowBrowserTrackerMock.js +0 -6
  70. package/dist/esm/mocks/snowplowBrowserTrackerMock.js.map +0 -1
  71. package/dist/esm/snowplow/Snowplow.js +0 -169
  72. package/dist/esm/snowplow/Snowplow.js.map +0 -1
  73. package/dist/esm/snowplow/SnowplowContext.js +0 -43
  74. package/dist/esm/snowplow/SnowplowContext.js.map +0 -1
  75. package/dist/esm/snowplow/constants.js +0 -3
  76. package/dist/esm/snowplow/constants.js.map +0 -1
  77. package/dist/esm/snowplow/contexts.js +0 -47
  78. package/dist/esm/snowplow/contexts.js.map +0 -1
  79. package/dist/esm/snowplow/event-definitions/base.js +0 -66
  80. package/dist/esm/snowplow/event-definitions/base.js.map +0 -1
  81. package/dist/esm/snowplow/event-definitions/index.js +0 -36
  82. package/dist/esm/snowplow/event-definitions/index.js.map +0 -1
  83. package/dist/esm/snowplow/event-definitions/intervention.js +0 -23
  84. package/dist/esm/snowplow/event-definitions/intervention.js.map +0 -1
  85. package/dist/esm/snowplow/event-definitions/personalised_cover.js +0 -131
  86. package/dist/esm/snowplow/event-definitions/personalised_cover.js.map +0 -1
  87. package/dist/esm/snowplow/event-definitions/qcp.js +0 -339
  88. package/dist/esm/snowplow/event-definitions/qcp.js.map +0 -1
  89. package/dist/esm/snowplow/event-definitions/questionnaire.js +0 -106
  90. package/dist/esm/snowplow/event-definitions/questionnaire.js.map +0 -1
  91. package/dist/esm/snowplow/event-definitions/redaction.js +0 -144
  92. package/dist/esm/snowplow/event-definitions/redaction.js.map +0 -1
  93. package/dist/esm/snowplow/event-definitions/referral.js +0 -28
  94. package/dist/esm/snowplow/event-definitions/referral.js.map +0 -1
  95. package/dist/esm/snowplow/getSnowplowConfig.js +0 -7
  96. package/dist/esm/snowplow/getSnowplowConfig.js.map +0 -1
  97. package/dist/esm/snowplow/index.js +0 -8
  98. package/dist/esm/snowplow/index.js.map +0 -1
  99. package/dist/esm/snowplow/types.js +0 -3
  100. package/dist/esm/snowplow/types.js.map +0 -1
  101. package/dist/esm/utils/index.js +0 -4
  102. package/dist/esm/utils/index.js.map +0 -1
  103. package/dist/esm/utils/isObject.js +0 -5
  104. package/dist/esm/utils/isObject.js.map +0 -1
  105. package/dist/esm/utils/testUtils.js +0 -26
  106. package/dist/esm/utils/testUtils.js.map +0 -1
  107. package/dist/esm/utils/text.js +0 -25
  108. package/dist/esm/utils/text.js.map +0 -1
@@ -1,28 +0,0 @@
1
- // Referral page events
2
- export const referralEventDefinitions = [
3
- {
4
- name: "nextCoverageClicked",
5
- type: "structured",
6
- makePayload: (params)=>{
7
- const { url } = params;
8
- const eventName = "post_referral_workers_compensation_continuation_link";
9
- return {
10
- category: eventName,
11
- action: "link_click",
12
- label: eventName,
13
- property: url
14
- };
15
- }
16
- },
17
- {
18
- name: "helpChatLinkClicked",
19
- type: "structured",
20
- makePayload: ()=>({
21
- category: "help chat for question",
22
- action: "help_chat_for_question_clicked",
23
- property: window.location.href
24
- })
25
- }
26
- ];
27
-
28
- //# sourceMappingURL=referral.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/snowplow/event-definitions/referral.ts"],"sourcesContent":["import { EventDefinition, ParamsType } from \"../types\";\n\n// Referral page events\nexport const referralEventDefinitions: EventDefinition[] = [\n {\n name: \"nextCoverageClicked\",\n type: \"structured\",\n makePayload: params => {\n const { url } = params as ParamsType;\n const eventName = \"post_referral_workers_compensation_continuation_link\";\n\n return {\n category: eventName,\n action: \"link_click\",\n label: eventName,\n property: url,\n };\n },\n },\n {\n name: \"helpChatLinkClicked\",\n type: \"structured\",\n makePayload: () => ({\n category: \"help chat for question\",\n action: \"help_chat_for_question_clicked\",\n property: window.location.href,\n }),\n },\n];\n"],"names":["referralEventDefinitions","name","type","makePayload","params","url","eventName","category","action","label","property","window","location","href"],"mappings":"AAEA,uBAAuB;AACvB,OAAO,MAAMA,2BAA8C;IACzD;QACEC,MAAM;QACNC,MAAM;QACNC,aAAaC,CAAAA;YACX,MAAM,EAAEC,GAAG,EAAE,GAAGD;YAChB,MAAME,YAAY;YAElB,OAAO;gBACLC,UAAUD;gBACVE,QAAQ;gBACRC,OAAOH;gBACPI,UAAUL;YACZ;QACF;IACF;IACA;QACEJ,MAAM;QACNC,MAAM;QACNC,aAAa,IAAO,CAAA;gBAClBI,UAAU;gBACVC,QAAQ;gBACRE,UAAUC,OAAOC,QAAQ,CAACC,IAAI;YAChC,CAAA;IACF;CACD,CAAC"}
@@ -1,7 +0,0 @@
1
- // Get Snowplow config from page data props
2
- export const getSnowplowConfig = (pageData)=>{
3
- var _pageData_scripts_find, _pageData_scripts;
4
- return (_pageData_scripts = pageData.scripts) === null || _pageData_scripts === void 0 ? void 0 : (_pageData_scripts_find = _pageData_scripts.find(({ metadata })=>metadata.name === "snowplow")) === null || _pageData_scripts_find === void 0 ? void 0 : _pageData_scripts_find.props;
5
- };
6
-
7
- //# sourceMappingURL=getSnowplowConfig.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/snowplow/getSnowplowConfig.ts"],"sourcesContent":["import type { TrackingProps, PageDataProps } from \"./types\";\n\n// Get Snowplow config from page data props\nexport const getSnowplowConfig = (\n pageData: PageDataProps,\n): TrackingProps | undefined =>\n pageData.scripts?.find(({ metadata }) => metadata.name === \"snowplow\")\n ?.props as TrackingProps;\n"],"names":["getSnowplowConfig","pageData","scripts","find","metadata","name","props"],"mappings":"AAEA,2CAA2C;AAC3C,OAAO,MAAMA,oBAAoB,CAC/BC;QAEAA,wBAAAA;YAAAA,oBAAAA,SAASC,OAAO,cAAhBD,yCAAAA,yBAAAA,kBAAkBE,IAAI,CAAC,CAAC,EAAEC,QAAQ,EAAE,GAAKA,SAASC,IAAI,KAAK,yBAA3DJ,6CAAAA,uBACIK,KAAK;EAAkB"}
@@ -1,8 +0,0 @@
1
- export * from "./contexts";
2
- export * from "./event-definitions";
3
- export * from "./getSnowplowConfig";
4
- export * from "./Snowplow";
5
- export * from "./SnowplowContext";
6
- export * from "./types";
7
-
8
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/snowplow/index.ts"],"sourcesContent":["export * from \"./contexts\";\nexport * from \"./event-definitions\";\nexport * from \"./getSnowplowConfig\";\nexport * from \"./Snowplow\";\nexport * from \"./SnowplowContext\";\nexport * from \"./types\";\n"],"names":[],"mappings":"AAAA,cAAc,aAAa;AAC3B,cAAc,sBAAsB;AACpC,cAAc,sBAAsB;AACpC,cAAc,aAAa;AAC3B,cAAc,oBAAoB;AAClC,cAAc,UAAU"}
@@ -1,3 +0,0 @@
1
- export { };
2
-
3
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/snowplow/types.ts"],"sourcesContent":["import {\n EventMethod,\n SelfDescribingJson,\n StructuredEvent,\n} from \"@snowplow/browser-tracker\";\n\ntype BaseConfig = {\n appId: string;\n avalancheCollector: string;\n eventMethod: EventMethod;\n trackPageView: boolean;\n includeGAContext: boolean;\n uid?: string;\n postPath?: string;\n};\n\nexport type EnvConfig = BaseConfig & {\n cookieDomain: Record<string, string>;\n};\n\nexport type TrackingProps = BaseConfig & {\n eventMethod: EventMethod;\n cookieDomain?: string;\n pageViewContext?: ChannelContext;\n};\n\nexport type ChannelContext = {\n schema: string;\n data: Record<string, string | number>;\n};\n\nexport type ChannelContexts = Record<string, ChannelContext>;\n\nexport type ArrayOneOrMore<T> = [T, ...T[]];\n\nexport type ParamsType = Record<string, string> & {\n context: ServerContext;\n};\n\ntype ServerContext = {\n site: string;\n vertical: string;\n primary_detail: string;\n journey_name: string;\n journey_id: string;\n};\n\nexport type LinkType = Record<string, string> & {\n targetUrl: string;\n elementContent: string;\n};\n\nexport type SerialisedEvent = SelfDescribingJson<Record<string, unknown>>;\n\nexport type EventDefinition = {\n name: string;\n type: \"structured\" | \"unstructured\";\n makePayload: (\n params?: Record<string, unknown>,\n ) => StructuredEvent | SerialisedEvent;\n contexts?: string[];\n};\n\nexport interface PageDataProps\n extends Partial<\n Record<\n \"scripts\",\n Array<{\n metadata: { name: string };\n props?: Record<string, unknown>;\n }>\n >\n > {}\n"],"names":[],"mappings":"AA+DA,WASM"}
@@ -1,4 +0,0 @@
1
- export * from "./text";
2
- export * from "./isObject";
3
-
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from \"./text\";\nexport * from \"./isObject\";\n"],"names":[],"mappings":"AAAA,cAAc,SAAS;AACvB,cAAc,aAAa"}
@@ -1,5 +0,0 @@
1
- export function isObject(value) {
2
- return typeof value === "object" && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
3
- }
4
-
5
- //# sourceMappingURL=isObject.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/isObject.tsx"],"sourcesContent":["export function isObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n }\n"],"names":["isObject","value","Array","isArray","Object","getPrototypeOf","prototype"],"mappings":"AAAA,OAAO,SAASA,SAASC,KAAc;IACnC,OACE,OAAOA,UAAU,YACjBA,UAAU,QACV,CAACC,MAAMC,OAAO,CAACF,UACfG,OAAOC,cAAc,CAACJ,WAAWG,OAAOE,SAAS;AAErD"}
@@ -1,26 +0,0 @@
1
- /* eslint-disable import/no-extraneous-dependencies */ import { jsx as _jsx } from "react/jsx-runtime";
2
- import { render } from "@testing-library/react";
3
- import { pageData } from "../mocks/scripts-mock";
4
- import { SnowplowProvider } from "../snowplow/SnowplowContext";
5
- import { getSnowplowConfig } from "../snowplow/getSnowplowConfig";
6
- // Snowplow analytics
7
- const snowplowProps = getSnowplowConfig(pageData);
8
- const ProvidersMock = ({ children })=>/*#__PURE__*/ _jsx(SnowplowProvider, {
9
- scripts: snowplowProps,
10
- children: children
11
- });
12
- export const renderWithProviders = (ui, options)=>render(ui, {
13
- wrapper: ProvidersMock,
14
- ...options
15
- });
16
- // Mocks window.location for url testing
17
- export const mockLocation = ({ origin = "https://simplybusiness.co.uk", pathname = "" })=>Object.defineProperty(window, "location", {
18
- get () {
19
- return {
20
- origin,
21
- pathname
22
- };
23
- }
24
- });
25
-
26
- //# sourceMappingURL=testUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/testUtils.tsx"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { RenderOptions, render } from \"@testing-library/react\";\nimport { ReactElement, ReactNode } from \"react\";\nimport { pageData } from \"../mocks/scripts-mock\";\nimport { SnowplowProvider } from \"../snowplow/SnowplowContext\";\nimport { getSnowplowConfig } from \"../snowplow/getSnowplowConfig\";\nimport { PageDataProps } from \"../snowplow/types\";\n\n// Snowplow analytics\nconst snowplowProps = getSnowplowConfig(pageData as PageDataProps);\n\nconst ProvidersMock = ({ children }: { children: ReactNode }) => (\n <SnowplowProvider scripts={snowplowProps!}>{children}</SnowplowProvider>\n);\n\nexport const renderWithProviders = (\n ui: ReactElement,\n options?: RenderOptions,\n) => render(ui, { wrapper: ProvidersMock, ...options });\n\n// Mocks window.location for url testing\nexport const mockLocation = ({\n origin = \"https://simplybusiness.co.uk\",\n pathname = \"\",\n}: {\n origin?: string;\n pathname?: string;\n}) =>\n Object.defineProperty(window, \"location\", {\n get() {\n return {\n origin,\n pathname,\n };\n },\n });\n"],"names":["render","pageData","SnowplowProvider","getSnowplowConfig","snowplowProps","ProvidersMock","children","scripts","renderWithProviders","ui","options","wrapper","mockLocation","origin","pathname","Object","defineProperty","window","get"],"mappings":"AAAA,oDAAoD;AACpD,SAAwBA,MAAM,QAAQ,yBAAyB;AAE/D,SAASC,QAAQ,QAAQ,wBAAwB;AACjD,SAASC,gBAAgB,QAAQ,8BAA8B;AAC/D,SAASC,iBAAiB,QAAQ,gCAAgC;AAGlE,qBAAqB;AACrB,MAAMC,gBAAgBD,kBAAkBF;AAExC,MAAMI,gBAAgB,CAAC,EAAEC,QAAQ,EAA2B,iBAC1D,KAACJ;QAAiBK,SAASH;kBAAiBE;;AAG9C,OAAO,MAAME,sBAAsB,CACjCC,IACAC,UACGV,OAAOS,IAAI;QAAEE,SAASN;QAAe,GAAGK,OAAO;IAAC,GAAG;AAExD,wCAAwC;AACxC,OAAO,MAAME,eAAe,CAAC,EAC3BC,SAAS,8BAA8B,EACvCC,WAAW,EAAE,EAId,GACCC,OAAOC,cAAc,CAACC,QAAQ,YAAY;QACxCC;YACE,OAAO;gBACLL;gBACAC;YACF;QACF;IACF,GAAG"}
@@ -1,25 +0,0 @@
1
- import { isObject } from ".";
2
- // Deeply converts keys in an object to snake_case
3
- export const snakeCaseKeys = (object)=>Object.entries(object || {}).reduce((acc, [key, value])=>{
4
- const newKey = camelToSnakeCase(key);
5
- if (Array.isArray(value) && value.every(isObject)) {
6
- return {
7
- ...acc,
8
- [newKey]: value.map((v)=>snakeCaseKeys(v))
9
- };
10
- }
11
- if (isObject(value)) {
12
- return {
13
- ...acc,
14
- [newKey]: snakeCaseKeys(value)
15
- };
16
- }
17
- return {
18
- ...acc,
19
- [newKey]: value
20
- };
21
- }, {});
22
- export const snakeCase = (text = "")=>text.toLowerCase().replace(/ /g, "_");
23
- export const camelToSnakeCase = (text)=>text.charAt(0).toLowerCase() + text.slice(1).replace(/(\[.*?\])|[A-Z]/g, (match, group)=>group ? match : `_${match.toLowerCase()}`);
24
-
25
- //# sourceMappingURL=text.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/text.ts"],"sourcesContent":["import { isObject } from \".\";\n\n// Deeply converts keys in an object to snake_case\nexport const snakeCaseKeys = (object: Record<string, unknown>) =>\n Object.entries(object || {}).reduce(\n (acc: Record<string, unknown>, [key, value]): Record<string, unknown> => {\n const newKey = camelToSnakeCase(key);\n\n if (Array.isArray(value) && value.every(isObject)) {\n return {\n ...acc,\n [newKey]: value.map(v => snakeCaseKeys(v)),\n };\n }\n\n if (isObject(value)) {\n return {\n ...acc,\n [newKey]: snakeCaseKeys(value),\n };\n }\n\n return {\n ...acc,\n [newKey]: value,\n };\n },\n {},\n );\n\nexport const snakeCase = (text = \"\"): string =>\n text.toLowerCase().replace(/ /g, \"_\");\n\nexport const camelToSnakeCase = (text: string) =>\n text.charAt(0).toLowerCase() +\n text\n .slice(1)\n .replace(/(\\[.*?\\])|[A-Z]/g, (match, group) =>\n group ? match : `_${match.toLowerCase()}`,\n );\n\n"],"names":["isObject","snakeCaseKeys","object","Object","entries","reduce","acc","key","value","newKey","camelToSnakeCase","Array","isArray","every","map","v","snakeCase","text","toLowerCase","replace","charAt","slice","match","group"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,IAAI;AAE7B,kDAAkD;AAClD,OAAO,MAAMC,gBAAgB,CAACC,SAC5BC,OAAOC,OAAO,CAACF,UAAU,CAAC,GAAGG,MAAM,CACjC,CAACC,KAA8B,CAACC,KAAKC,MAAM;QACzC,MAAMC,SAASC,iBAAiBH;QAEhC,IAAII,MAAMC,OAAO,CAACJ,UAAUA,MAAMK,KAAK,CAACb,WAAW;YACjD,OAAO;gBACL,GAAGM,GAAG;gBACN,CAACG,OAAO,EAAED,MAAMM,GAAG,CAACC,CAAAA,IAAKd,cAAcc;YACzC;QACF;QAEA,IAAIf,SAASQ,QAAQ;YACnB,OAAO;gBACL,GAAGF,GAAG;gBACN,CAACG,OAAO,EAAER,cAAcO;YAC1B;QACF;QAEA,OAAO;YACL,GAAGF,GAAG;YACN,CAACG,OAAO,EAAED;QACZ;IACF,GACA,CAAC,GACD;AAEJ,OAAO,MAAMQ,YAAY,CAACC,OAAO,EAAE,GACjCA,KAAKC,WAAW,GAAGC,OAAO,CAAC,MAAM,KAAK;AAExC,OAAO,MAAMT,mBAAmB,CAACO,OAC/BA,KAAKG,MAAM,CAAC,GAAGF,WAAW,KAC1BD,KACGI,KAAK,CAAC,GACNF,OAAO,CAAC,oBAAoB,CAACG,OAAOC,QACnCA,QAAQD,QAAQ,CAAC,CAAC,EAAEA,MAAMJ,WAAW,IAAI,EACzC"}