@everymatrix/lottery-order-summary 0.0.1

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 (57) hide show
  1. package/dist/cjs/app-globals-3a1e7e63.js +5 -0
  2. package/dist/cjs/index-b1042ae5.js +1307 -0
  3. package/dist/cjs/index.cjs.js +10 -0
  4. package/dist/cjs/loader.cjs.js +15 -0
  5. package/dist/cjs/lottery-button_2.cjs.entry.js +179 -0
  6. package/dist/cjs/lottery-order-summary-9c494983.js +292 -0
  7. package/dist/cjs/lottery-order-summary.cjs.js +25 -0
  8. package/dist/collection/collection-manifest.json +19 -0
  9. package/dist/collection/components/lottery-order-summary/index.js +1 -0
  10. package/dist/collection/components/lottery-order-summary/lottery-order-summary.css +67 -0
  11. package/dist/collection/components/lottery-order-summary/lottery-order-summary.js +442 -0
  12. package/dist/collection/index.js +1 -0
  13. package/dist/collection/model/index.js +7 -0
  14. package/dist/collection/utils/utils.js +38 -0
  15. package/dist/esm/app-globals-0f993ce5.js +3 -0
  16. package/dist/esm/index-8e69c8be.js +1279 -0
  17. package/dist/esm/index.js +2 -0
  18. package/dist/esm/loader.js +11 -0
  19. package/dist/esm/lottery-button_2.entry.js +175 -0
  20. package/dist/esm/lottery-order-summary-1c477f07.js +287 -0
  21. package/dist/esm/lottery-order-summary.js +20 -0
  22. package/dist/index.cjs.js +1 -0
  23. package/dist/index.js +1 -0
  24. package/dist/lottery-order-summary/app-globals-0f993ce5.js +1 -0
  25. package/dist/lottery-order-summary/index-8e69c8be.js +2 -0
  26. package/dist/lottery-order-summary/index.esm.js +1 -0
  27. package/dist/lottery-order-summary/lottery-button_2.entry.js +1 -0
  28. package/dist/lottery-order-summary/lottery-order-summary-1c477f07.js +1 -0
  29. package/dist/lottery-order-summary/lottery-order-summary.esm.js +1 -0
  30. package/dist/stencil.config.dev.js +19 -0
  31. package/dist/stencil.config.js +19 -0
  32. package/dist/storybook/main.js +43 -0
  33. package/dist/storybook/preview.js +9 -0
  34. package/dist/types/builds/emfe-widgets/widgets-monorepo/packages/stencil/lottery-order-summary/.stencil/libs/common/src/storybook/storybook-utils.d.ts +39 -0
  35. package/dist/types/builds/emfe-widgets/widgets-monorepo/packages/stencil/lottery-order-summary/.stencil/packages/stencil/lottery-order-summary/stencil.config.d.ts +2 -0
  36. package/dist/types/builds/emfe-widgets/widgets-monorepo/packages/stencil/lottery-order-summary/.stencil/packages/stencil/lottery-order-summary/stencil.config.dev.d.ts +2 -0
  37. package/dist/types/builds/emfe-widgets/widgets-monorepo/packages/stencil/lottery-order-summary/.stencil/packages/stencil/lottery-order-summary/storybook/main.d.ts +3 -0
  38. package/dist/types/builds/emfe-widgets/widgets-monorepo/packages/stencil/lottery-order-summary/.stencil/packages/stencil/lottery-order-summary/storybook/preview.d.ts +70 -0
  39. package/dist/types/builds/emfe-widgets/widgets-monorepo/packages/stencil/lottery-order-summary/.stencil/tools/plugins/index.d.ts +4 -0
  40. package/dist/types/builds/emfe-widgets/widgets-monorepo/packages/stencil/lottery-order-summary/.stencil/tools/plugins/lazy-load-chunk-plugin.d.ts +12 -0
  41. package/dist/types/builds/emfe-widgets/widgets-monorepo/packages/stencil/lottery-order-summary/.stencil/tools/plugins/stencil-clean-deps-plugin.d.ts +5 -0
  42. package/dist/types/builds/emfe-widgets/widgets-monorepo/packages/stencil/lottery-order-summary/.stencil/tools/plugins/vite-chunk-plugin.d.ts +6 -0
  43. package/dist/types/builds/emfe-widgets/widgets-monorepo/packages/stencil/lottery-order-summary/.stencil/tools/plugins/vite-clean-deps-plugin.d.ts +4 -0
  44. package/dist/types/components/lottery-order-summary/index.d.ts +1 -0
  45. package/dist/types/components/lottery-order-summary/lottery-order-summary.d.ts +87 -0
  46. package/dist/types/components.d.ts +175 -0
  47. package/dist/types/index.d.ts +1 -0
  48. package/dist/types/model/index.d.ts +34 -0
  49. package/dist/types/stencil-public-runtime.d.ts +1674 -0
  50. package/dist/types/utils/utils.d.ts +3 -0
  51. package/loader/cdn.js +1 -0
  52. package/loader/index.cjs.js +1 -0
  53. package/loader/index.d.ts +24 -0
  54. package/loader/index.es2017.js +1 -0
  55. package/loader/index.js +2 -0
  56. package/loader/package.json +11 -0
  57. package/package.json +27 -0
@@ -0,0 +1,43 @@
1
+ import path from "path";
2
+ import { getStoryFiles, detectUsedPackages, parseTsConfig, exec, filterParsedPathsByUsedPackages } from "../../../../libs/common/src/storybook/storybook-utils";
3
+ const config = {
4
+ stories: ['../**/*.@(mdx|stories.@(js|ts|tsx))'],
5
+ addons: ['@storybook/addon-essentials', '@storybook/addon-interactions', 'storybook-dark-mode'],
6
+ docs: {
7
+ defaultName: 'Documentation',
8
+ autodocs: 'tag'
9
+ },
10
+ framework: {
11
+ name: '@storybook/web-components-vite',
12
+ options: {}
13
+ },
14
+ // Async viteFinal to build dependent packages before finalizing configuration.
15
+ viteFinal: async (config) => {
16
+ const storyFiles = getStoryFiles(path.resolve(__dirname, '../'));
17
+ const usedPackages = detectUsedPackages(storyFiles);
18
+ const buildPromises = usedPackages.map(async (pkg) => {
19
+ try {
20
+ console.log(`Building package ${pkg}...`);
21
+ const { stdout, stderr } = await exec(`nx run ${pkg}:build`);
22
+ console.log(`Built package ${pkg}: ${stdout}`);
23
+ if (stderr) {
24
+ console.error(`Build warning/error for package ${pkg}: ${stderr}`);
25
+ }
26
+ }
27
+ catch (error) {
28
+ console.error(`Error building package ${pkg}:`, error);
29
+ }
30
+ });
31
+ await Promise.all(buildPromises);
32
+ const parsedPaths = parseTsConfig() || {};
33
+ const filteredParsedPaths = filterParsedPathsByUsedPackages(parsedPaths, usedPackages);
34
+ return Object.assign(Object.assign({}, config), { resolve: {
35
+ alias: Object.assign({}, filteredParsedPaths)
36
+ }, define: {
37
+ process: {
38
+ env: {}
39
+ }
40
+ } });
41
+ }
42
+ };
43
+ export default config;
@@ -0,0 +1,9 @@
1
+ import { themes } from "@storybook/theming";
2
+ export const parameters = {
3
+ darkMode: {
4
+ dark: Object.assign(Object.assign({}, themes.dark), { appBg: 'black' }),
5
+ light: Object.assign(Object.assign({}, themes.normal), { appBg: 'green' }),
6
+ current: 'light',
7
+ stylePreview: true
8
+ }
9
+ };
@@ -0,0 +1,39 @@
1
+ /// <reference types="node" />
2
+ import { exec as execCallback } from 'child_process';
3
+ export declare const exec: typeof execCallback.__promisify__;
4
+ /**
5
+ * Recursively retrieves all story files (.stories.ts/.stories.tsx) in a directory.
6
+ * @param dir The directory to search.
7
+ * @returns Array of story file paths.
8
+ */
9
+ export declare const getStoryFiles: (dir: string) => string[];
10
+ /**
11
+ * Detects which internal packages are used in the provided story files.
12
+ * It looks at every import that starts with the given package alias prefix,
13
+ * then extracts the package name (the segment immediately following the prefix).
14
+ *
15
+ * @param stories Array of story file paths.
16
+ * @returns Array of unique package names (e.g. ['foo', 'bar']).
17
+ */
18
+ export declare const detectUsedPackages: (stories: string[]) => string[];
19
+ /**
20
+ * Extracts all import paths from a file using the TypeScript compiler API.
21
+ * @param filePath The file path to parse.
22
+ * @returns Array of import strings.
23
+ */
24
+ export declare const extractImports: (filePath: string) => string[];
25
+ /**
26
+ * Parses the tsconfig paths and resolves them to absolute paths.
27
+ * @param tsconfigPath The path to the tsconfig file.
28
+ * @returns An object mapping alias keys to absolute paths.
29
+ */
30
+ export declare const parseTsConfig: () => Record<string, string> | null;
31
+ /**
32
+ * Filters the parsed tsconfig alias mapping to only include keys that correspond
33
+ * to the used packages.
34
+ *
35
+ * @param parsedPaths The full alias mapping from tsconfig.
36
+ * @param usedPackages Array of package names that are used (e.g. ['foo', 'bar']).
37
+ * @returns Filtered alias mapping.
38
+ */
39
+ export declare const filterParsedPathsByUsedPackages: (parsedPaths: Record<string, string>, usedPackages: string[]) => Record<string, string>;
@@ -0,0 +1,2 @@
1
+ import { Config } from '../../../../../../../../../../stencil-public-runtime';
2
+ export declare const config: Config;
@@ -0,0 +1,2 @@
1
+ import { Config } from '../../../../../../../../../../stencil-public-runtime';
2
+ export declare const config: Config;
@@ -0,0 +1,3 @@
1
+ import type { StorybookConfig } from '@storybook/web-components-vite';
2
+ declare const config: StorybookConfig;
3
+ export default config;
@@ -0,0 +1,70 @@
1
+ export declare const parameters: {
2
+ darkMode: {
3
+ dark: {
4
+ appBg: string;
5
+ base: "light" | "dark";
6
+ colorPrimary: string;
7
+ colorSecondary: string;
8
+ appContentBg: string;
9
+ appPreviewBg: string;
10
+ appBorderColor: string;
11
+ appBorderRadius: number;
12
+ fontBase: string;
13
+ fontCode: string;
14
+ textColor: string;
15
+ textInverseColor: string;
16
+ textMutedColor: string;
17
+ barTextColor: string;
18
+ barHoverColor: string;
19
+ barSelectedColor: string;
20
+ barBg: string;
21
+ buttonBg: string;
22
+ buttonBorder: string;
23
+ booleanBg: string;
24
+ booleanSelectedBg: string;
25
+ inputBg: string;
26
+ inputBorder: string;
27
+ inputTextColor: string;
28
+ inputBorderRadius: number;
29
+ brandTitle?: string;
30
+ brandUrl?: string;
31
+ brandImage?: string;
32
+ brandTarget?: string;
33
+ gridCellSize?: number;
34
+ };
35
+ light: {
36
+ appBg: string;
37
+ base: "light" | "dark";
38
+ colorPrimary: string;
39
+ colorSecondary: string;
40
+ appContentBg: string;
41
+ appPreviewBg: string;
42
+ appBorderColor: string;
43
+ appBorderRadius: number;
44
+ fontBase: string;
45
+ fontCode: string;
46
+ textColor: string;
47
+ textInverseColor: string;
48
+ textMutedColor: string;
49
+ barTextColor: string;
50
+ barHoverColor: string;
51
+ barSelectedColor: string;
52
+ barBg: string;
53
+ buttonBg: string;
54
+ buttonBorder: string;
55
+ booleanBg: string;
56
+ booleanSelectedBg: string;
57
+ inputBg: string;
58
+ inputBorder: string;
59
+ inputTextColor: string;
60
+ inputBorderRadius: number;
61
+ brandTitle?: string;
62
+ brandUrl?: string;
63
+ brandImage?: string;
64
+ brandTarget?: string;
65
+ gridCellSize?: number;
66
+ };
67
+ current: string;
68
+ stylePreview: boolean;
69
+ };
70
+ };
@@ -0,0 +1,4 @@
1
+ export * from "./vite-chunk-plugin";
2
+ export * from "./stencil-clean-deps-plugin";
3
+ export * from "./vite-clean-deps-plugin";
4
+ export * from "./lazy-load-chunk-plugin";
@@ -0,0 +1,12 @@
1
+ export declare const lazyLoadChunkPlugin: () => {
2
+ name: string;
3
+ config(config: any): {
4
+ build: {
5
+ rollupOptions: {
6
+ output: {
7
+ manualChunks(id: any): any;
8
+ };
9
+ };
10
+ };
11
+ };
12
+ };
@@ -0,0 +1,5 @@
1
+ export declare function cleanPackageJsonStencil(): {
2
+ name: string;
3
+ apply: string;
4
+ buildEnd(): void;
5
+ };
@@ -0,0 +1,6 @@
1
+ export declare function viteChunkPlugin(): {
2
+ name: string;
3
+ config(config: any, { command }: {
4
+ command: any;
5
+ }): void;
6
+ };
@@ -0,0 +1,4 @@
1
+ export declare function cleanPackageJsonVite(widgetName: any): {
2
+ name: string;
3
+ closeBundle(): void;
4
+ };
@@ -0,0 +1 @@
1
+ export { LotteryOrderSummary } from './lottery-order-summary';
@@ -0,0 +1,87 @@
1
+ import { EventEmitter } from '../../stencil-public-runtime';
2
+ import { TicketSubmitParam } from '../../model/index';
3
+ import "../../../../../../dist/packages/stencil/lottery-button/dist/types/index";
4
+ export declare class LotteryOrderSummary {
5
+ /**
6
+ * Endpoint URL for the source of data
7
+ */
8
+ endpoint: string;
9
+ /**
10
+ * GIC Session
11
+ */
12
+ sessionId: string;
13
+ /**
14
+ * Client custom styling via message bus
15
+ */
16
+ mbSource: string;
17
+ /**
18
+ * Client custom styling via string
19
+ */
20
+ clientStyling: string;
21
+ /**
22
+ * Client custom styling via css file url
23
+ */
24
+ clientStylingUrl: string;
25
+ /**
26
+ * Client custom language for translation
27
+ */
28
+ language: string;
29
+ /**
30
+ * Title of the order summary
31
+ */
32
+ orderSummaryTitle: string;
33
+ /**
34
+ * Label for the tickets row
35
+ */
36
+ ticketsLabel: string;
37
+ /**
38
+ * Label for the total row
39
+ */
40
+ totalLabel: string;
41
+ /**
42
+ * Whether to show a colon after labels
43
+ */
44
+ showColon: boolean;
45
+ /**
46
+ * Whether to show divider
47
+ */
48
+ showDivider: boolean;
49
+ /**
50
+ * Whether the submit button is disabled
51
+ */
52
+ submitDisabled: boolean;
53
+ /**
54
+ * Text to display on the submit button
55
+ */
56
+ submitButtonText: string;
57
+ /**
58
+ * Emitted when the submit button is clicked
59
+ */
60
+ orderSummarySubmit: EventEmitter;
61
+ /**
62
+ * Emitted when a ticket is successfully submitted
63
+ */
64
+ submitSuccess: EventEmitter<any>;
65
+ /**
66
+ * Emitted when a ticket submission fails
67
+ */
68
+ submitError: EventEmitter<any>;
69
+ /**
70
+ * Emitted when the player's session is expired
71
+ */
72
+ sessionExpired: EventEmitter<void>;
73
+ submitLoading: boolean;
74
+ private stylingContainer;
75
+ private stylingSubscription;
76
+ handleClientStylingChange(newValue: any, oldValue: any): void;
77
+ handleClientStylingUrlChange(newValue: any, oldValue: any): void;
78
+ handleMbSourceChange(newValue: any, oldValue: any): void;
79
+ componentDidLoad(): void;
80
+ disconnectedCallback(): void;
81
+ handleLotteryTicketParamsReady(event: CustomEvent): void;
82
+ private isValidTicketSubmitParam;
83
+ private isValidTicketParam;
84
+ handleSubmitTickets(body: TicketSubmitParam): Promise<void>;
85
+ handleSubmit(): void;
86
+ render(): any;
87
+ }
@@ -0,0 +1,175 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ /**
4
+ * This is an autogenerated file created by the Stencil compiler.
5
+ * It contains typing information for all components that exist in this project.
6
+ */
7
+ import { HTMLStencilElement, JSXBase } from "./stencil-public-runtime";
8
+ export namespace Components {
9
+ interface LotteryOrderSummary {
10
+ /**
11
+ * Client custom styling via string
12
+ */
13
+ "clientStyling": string;
14
+ /**
15
+ * Client custom styling via css file url
16
+ */
17
+ "clientStylingUrl": string;
18
+ /**
19
+ * Endpoint URL for the source of data
20
+ */
21
+ "endpoint": string;
22
+ /**
23
+ * Client custom language for translation
24
+ */
25
+ "language": string;
26
+ /**
27
+ * Client custom styling via message bus
28
+ */
29
+ "mbSource": string;
30
+ /**
31
+ * Title of the order summary
32
+ */
33
+ "orderSummaryTitle": string;
34
+ /**
35
+ * GIC Session
36
+ */
37
+ "sessionId": string;
38
+ /**
39
+ * Whether to show a colon after labels
40
+ */
41
+ "showColon": boolean;
42
+ /**
43
+ * Whether to show divider
44
+ */
45
+ "showDivider": boolean;
46
+ /**
47
+ * Text to display on the submit button
48
+ */
49
+ "submitButtonText": string;
50
+ /**
51
+ * Whether the submit button is disabled
52
+ */
53
+ "submitDisabled": boolean;
54
+ /**
55
+ * Label for the tickets row
56
+ */
57
+ "ticketsLabel": string;
58
+ /**
59
+ * Label for the total row
60
+ */
61
+ "totalLabel": string;
62
+ }
63
+ }
64
+ export interface LotteryOrderSummaryCustomEvent<T> extends CustomEvent<T> {
65
+ detail: T;
66
+ target: HTMLLotteryOrderSummaryElement;
67
+ }
68
+ declare global {
69
+ interface HTMLLotteryOrderSummaryElementEventMap {
70
+ "orderSummarySubmit": any;
71
+ "lotteryTicketSubmitSuccess": any;
72
+ "lotteryTicketSubmitError": any;
73
+ "sessionExpired": void;
74
+ }
75
+ interface HTMLLotteryOrderSummaryElement extends Components.LotteryOrderSummary, HTMLStencilElement {
76
+ addEventListener<K extends keyof HTMLLotteryOrderSummaryElementEventMap>(type: K, listener: (this: HTMLLotteryOrderSummaryElement, ev: LotteryOrderSummaryCustomEvent<HTMLLotteryOrderSummaryElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
77
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
78
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
79
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
80
+ removeEventListener<K extends keyof HTMLLotteryOrderSummaryElementEventMap>(type: K, listener: (this: HTMLLotteryOrderSummaryElement, ev: LotteryOrderSummaryCustomEvent<HTMLLotteryOrderSummaryElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
81
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
82
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
83
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
84
+ }
85
+ var HTMLLotteryOrderSummaryElement: {
86
+ prototype: HTMLLotteryOrderSummaryElement;
87
+ new (): HTMLLotteryOrderSummaryElement;
88
+ };
89
+ interface HTMLElementTagNameMap {
90
+ "lottery-order-summary": HTMLLotteryOrderSummaryElement;
91
+ }
92
+ }
93
+ declare namespace LocalJSX {
94
+ interface LotteryOrderSummary {
95
+ /**
96
+ * Client custom styling via string
97
+ */
98
+ "clientStyling"?: string;
99
+ /**
100
+ * Client custom styling via css file url
101
+ */
102
+ "clientStylingUrl"?: string;
103
+ /**
104
+ * Endpoint URL for the source of data
105
+ */
106
+ "endpoint"?: string;
107
+ /**
108
+ * Client custom language for translation
109
+ */
110
+ "language"?: string;
111
+ /**
112
+ * Client custom styling via message bus
113
+ */
114
+ "mbSource"?: string;
115
+ /**
116
+ * Emitted when a ticket submission fails
117
+ */
118
+ "onLotteryTicketSubmitError"?: (event: LotteryOrderSummaryCustomEvent<any>) => void;
119
+ /**
120
+ * Emitted when a ticket is successfully submitted
121
+ */
122
+ "onLotteryTicketSubmitSuccess"?: (event: LotteryOrderSummaryCustomEvent<any>) => void;
123
+ /**
124
+ * Emitted when the submit button is clicked
125
+ */
126
+ "onOrderSummarySubmit"?: (event: LotteryOrderSummaryCustomEvent<any>) => void;
127
+ /**
128
+ * Emitted when the player's session is expired
129
+ */
130
+ "onSessionExpired"?: (event: LotteryOrderSummaryCustomEvent<void>) => void;
131
+ /**
132
+ * Title of the order summary
133
+ */
134
+ "orderSummaryTitle"?: string;
135
+ /**
136
+ * GIC Session
137
+ */
138
+ "sessionId"?: string;
139
+ /**
140
+ * Whether to show a colon after labels
141
+ */
142
+ "showColon"?: boolean;
143
+ /**
144
+ * Whether to show divider
145
+ */
146
+ "showDivider"?: boolean;
147
+ /**
148
+ * Text to display on the submit button
149
+ */
150
+ "submitButtonText"?: string;
151
+ /**
152
+ * Whether the submit button is disabled
153
+ */
154
+ "submitDisabled"?: boolean;
155
+ /**
156
+ * Label for the tickets row
157
+ */
158
+ "ticketsLabel"?: string;
159
+ /**
160
+ * Label for the total row
161
+ */
162
+ "totalLabel"?: string;
163
+ }
164
+ interface IntrinsicElements {
165
+ "lottery-order-summary": LotteryOrderSummary;
166
+ }
167
+ }
168
+ export { LocalJSX as JSX };
169
+ declare module "@stencil/core" {
170
+ export namespace JSX {
171
+ interface IntrinsicElements {
172
+ "lottery-order-summary": LocalJSX.LotteryOrderSummary & JSXBase.HTMLAttributes<HTMLLotteryOrderSummaryElement>;
173
+ }
174
+ }
175
+ }
@@ -0,0 +1 @@
1
+ export * from './components/lottery-order-summary';
@@ -0,0 +1,34 @@
1
+ export interface TicketSelection {
2
+ betName: string;
3
+ betType: string;
4
+ quickPick: boolean;
5
+ selections?: Array<number>;
6
+ poolGameSelections?: Array<TicketSelection>;
7
+ stake: number;
8
+ }
9
+ export interface TicketParam {
10
+ amount: string;
11
+ currency: string;
12
+ drawCount: number;
13
+ gameId: string;
14
+ gameName: string;
15
+ multiplier: string;
16
+ multiplierNum: number;
17
+ quickPick: boolean;
18
+ selection: Array<TicketSelection>;
19
+ }
20
+ export interface TicketSubmitParam {
21
+ playerId: string;
22
+ tickets: Array<TicketParam>;
23
+ }
24
+ export declare enum TicketStatus {
25
+ PURCHASED = "Purchased",
26
+ SETTLED = "Settled",
27
+ CANCELED = "Canceled",
28
+ ERROR = "Error"
29
+ }
30
+ export interface TicketErrorResponse {
31
+ dataOrigin: any;
32
+ message: string;
33
+ status: number;
34
+ }