@growsober/sdk 1.0.5 → 1.0.8

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 (70) hide show
  1. package/dist/__tests__/e2e.test.d.ts +30 -0
  2. package/dist/__tests__/e2e.test.js +959 -63
  3. package/dist/api/mutations/badges.d.ts +116 -0
  4. package/dist/api/mutations/badges.js +177 -0
  5. package/dist/api/mutations/brands.d.ts +251 -0
  6. package/dist/api/mutations/brands.js +242 -0
  7. package/dist/api/mutations/creators.d.ts +131 -0
  8. package/dist/api/mutations/creators.js +129 -0
  9. package/dist/api/mutations/event-chat.d.ts +2 -2
  10. package/dist/api/mutations/event-chat.js +9 -9
  11. package/dist/api/mutations/index.d.ts +4 -0
  12. package/dist/api/mutations/index.js +5 -1
  13. package/dist/api/mutations/jack.d.ts +29 -0
  14. package/dist/api/mutations/jack.js +41 -1
  15. package/dist/api/mutations/products.d.ts +175 -0
  16. package/dist/api/mutations/products.js +226 -0
  17. package/dist/api/mutations/support.d.ts +20 -1
  18. package/dist/api/mutations/support.js +36 -1
  19. package/dist/api/queries/badges.d.ts +221 -0
  20. package/dist/api/queries/badges.js +290 -0
  21. package/dist/api/queries/bookings.d.ts +1 -1
  22. package/dist/api/queries/brands.d.ts +248 -0
  23. package/dist/api/queries/brands.js +226 -0
  24. package/dist/api/queries/businesses.d.ts +61 -1
  25. package/dist/api/queries/businesses.js +27 -1
  26. package/dist/api/queries/creators.d.ts +332 -0
  27. package/dist/api/queries/creators.js +249 -0
  28. package/dist/api/queries/event-chat.d.ts +1 -1
  29. package/dist/api/queries/event-chat.js +4 -4
  30. package/dist/api/queries/events.d.ts +45 -0
  31. package/dist/api/queries/index.d.ts +5 -0
  32. package/dist/api/queries/index.js +6 -1
  33. package/dist/api/queries/jack.d.ts +80 -0
  34. package/dist/api/queries/jack.js +98 -1
  35. package/dist/api/queries/library.d.ts +8 -0
  36. package/dist/api/queries/products.d.ts +185 -0
  37. package/dist/api/queries/products.js +203 -0
  38. package/dist/api/queries/support.d.ts +46 -1
  39. package/dist/api/queries/support.js +48 -1
  40. package/dist/api/queries/venues.d.ts +304 -0
  41. package/dist/api/queries/venues.js +211 -0
  42. package/dist/api/types.d.ts +245 -0
  43. package/dist/api/types.js +6 -1
  44. package/dist/api/utils/eventGrouping.d.ts +104 -0
  45. package/dist/api/utils/eventGrouping.js +155 -0
  46. package/dist/index.d.ts +1 -0
  47. package/dist/index.js +5 -1
  48. package/package.json +5 -2
  49. package/src/__tests__/e2e.test.ts +996 -64
  50. package/src/api/mutations/badges.ts +228 -0
  51. package/src/api/mutations/brands.ts +376 -0
  52. package/src/api/mutations/creators.ts +171 -0
  53. package/src/api/mutations/event-chat.ts +8 -8
  54. package/src/api/mutations/index.ts +4 -0
  55. package/src/api/mutations/jack.ts +50 -1
  56. package/src/api/mutations/products.ts +336 -0
  57. package/src/api/mutations/support.ts +44 -0
  58. package/src/api/queries/badges.ts +385 -0
  59. package/src/api/queries/brands.ts +281 -0
  60. package/src/api/queries/businesses.ts +30 -1
  61. package/src/api/queries/creators.ts +308 -0
  62. package/src/api/queries/event-chat.ts +3 -3
  63. package/src/api/queries/index.ts +5 -0
  64. package/src/api/queries/jack.ts +139 -1
  65. package/src/api/queries/products.ts +312 -0
  66. package/src/api/queries/support.ts +54 -0
  67. package/src/api/queries/venues.ts +271 -0
  68. package/src/api/types.ts +317 -1
  69. package/src/api/utils/eventGrouping.ts +181 -0
  70. package/src/index.ts +6 -0
@@ -0,0 +1,185 @@
1
+ import { UseQueryOptions } from '@tanstack/react-query';
2
+ export type ProductType = 'SESSION_1ON1' | 'SESSION_GROUP' | 'PACKAGE' | 'WORKSHOP' | 'CONSULTATION';
3
+ export type DeliveryMethod = 'VIDEO_CALL' | 'PHONE_CALL' | 'IN_PERSON' | 'HYBRID';
4
+ export type BookingStatus = 'PENDING' | 'CONFIRMED' | 'CANCELLED' | 'COMPLETED';
5
+ export type PaymentStatus = 'PENDING' | 'PAID' | 'REFUNDED' | 'FAILED';
6
+ export interface CreatorProductResponse {
7
+ id: string;
8
+ creatorId: string;
9
+ title: string;
10
+ slug: string;
11
+ description: string | null;
12
+ imageUrl: string | null;
13
+ type: ProductType;
14
+ price: number;
15
+ currency: string;
16
+ durationMinutes: number;
17
+ maxParticipants: number;
18
+ deliveryMethod: DeliveryMethod;
19
+ locationDetails: string | null;
20
+ isActive: boolean;
21
+ isFeatured: boolean;
22
+ createdAt: string;
23
+ updatedAt: string;
24
+ creator?: {
25
+ id: string;
26
+ displayName: string;
27
+ slug: string;
28
+ avatarUrl: string | null;
29
+ specialties?: string[];
30
+ certifications?: string[];
31
+ };
32
+ }
33
+ export interface ProductBookingResponse {
34
+ id: string;
35
+ productId: string;
36
+ userId: string;
37
+ scheduledAt: string;
38
+ timezone: string;
39
+ status: BookingStatus;
40
+ paymentStatus: PaymentStatus | null;
41
+ stripePaymentIntentId: string | null;
42
+ amountPaid: number | null;
43
+ currency: string;
44
+ clientNotes: string | null;
45
+ creatorNotes: string | null;
46
+ meetingLink: string | null;
47
+ isCompleted: boolean;
48
+ completedAt: string | null;
49
+ isCancelled: boolean;
50
+ cancelledAt: string | null;
51
+ cancelledBy: string | null;
52
+ cancellationReason: string | null;
53
+ createdAt: string;
54
+ updatedAt: string;
55
+ product?: CreatorProductResponse;
56
+ user?: {
57
+ id: string;
58
+ name: string;
59
+ profileImage: string | null;
60
+ email: string;
61
+ };
62
+ }
63
+ export interface ProductFilters {
64
+ page?: number;
65
+ limit?: number;
66
+ type?: ProductType;
67
+ deliveryMethod?: DeliveryMethod;
68
+ minPrice?: number;
69
+ maxPrice?: number;
70
+ isActive?: boolean;
71
+ }
72
+ export interface PaginatedProductsResponse {
73
+ products: CreatorProductResponse[];
74
+ meta: {
75
+ total: number;
76
+ page: number;
77
+ limit: number;
78
+ totalPages: number;
79
+ };
80
+ }
81
+ export declare const productKeys: {
82
+ all: readonly ["products"];
83
+ lists: () => readonly ["products", "list"];
84
+ list: (filters?: ProductFilters) => readonly ["products", "list", ProductFilters | undefined];
85
+ details: () => readonly ["products", "detail"];
86
+ detail: (id: string) => readonly ["products", "detail", string];
87
+ slug: (slug: string) => readonly ["products", "slug", string];
88
+ byCreator: (creatorId: string, filters?: ProductFilters) => readonly ["products", "creator", string, ProductFilters | undefined];
89
+ bookings: () => readonly ["products", "bookings"];
90
+ myBookings: () => readonly ["products", "bookings", "me"];
91
+ creatorBookings: (creatorId: string) => readonly ["products", "bookings", "creator", string];
92
+ bookingDetail: (bookingId: string) => readonly ["products", "bookings", "detail", string];
93
+ };
94
+ /**
95
+ * Get paginated list of all active products
96
+ *
97
+ * @param filters - Query parameters for filtering and pagination
98
+ * @param options - TanStack Query options
99
+ *
100
+ * @example
101
+ * ```tsx
102
+ * const { data, isLoading } = useProducts({
103
+ * page: 1,
104
+ * limit: 20,
105
+ * type: 'SESSION_1ON1',
106
+ * });
107
+ * ```
108
+ */
109
+ export declare function useProducts(filters?: ProductFilters, options?: Omit<UseQueryOptions<PaginatedProductsResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedProductsResponse, Error>;
110
+ /**
111
+ * Get a single product by ID
112
+ *
113
+ * @param id - Product ID
114
+ * @param options - TanStack Query options
115
+ *
116
+ * @example
117
+ * ```tsx
118
+ * const { data, isLoading } = useProduct('product-123');
119
+ * ```
120
+ */
121
+ export declare function useProduct(id: string, options?: Omit<UseQueryOptions<CreatorProductResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<CreatorProductResponse, Error>;
122
+ /**
123
+ * Get a product by its slug
124
+ *
125
+ * @param slug - Product slug
126
+ * @param options - TanStack Query options
127
+ *
128
+ * @example
129
+ * ```tsx
130
+ * const { data, isLoading } = useProductBySlug('1-on-1-coaching-abc123');
131
+ * ```
132
+ */
133
+ export declare function useProductBySlug(slug: string, options?: Omit<UseQueryOptions<CreatorProductResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<CreatorProductResponse, Error>;
134
+ /**
135
+ * Get products for a specific creator
136
+ *
137
+ * @param creatorId - Creator ID
138
+ * @param filters - Query parameters for filtering
139
+ * @param options - TanStack Query options
140
+ *
141
+ * @example
142
+ * ```tsx
143
+ * const { data, isLoading } = useCreatorProducts('creator-123', {
144
+ * type: 'SESSION_1ON1',
145
+ * isActive: true,
146
+ * });
147
+ * ```
148
+ */
149
+ export declare function useCreatorProducts(creatorId: string, filters?: ProductFilters, options?: Omit<UseQueryOptions<PaginatedProductsResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedProductsResponse, Error>;
150
+ /**
151
+ * Get current user's product bookings
152
+ *
153
+ * @param options - TanStack Query options
154
+ *
155
+ * @example
156
+ * ```tsx
157
+ * const { data, isLoading } = useMyProductBookings();
158
+ * ```
159
+ */
160
+ export declare function useMyProductBookings(options?: Omit<UseQueryOptions<ProductBookingResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<ProductBookingResponse[], Error>;
161
+ /**
162
+ * Get a single product booking by ID
163
+ *
164
+ * @param bookingId - Booking ID
165
+ * @param options - TanStack Query options
166
+ *
167
+ * @example
168
+ * ```tsx
169
+ * const { data, isLoading } = useProductBooking('booking-123');
170
+ * ```
171
+ */
172
+ export declare function useProductBooking(bookingId: string, options?: Omit<UseQueryOptions<ProductBookingResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<ProductBookingResponse, Error>;
173
+ /**
174
+ * Get bookings for a creator's products (creator dashboard)
175
+ *
176
+ * @param creatorId - Creator ID
177
+ * @param options - TanStack Query options
178
+ *
179
+ * @example
180
+ * ```tsx
181
+ * // For creator dashboard - see all bookings for their products
182
+ * const { data, isLoading } = useCreatorBookings('creator-123');
183
+ * ```
184
+ */
185
+ export declare function useCreatorBookings(creatorId: string, options?: Omit<UseQueryOptions<ProductBookingResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<ProductBookingResponse[], Error>;
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.productKeys = void 0;
4
+ exports.useProducts = useProducts;
5
+ exports.useProduct = useProduct;
6
+ exports.useProductBySlug = useProductBySlug;
7
+ exports.useCreatorProducts = useCreatorProducts;
8
+ exports.useMyProductBookings = useMyProductBookings;
9
+ exports.useProductBooking = useProductBooking;
10
+ exports.useCreatorBookings = useCreatorBookings;
11
+ const react_query_1 = require("@tanstack/react-query");
12
+ const client_1 = require("../client");
13
+ // ============================================================================
14
+ // QUERY KEY FACTORY
15
+ // ============================================================================
16
+ exports.productKeys = {
17
+ all: ['products'],
18
+ lists: () => [...exports.productKeys.all, 'list'],
19
+ list: (filters) => [...exports.productKeys.lists(), filters],
20
+ details: () => [...exports.productKeys.all, 'detail'],
21
+ detail: (id) => [...exports.productKeys.details(), id],
22
+ slug: (slug) => [...exports.productKeys.all, 'slug', slug],
23
+ byCreator: (creatorId, filters) => [...exports.productKeys.all, 'creator', creatorId, filters],
24
+ bookings: () => [...exports.productKeys.all, 'bookings'],
25
+ myBookings: () => [...exports.productKeys.bookings(), 'me'],
26
+ creatorBookings: (creatorId) => [...exports.productKeys.bookings(), 'creator', creatorId],
27
+ bookingDetail: (bookingId) => [...exports.productKeys.bookings(), 'detail', bookingId],
28
+ };
29
+ // ============================================================================
30
+ // QUERY HOOKS
31
+ // ============================================================================
32
+ /**
33
+ * Get paginated list of all active products
34
+ *
35
+ * @param filters - Query parameters for filtering and pagination
36
+ * @param options - TanStack Query options
37
+ *
38
+ * @example
39
+ * ```tsx
40
+ * const { data, isLoading } = useProducts({
41
+ * page: 1,
42
+ * limit: 20,
43
+ * type: 'SESSION_1ON1',
44
+ * });
45
+ * ```
46
+ */
47
+ function useProducts(filters, options) {
48
+ return (0, react_query_1.useQuery)({
49
+ queryKey: exports.productKeys.list(filters),
50
+ queryFn: async () => {
51
+ const client = (0, client_1.getApiClient)();
52
+ const response = await client.get('/api/v1/products', {
53
+ params: filters,
54
+ });
55
+ return response.data;
56
+ },
57
+ ...options,
58
+ });
59
+ }
60
+ /**
61
+ * Get a single product by ID
62
+ *
63
+ * @param id - Product ID
64
+ * @param options - TanStack Query options
65
+ *
66
+ * @example
67
+ * ```tsx
68
+ * const { data, isLoading } = useProduct('product-123');
69
+ * ```
70
+ */
71
+ function useProduct(id, options) {
72
+ return (0, react_query_1.useQuery)({
73
+ queryKey: exports.productKeys.detail(id),
74
+ queryFn: async () => {
75
+ const client = (0, client_1.getApiClient)();
76
+ const response = await client.get(`/api/v1/products/${id}`);
77
+ return response.data;
78
+ },
79
+ enabled: !!id,
80
+ ...options,
81
+ });
82
+ }
83
+ /**
84
+ * Get a product by its slug
85
+ *
86
+ * @param slug - Product slug
87
+ * @param options - TanStack Query options
88
+ *
89
+ * @example
90
+ * ```tsx
91
+ * const { data, isLoading } = useProductBySlug('1-on-1-coaching-abc123');
92
+ * ```
93
+ */
94
+ function useProductBySlug(slug, options) {
95
+ return (0, react_query_1.useQuery)({
96
+ queryKey: exports.productKeys.slug(slug),
97
+ queryFn: async () => {
98
+ const client = (0, client_1.getApiClient)();
99
+ const response = await client.get(`/api/v1/products/slug/${slug}`);
100
+ return response.data;
101
+ },
102
+ enabled: !!slug,
103
+ ...options,
104
+ });
105
+ }
106
+ /**
107
+ * Get products for a specific creator
108
+ *
109
+ * @param creatorId - Creator ID
110
+ * @param filters - Query parameters for filtering
111
+ * @param options - TanStack Query options
112
+ *
113
+ * @example
114
+ * ```tsx
115
+ * const { data, isLoading } = useCreatorProducts('creator-123', {
116
+ * type: 'SESSION_1ON1',
117
+ * isActive: true,
118
+ * });
119
+ * ```
120
+ */
121
+ function useCreatorProducts(creatorId, filters, options) {
122
+ return (0, react_query_1.useQuery)({
123
+ queryKey: exports.productKeys.byCreator(creatorId, filters),
124
+ queryFn: async () => {
125
+ const client = (0, client_1.getApiClient)();
126
+ const response = await client.get(`/api/v1/creators/${creatorId}/products`, {
127
+ params: filters,
128
+ });
129
+ return response.data;
130
+ },
131
+ enabled: !!creatorId,
132
+ ...options,
133
+ });
134
+ }
135
+ /**
136
+ * Get current user's product bookings
137
+ *
138
+ * @param options - TanStack Query options
139
+ *
140
+ * @example
141
+ * ```tsx
142
+ * const { data, isLoading } = useMyProductBookings();
143
+ * ```
144
+ */
145
+ function useMyProductBookings(options) {
146
+ return (0, react_query_1.useQuery)({
147
+ queryKey: exports.productKeys.myBookings(),
148
+ queryFn: async () => {
149
+ const client = (0, client_1.getApiClient)();
150
+ const response = await client.get('/api/v1/users/me/product-bookings');
151
+ return response.data;
152
+ },
153
+ ...options,
154
+ });
155
+ }
156
+ /**
157
+ * Get a single product booking by ID
158
+ *
159
+ * @param bookingId - Booking ID
160
+ * @param options - TanStack Query options
161
+ *
162
+ * @example
163
+ * ```tsx
164
+ * const { data, isLoading } = useProductBooking('booking-123');
165
+ * ```
166
+ */
167
+ function useProductBooking(bookingId, options) {
168
+ return (0, react_query_1.useQuery)({
169
+ queryKey: exports.productKeys.bookingDetail(bookingId),
170
+ queryFn: async () => {
171
+ const client = (0, client_1.getApiClient)();
172
+ const response = await client.get(`/api/v1/users/me/product-bookings/${bookingId}`);
173
+ return response.data;
174
+ },
175
+ enabled: !!bookingId,
176
+ ...options,
177
+ });
178
+ }
179
+ /**
180
+ * Get bookings for a creator's products (creator dashboard)
181
+ *
182
+ * @param creatorId - Creator ID
183
+ * @param options - TanStack Query options
184
+ *
185
+ * @example
186
+ * ```tsx
187
+ * // For creator dashboard - see all bookings for their products
188
+ * const { data, isLoading } = useCreatorBookings('creator-123');
189
+ * ```
190
+ */
191
+ function useCreatorBookings(creatorId, options) {
192
+ return (0, react_query_1.useQuery)({
193
+ queryKey: exports.productKeys.creatorBookings(creatorId),
194
+ queryFn: async () => {
195
+ const client = (0, client_1.getApiClient)();
196
+ const response = await client.get(`/api/v1/creators/${creatorId}/products/bookings`);
197
+ return response.data;
198
+ },
199
+ enabled: !!creatorId,
200
+ ...options,
201
+ });
202
+ }
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3F1ZXJpZXMvcHJvZHVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaUlBLGtDQWVDO0FBYUQsZ0NBY0M7QUFhRCw0Q0FjQztBQWlCRCxnREFpQkM7QUFZRCxvREFZQztBQWFELDhDQWNDO0FBY0QsZ0RBY0M7QUF2VEQsdURBQWtFO0FBQ2xFLHNDQUF5QztBQTBGekMsK0VBQStFO0FBQy9FLG9CQUFvQjtBQUNwQiwrRUFBK0U7QUFFbEUsUUFBQSxXQUFXLEdBQUc7SUFDekIsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFVO0lBQzFCLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsbUJBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFVO0lBQ2xELElBQUksRUFBRSxDQUFDLE9BQXdCLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxtQkFBVyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBVTtJQUM5RSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLG1CQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBVTtJQUN0RCxNQUFNLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxtQkFBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBVTtJQUMvRCxJQUFJLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxtQkFBVyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFVO0lBQ25FLFNBQVMsRUFBRSxDQUFDLFNBQWlCLEVBQUUsT0FBd0IsRUFBRSxFQUFFLENBQ3pELENBQUMsR0FBRyxtQkFBVyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVTtJQUM5RCxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLG1CQUFXLENB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O0dBV0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsU0FBaUIsRUFDakIsT0FBaUY7SUFFakYsT0FBTyxJQUFBLHNCQUFRLEVBQUM7UUFDZCxRQUFRLEVBQUUsbUJBQVcsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO1FBQ2hELE9BQU8sRUFBRSxLQUFLLElBQXVDLEVBQUU7WUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLG9CQUFvQixTQUFTLG9CQUFvQixDQUFDLENBQUM7WUFDckYsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVM7UUFDcEIsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVF1ZXJ5LCBVc2VRdWVyeU9wdGlvbnMgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgUHJvZHVjdFR5cGUgPSAnU0VTU0lPTl8xT04xJyB8ICdTRVNTSU9OX0dST1VQJyB8ICdQQUNLQUdFJyB8ICdXT1JLU0hPUCcgfCAnQ09OU1VMVEFUSU9OJztcbmV4cG9ydCB0eXBlIERlbGl2ZXJ5TWV0aG9kID0gJ1ZJREVPX0NBTEwnIHwgJ1BIT05FX0NBTEwnIHwgJ0lOX1BFUlNPTicgfCAnSFlCUklEJztcbmV4cG9ydCB0eXBlIEJvb2tpbmdTdGF0dXMgPSAnUEVORElORycgfCAnQ09ORklSTUVEJyB8ICdDQU5DRUxMRUQnIHwgJ0NPTVBMRVRFRCc7XG5leHBvcnQgdHlwZSBQYXltZW50U3RhdHVzID0gJ1BFTkRJTkcnIHwgJ1BBSUQnIHwgJ1JFRlVOREVEJyB8ICdGQUlMRUQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0b3JQcm9kdWN0UmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICBjcmVhdG9ySWQ6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgc2x1Zzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgaW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIHR5cGU6IFByb2R1Y3RUeXBlO1xuICBwcmljZTogbnVtYmVyO1xuICBjdXJyZW5jeTogc3RyaW5nO1xuICBkdXJhdGlvbk1pbnV0ZXM6IG51bWJlcjtcbiAgbWF4UGFydGljaXBhbnRzOiBudW1iZXI7XG4gIGRlbGl2ZXJ5TWV0aG9kOiBEZWxpdmVyeU1ldGhvZDtcbiAgbG9jYXRpb25EZXRhaWxzOiBzdHJpbmcgfCBudWxsO1xuICBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgaXNGZWF0dXJlZDogYm9vbGVhbjtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xuICBjcmVhdG9yPzoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgICBzbHVnOiBzdHJpbmc7XG4gICAgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIHNwZWNpYWx0aWVzPzogc3RyaW5nW107XG4gICAgY2VydGlmaWNhdGlvbnM/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0Qm9va2luZ1Jlc3BvbnNlIHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvZHVjdElkOiBzdHJpbmc7XG4gIHVzZXJJZDogc3RyaW5nO1xuICBzY2hlZHVsZWRBdDogc3RyaW5nO1xuICB0aW1lem9uZTogc3RyaW5nO1xuICBzdGF0dXM6IEJvb2tpbmdTdGF0dXM7XG4gIHBheW1lbnRTdGF0dXM6IFBheW1lbnRTdGF0dXMgfCBudWxsO1xuICBzdHJpcGVQYXltZW50SW50ZW50SWQ6IHN0cmluZyB8IG51bGw7XG4gIGFtb3VudFBhaWQ6IG51bWJlciB8IG51bGw7XG4gIGN1cnJlbmN5OiBzdHJpbmc7XG4gIGNsaWVudE5vdGVzOiBzdHJpbmcgfCBudWxsO1xuICBjcmVhdG9yTm90ZXM6IHN0cmluZyB8IG51bGw7XG4gIG1lZXRpbmdMaW5rOiBzdHJpbmcgfCBudWxsO1xuICBpc0NvbXBsZXRlZDogYm9vbGVhbjtcbiAgY29tcGxldGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGlzQ2FuY2VsbGVkOiBib29sZWFuO1xuICBjYW5jZWxsZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgY2FuY2VsbGVkQnk6IHN0cmluZyB8IG51bGw7XG4gIGNhbmNlbGxhdGlvblJlYXNvbjogc3RyaW5nIHwgbnVsbDtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xuICBwcm9kdWN0PzogQ3JlYXRvclByb2R1Y3RSZXNwb25zZTtcbiAgdXNlcj86IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBwcm9maWxlSW1hZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgZW1haWw6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0RmlsdGVycyB7XG4gIHBhZ2U/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xuICB0eXBlPzogUHJvZHVjdFR5cGU7XG4gIGRlbGl2ZXJ5TWV0aG9kPzogRGVsaXZlcnlNZXRob2Q7XG4gIG1pblByaWNlPzogbnVtYmVyO1xuICBtYXhQcmljZT86IG51bWJlcjtcbiAgaXNBY3RpdmU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlZFByb2R1Y3RzUmVzcG9uc2Uge1xuICBwcm9kdWN0czogQ3JlYXRvclByb2R1Y3RSZXNwb25zZVtdO1xuICBtZXRhOiB7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBwYWdlOiBudW1iZXI7XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICB0b3RhbFBhZ2VzOiBudW1iZXI7XG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEtFWSBGQUNUT1JZXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBwcm9kdWN0S2V5cyA9IHtcbiAgYWxsOiBbJ3Byb2R1Y3RzJ10gYXMgY29uc3QsXG4gIGxpc3RzOiAoKSA9PiBbLi4ucHJvZHVjdEtleXMuYWxsLCAnbGlzdCddIGFzIGNvbnN0LFxuICBsaXN0OiAoZmlsdGVycz86IFByb2R1Y3RGaWx0ZXJzKSA9PiBbLi4ucHJvZHVjdEtleXMubGlzdHMoKSwgZmlsdGVyc10gYXMgY29uc3QsXG4gIGRldGFpbHM6ICgpID0+IFsuLi5wcm9kdWN0S2V5cy5hbGwsICdkZXRhaWwnXSBhcyBjb25zdCxcbiAgZGV0YWlsOiAoaWQ6IHN0cmluZykgPT4gWy4uLnByb2R1Y3RLZXlzLmRldGFpbHMoKSwgaWRdIGFzIGNvbnN0LFxuICBzbHVnOiAoc2x1Zzogc3RyaW5nKSA9PiBbLi4ucHJvZHVjdEtleXMuYWxsLCAnc2x1ZycsIHNsdWddIGFzIGNvbnN0LFxuICBieUNyZWF0b3I6IChjcmVhdG9ySWQ6IHN0cmluZywgZmlsdGVycz86IFByb2R1Y3RGaWx0ZXJzKSA9PlxuICAgIFsuLi5wcm9kdWN0S2V5cy5hbGwsICdjcmVhdG9yJywgY3JlYXRvcklkLCBmaWx0ZXJzXSBhcyBjb25zdCxcbiAgYm9va2luZ3M6ICgpID0+IFsuLi5wcm9kdWN0S2V5cy5hbGwsICdib29raW5ncyddIGFzIGNvbnN0LFxuICBteUJvb2tpbmdzOiAoKSA9PiBbLi4ucHJvZHVjdEtleXMuYm9va2luZ3MoKSwgJ21lJ10gYXMgY29uc3QsXG4gIGNyZWF0b3JCb29raW5nczogKGNyZWF0b3JJZDogc3RyaW5nKSA9PiBbLi4ucHJvZHVjdEtleXMuYm9va2luZ3MoKSwgJ2NyZWF0b3InLCBjcmVhdG9ySWRdIGFzIGNvbnN0LFxuICBib29raW5nRGV0YWlsOiAoYm9va2luZ0lkOiBzdHJpbmcpID0+IFsuLi5wcm9kdWN0S2V5cy5ib29raW5ncygpLCAnZGV0YWlsJywgYm9va2luZ0lkXSBhcyBjb25zdCxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IHBhZ2luYXRlZCBsaXN0IG9mIGFsbCBhY3RpdmUgcHJvZHVjdHNcbiAqXG4gKiBAcGFyYW0gZmlsdGVycyAtIFF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvblxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZVByb2R1Y3RzKHtcbiAqICAgcGFnZTogMSxcbiAqICAgbGltaXQ6IDIwLFxuICogICB0eXBlOiAnU0VTU0lPTl8xT04xJyxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9kdWN0cyhcbiAgZmlsdGVycz86IFByb2R1Y3RGaWx0ZXJzLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8UGFnaW5hdGVkUHJvZHVjdHNSZXNwb25zZT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogcHJvZHVjdEtleXMubGlzdChmaWx0ZXJzKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxQYWdpbmF0ZWRQcm9kdWN0c1Jlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL2FwaS92MS9wcm9kdWN0cycsIHtcbiAgICAgICAgcGFyYW1zOiBmaWx0ZXJzLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBhIHNpbmdsZSBwcm9kdWN0IGJ5IElEXG4gKlxuICogQHBhcmFtIGlkIC0gUHJvZHVjdCBJRFxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZVByb2R1Y3QoJ3Byb2R1Y3QtMTIzJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVByb2R1Y3QoXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxDcmVhdG9yUHJvZHVjdFJlc3BvbnNlPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBwcm9kdWN0S2V5cy5kZXRhaWwoaWQpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPENyZWF0b3JQcm9kdWN0UmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KGAvYXBpL3YxL3Byb2R1Y3RzLyR7aWR9YCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIGVuYWJsZWQ6ICEhaWQsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGEgcHJvZHVjdCBieSBpdHMgc2x1Z1xuICpcbiAqIEBwYXJhbSBzbHVnIC0gUHJvZHVjdCBzbHVnXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlUHJvZHVjdEJ5U2x1ZygnMS1vbi0xLWNvYWNoaW5nLWFiYzEyMycpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9kdWN0QnlTbHVnKFxuICBzbHVnOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxDcmVhdG9yUHJvZHVjdFJlc3BvbnNlPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBwcm9kdWN0S2V5cy5zbHVnKHNsdWcpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPENyZWF0b3JQcm9kdWN0UmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KGAvYXBpL3YxL3Byb2R1Y3RzL3NsdWcvJHtzbHVnfWApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBlbmFibGVkOiAhIXNsdWcsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHByb2R1Y3RzIGZvciBhIHNwZWNpZmljIGNyZWF0b3JcbiAqXG4gKiBAcGFyYW0gY3JlYXRvcklkIC0gQ3JlYXRvciBJRFxuICogQHBhcmFtIGZpbHRlcnMgLSBRdWVyeSBwYXJhbWV0ZXJzIGZvciBmaWx0ZXJpbmdcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VDcmVhdG9yUHJvZHVjdHMoJ2NyZWF0b3ItMTIzJywge1xuICogICB0eXBlOiAnU0VTU0lPTl8xT04xJyxcbiAqICAgaXNBY3RpdmU6IHRydWUsXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ3JlYXRvclByb2R1Y3RzKFxuICBjcmVhdG9ySWQ6IHN0cmluZyxcbiAgZmlsdGVycz86IFByb2R1Y3RGaWx0ZXJzLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8UGFnaW5hdGVkUHJvZHVjdHNSZXNwb25zZT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogcHJvZHVjdEtleXMuYnlDcmVhdG9yKGNyZWF0b3JJZCwgZmlsdGVycyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8UGFnaW5hdGVkUHJvZHVjdHNSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoYC9hcGkvdjEvY3JlYXRvcnMvJHtjcmVhdG9ySWR9L3Byb2R1Y3RzYCwge1xuICAgICAgICBwYXJhbXM6IGZpbHRlcnMsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgZW5hYmxlZDogISFjcmVhdG9ySWQsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGN1cnJlbnQgdXNlcidzIHByb2R1Y3QgYm9va2luZ3NcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlTXlQcm9kdWN0Qm9va2luZ3MoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTXlQcm9kdWN0Qm9va2luZ3MoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxQcm9kdWN0Qm9va2luZ1Jlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHByb2R1Y3RLZXlzLm15Qm9va2luZ3MoKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxQcm9kdWN0Qm9va2luZ1Jlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL3VzZXJzL21lL3Byb2R1Y3QtYm9va2luZ3MnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGEgc2luZ2xlIHByb2R1Y3QgYm9va2luZyBieSBJRFxuICpcbiAqIEBwYXJhbSBib29raW5nSWQgLSBCb29raW5nIElEXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlUHJvZHVjdEJvb2tpbmcoJ2Jvb2tpbmctMTIzJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVByb2R1Y3RCb29raW5nKFxuICBib29raW5nSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFByb2R1Y3RCb29raW5nUmVzcG9uc2U+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHByb2R1Y3RLZXlzLmJvb2tpbmdEZXRhaWwoYm9va2luZ0lkKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxQcm9kdWN0Qm9va2luZ1Jlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldChgL2FwaS92MS91c2Vycy9tZS9wcm9kdWN0LWJvb2tpbmdzLyR7Ym9va2luZ0lkfWApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBlbmFibGVkOiAhIWJvb2tpbmdJZCxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgYm9va2luZ3MgZm9yIGEgY3JlYXRvcidzIHByb2R1Y3RzIChjcmVhdG9yIGRhc2hib2FyZClcbiAqXG4gKiBAcGFyYW0gY3JlYXRvcklkIC0gQ3JlYXRvciBJRFxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogLy8gRm9yIGNyZWF0b3IgZGFzaGJvYXJkIC0gc2VlIGFsbCBib29raW5ncyBmb3IgdGhlaXIgcHJvZHVjdHNcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VDcmVhdG9yQm9va2luZ3MoJ2NyZWF0b3ItMTIzJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNyZWF0b3JCb29raW5ncyhcbiAgY3JlYXRvcklkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxQcm9kdWN0Qm9va2luZ1Jlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHByb2R1Y3RLZXlzLmNyZWF0b3JCb29raW5ncyhjcmVhdG9ySWQpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFByb2R1Y3RCb29raW5nUmVzcG9uc2VbXT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoYC9hcGkvdjEvY3JlYXRvcnMvJHtjcmVhdG9ySWR9L3Byb2R1Y3RzL2Jvb2tpbmdzYCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIGVuYWJsZWQ6ICEhY3JlYXRvcklkLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuIl19
@@ -1,11 +1,13 @@
1
1
  import { UseQueryOptions } from '@tanstack/react-query';
2
- import type { CheckInResponse, CheckInStreakResponse, MoodLogResponse, WinResponse, HabitResponse, ReflectionResponse } from '../types';
2
+ import type { CheckInResponse, CheckInStreakResponse, MoodLogResponse, WinResponse, HabitResponse, ReflectionResponse, CravingLogResponse, CravingStatsResponse } from '../types';
3
3
  export declare const supportKeys: {
4
4
  all: readonly ["support"];
5
5
  checkIns: () => readonly ["support", "check-ins"];
6
6
  checkInToday: () => readonly ["support", "check-ins", "today"];
7
7
  checkInStreak: () => readonly ["support", "check-ins", "streak"];
8
8
  moodLogs: () => readonly ["support", "mood"];
9
+ cravings: () => readonly ["support", "cravings"];
10
+ cravingStats: (days?: number) => readonly ["support", "cravings", "stats", number | undefined];
9
11
  wins: () => readonly ["support", "wins"];
10
12
  winsByCategory: () => readonly ["support", "wins", "by-category"];
11
13
  habits: () => readonly ["support", "habits"];
@@ -184,3 +186,46 @@ export declare function useReflections(options?: Omit<UseQueryOptions<Reflection
184
186
  createdAt: string;
185
187
  updatedAt: string;
186
188
  }[], Error>;
189
+ /**
190
+ * Get user's craving logs
191
+ *
192
+ * @param options - TanStack Query options
193
+ *
194
+ * @example
195
+ * ```tsx
196
+ * const { data, isLoading } = useCravings();
197
+ * ```
198
+ */
199
+ export declare function useCravings(options?: Omit<UseQueryOptions<CravingLogResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
200
+ id: string;
201
+ userId: string;
202
+ intensity: number;
203
+ trigger?: Record<string, never>;
204
+ triggerType?: "STRESS" | "SOCIAL_PRESSURE" | "BOREDOM" | "EMOTIONAL" | "CELEBRATION" | "HABIT" | "PHYSICAL" | "ENVIRONMENT" | "OTHER";
205
+ notes?: Record<string, never>;
206
+ copingUsed: string[];
207
+ didResist?: Record<string, never>;
208
+ situation?: Record<string, never>;
209
+ mood?: Record<string, never>;
210
+ createdAt: string;
211
+ }[], Error>;
212
+ /**
213
+ * Get craving statistics for a given period
214
+ *
215
+ * @param days - Number of days to include (default: 30)
216
+ * @param options - TanStack Query options
217
+ *
218
+ * @example
219
+ * ```tsx
220
+ * const { data, isLoading } = useCravingStats(30);
221
+ * ```
222
+ */
223
+ export declare function useCravingStats(days?: number, options?: Omit<UseQueryOptions<CravingStatsResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
224
+ averageIntensity: number;
225
+ totalLogs: number;
226
+ timesResisted: number;
227
+ resistanceRate: number;
228
+ topTriggers: string[];
229
+ topCopingStrategies: string[];
230
+ intensityDistribution: Record<string, never>;
231
+ }, Error>;
@@ -9,6 +9,8 @@ exports.useWins = useWins;
9
9
  exports.useWinsByCategory = useWinsByCategory;
10
10
  exports.useHabits = useHabits;
11
11
  exports.useReflections = useReflections;
12
+ exports.useCravings = useCravings;
13
+ exports.useCravingStats = useCravingStats;
12
14
  const react_query_1 = require("@tanstack/react-query");
13
15
  const client_1 = require("../client");
14
16
  // ============================================================================
@@ -20,6 +22,8 @@ exports.supportKeys = {
20
22
  checkInToday: () => [...exports.supportKeys.checkIns(), 'today'],
21
23
  checkInStreak: () => [...exports.supportKeys.checkIns(), 'streak'],
22
24
  moodLogs: () => [...exports.supportKeys.all, 'mood'],
25
+ cravings: () => [...exports.supportKeys.all, 'cravings'],
26
+ cravingStats: (days) => [...exports.supportKeys.cravings(), 'stats', days],
23
27
  wins: () => [...exports.supportKeys.all, 'wins'],
24
28
  winsByCategory: () => [...exports.supportKeys.wins(), 'by-category'],
25
29
  habits: () => [...exports.supportKeys.all, 'habits'],
@@ -199,4 +203,47 @@ function useReflections(options) {
199
203
  ...options,
200
204
  });
201
205
  }
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcXVlcmllcy9zdXBwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW1EQSxrQ0FhQztBQVlELDBDQWFDO0FBWUQsNENBYUM7QUFZRCxrQ0FZQztBQVlELDBCQVlDO0FBWUQsOENBWUM7QUFZRCw4QkFZQztBQVlELHdDQVlDO0FBMU9ELHVEQUFrRTtBQUNsRSxzQ0FBeUM7QUFVekMsK0VBQStFO0FBQy9FLG9CQUFvQjtBQUNwQiwrRUFBK0U7QUFFbEUsUUFBQSxXQUFXLEdBQUc7SUFDekIsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFVO0lBQ3pCLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsbUJBQVcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFVO0lBQzFELFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsbUJBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLENBQVU7SUFDakUsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxtQkFBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBVTtJQUNuRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLG1CQUFXLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBVTtJQUNyRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLG1CQUFXLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBVTtJQUNqRCxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLG1CQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsYUFBYSxDQUFVO0lBQ3JFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsbUJBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFVO0lBQ3JELFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsbUJBQVcsQ0FB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bkMsT0FBTyxFQUFFLEtBQUssSUFBbUMsRUFBRTtZQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQztZQUNqRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VRdWVyeSwgVXNlUXVlcnlPcHRpb25zIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IGdldEFwaUNsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7XG4gIENoZWNrSW5SZXNwb25zZSxcbiAgQ2hlY2tJblN0cmVha1Jlc3BvbnNlLFxuICBNb29kTG9nUmVzcG9uc2UsXG4gIFdpblJlc3BvbnNlLFxuICBIYWJpdFJlc3BvbnNlLFxuICBSZWZsZWN0aW9uUmVzcG9uc2UsXG59IGZyb20gJy4uL3R5cGVzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUVVFUlkgS0VZIEZBQ1RPUllcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRLZXlzID0ge1xuICBhbGw6IFsnc3VwcG9ydCddIGFzIGNvbnN0LFxuICBjaGVja0luczogKCkgPT4gWy4uLnN1cHBvcnRLZXlzLmFsbCwgJ2NoZWNrLWlucyddIGFzIGNvbnN0LFxuICBjaGVja0luVG9kYXk6ICgpID0+IFsuLi5zdXBwb3J0S2V5cy5jaGVja0lucygpLCAndG9kYXknXSBhcyBjb25zdCxcbiAgY2hlY2tJblN0cmVhazogKCkgPT4gWy4uLnN1cHBvcnRLZXlzLmNoZWNrSW5zKCksICdzdHJlYWsnXSBhcyBjb25zdCxcbiAgbW9vZExvZ3M6ICgpID0+IFsuLi5zdXBwb3J0S2V5cy5hbGwsICdtb29kJ10gYXMgY29uc3QsXG4gIHdpbnM6ICgpID0+IFsuLi5zdXBwb3J0S2V5cy5hbGwsICd3aW5zJ10gYXMgY29uc3QsXG4gIHdpbnNCeUNhdGVnb3J5OiAoKSA9PiBbLi4uc3VwcG9ydEtleXMud2lucygpLCAnYnktY2F0ZWdvcnknXSBhcyBjb25zdCxcbiAgaGFiaXRzOiAoKSA9PiBbLi4uc3VwcG9ydEtleXMuYWxsLCAnaGFiaXRzJ10gYXMgY29uc3QsXG4gIHJlZmxlY3Rpb25zOiAoKSA9PiBbLi4uc3VwcG9ydEtleXMuYWxsLCAncmVmbGVjdGlvbnMnXSBhcyBjb25zdCxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2luc0J5Q2F0ZWdvcnkge1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICB3aW5zOiBXaW5SZXNwb25zZVtdO1xuICBjb3VudDogbnVtYmVyO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBIT09LU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCB1c2VyJ3MgZGFpbHkgY2hlY2staW5zXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZUNoZWNrSW5zKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNoZWNrSW5zKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8Q2hlY2tJblJlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHN1cHBvcnRLZXlzLmNoZWNrSW5zKCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Q2hlY2tJblJlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL3N1cHBvcnQvY2hlY2staW5zJyk7XG4gICAgICAvLyBBUEkgd3JhcHMgcmVzcG9uc2VzIGluIHsgZGF0YTogWy4uLl0sIG1ldGE6IHsuLi59IH1cbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy5kYXRhIHx8IHJlc3BvbnNlLmRhdGEgfHwgW107XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdG9kYXkncyBjaGVjay1pblxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VUb2RheUNoZWNrSW4oKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9kYXlDaGVja0luKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8Q2hlY2tJblJlc3BvbnNlIHwgbnVsbD4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogc3VwcG9ydEtleXMuY2hlY2tJblRvZGF5KCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Q2hlY2tJblJlc3BvbnNlIHwgbnVsbD4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvc3VwcG9ydC9jaGVjay1pbnMvdG9kYXknKTtcbiAgICAgIC8vIEFQSSB3cmFwcyByZXNwb25zZXMgaW4geyBkYXRhOiB7Li4ufSwgbWV0YTogey4uLn0gfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LmRhdGEgPz8gcmVzcG9uc2UuZGF0YSA/PyBudWxsO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHVzZXIncyBjaGVjay1pbiBzdHJlYWtcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlQ2hlY2tJblN0cmVhaygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDaGVja0luU3RyZWFrKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8Q2hlY2tJblN0cmVha1Jlc3BvbnNlPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBzdXBwb3J0S2V5cy5jaGVja0luU3RyZWFrKCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Q2hlY2tJblN0cmVha1Jlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL2FwaS92MS9zdXBwb3J0L2NoZWNrLWlucy9zdHJlYWsnKTtcbiAgICAgIC8vIEFQSSB3cmFwcyByZXNwb25zZXMgaW4geyBkYXRhOiB7Li4ufSwgbWV0YTogey4uLn0gfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LmRhdGEgfHwgcmVzcG9uc2UuZGF0YSB8fCB7IGN1cnJlbnRTdHJlYWs6IDAsIGxvbmdlc3RTdHJlYWs6IDAsIHRvdGFsQ2hlY2tJbnM6IDAgfTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB1c2VyJ3MgbW9vZCBsb2dzXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZU1vb2RMb2dzKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1vb2RMb2dzKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8TW9vZExvZ1Jlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHN1cHBvcnRLZXlzLm1vb2RMb2dzKCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8TW9vZExvZ1Jlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL3N1cHBvcnQvbW9vZCcpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdXNlcidzIHdpbnNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlV2lucygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VXaW5zKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8V2luUmVzcG9uc2VbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogc3VwcG9ydEtleXMud2lucygpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFdpblJlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL3N1cHBvcnQvd2lucycpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdXNlcidzIHdpbnMgZ3JvdXBlZCBieSBjYXRlZ29yeVxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VXaW5zQnlDYXRlZ29yeSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VXaW5zQnlDYXRlZ29yeShcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFdpbnNCeUNhdGVnb3J5W10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHN1cHBvcnRLZXlzLndpbnNCeUNhdGVnb3J5KCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8V2luc0J5Q2F0ZWdvcnlbXT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvc3VwcG9ydC93aW5zL2J5LWNhdGVnb3J5Jyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB1c2VyJ3MgaGFiaXRzXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZUhhYml0cygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIYWJpdHMoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxIYWJpdFJlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHN1cHBvcnRLZXlzLmhhYml0cygpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPEhhYml0UmVzcG9uc2VbXT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvc3VwcG9ydC9oYWJpdHMnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHVzZXIncyByZWZsZWN0aW9uc1xuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VSZWZsZWN0aW9ucygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWZsZWN0aW9ucyhcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFJlZmxlY3Rpb25SZXNwb25zZVtdPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBzdXBwb3J0S2V5cy5yZWZsZWN0aW9ucygpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFJlZmxlY3Rpb25SZXNwb25zZVtdPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL2FwaS92MS9zdXBwb3J0L3JlZmxlY3Rpb25zJyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuIl19
206
+ /**
207
+ * Get user's craving logs
208
+ *
209
+ * @param options - TanStack Query options
210
+ *
211
+ * @example
212
+ * ```tsx
213
+ * const { data, isLoading } = useCravings();
214
+ * ```
215
+ */
216
+ function useCravings(options) {
217
+ return (0, react_query_1.useQuery)({
218
+ queryKey: exports.supportKeys.cravings(),
219
+ queryFn: async () => {
220
+ const client = (0, client_1.getApiClient)();
221
+ const response = await client.get('/api/v1/support/cravings');
222
+ return response.data;
223
+ },
224
+ ...options,
225
+ });
226
+ }
227
+ /**
228
+ * Get craving statistics for a given period
229
+ *
230
+ * @param days - Number of days to include (default: 30)
231
+ * @param options - TanStack Query options
232
+ *
233
+ * @example
234
+ * ```tsx
235
+ * const { data, isLoading } = useCravingStats(30);
236
+ * ```
237
+ */
238
+ function useCravingStats(days = 30, options) {
239
+ return (0, react_query_1.useQuery)({
240
+ queryKey: exports.supportKeys.cravingStats(days),
241
+ queryFn: async () => {
242
+ const client = (0, client_1.getApiClient)();
243
+ const response = await client.get(`/api/v1/support/cravings/stats?days=${days}`);
244
+ return response.data;
245
+ },
246
+ ...options,
247
+ });
248
+ }
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcXVlcmllcy9zdXBwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXVEQSxrQ0FhQztBQVlELDBDQWFDO0FBWUQsNENBYUM7QUFZRCxrQ0FZQztBQVlELDBCQVlDO0FBWUQsOENBWUM7QUFZRCw4QkFZQztBQVlELHdDQVlDO0FBWUQsa0NBWUM7QUFhRCwwQ0FhQztBQWhTRCx1REFBa0U7QUFDbEUsc0NBQXlDO0FBWXpDLCtFQUErRTtBQUMvRSxvQkFBb0I7QUFDcEIsK0VBQStFO0FBRWxFLFFBQUEsV0FBVyxHQUFHO0lBQ3pCLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBVTtJQUN6QixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLG1CQUFXLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBVTtJQUMxRCxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLG1CQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsT0FBTyxDQUFVO0lBQ2pFLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsbUJBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLENBQVU7SUFDbkUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxtQkFBVyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQVU7SUFDckQsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxtQkFBVyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQVU7SUFDekQsWUFBWSxFQUFFLENBQUMsSUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsbUJBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFVO0lBQ3BGLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsbUJBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFVO0lBQ2pELGNB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QUU7WUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2pGLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVF1ZXJ5LCBVc2VRdWVyeU9wdGlvbnMgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB0eXBlIHtcbiAgQ2hlY2tJblJlc3BvbnNlLFxuICBDaGVja0luU3RyZWFrUmVzcG9uc2UsXG4gIE1vb2RMb2dSZXNwb25zZSxcbiAgV2luUmVzcG9uc2UsXG4gIEhhYml0UmVzcG9uc2UsXG4gIFJlZmxlY3Rpb25SZXNwb25zZSxcbiAgQ3JhdmluZ0xvZ1Jlc3BvbnNlLFxuICBDcmF2aW5nU3RhdHNSZXNwb25zZSxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBLRVkgRkFDVE9SWVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3Qgc3VwcG9ydEtleXMgPSB7XG4gIGFsbDogWydzdXBwb3J0J10gYXMgY29uc3QsXG4gIGNoZWNrSW5zOiAoKSA9PiBbLi4uc3VwcG9ydEtleXMuYWxsLCAnY2hlY2staW5zJ10gYXMgY29uc3QsXG4gIGNoZWNrSW5Ub2RheTogKCkgPT4gWy4uLnN1cHBvcnRLZXlzLmNoZWNrSW5zKCksICd0b2RheSddIGFzIGNvbnN0LFxuICBjaGVja0luU3RyZWFrOiAoKSA9PiBbLi4uc3VwcG9ydEtleXMuY2hlY2tJbnMoKSwgJ3N0cmVhayddIGFzIGNvbnN0LFxuICBtb29kTG9nczogKCkgPT4gWy4uLnN1cHBvcnRLZXlzLmFsbCwgJ21vb2QnXSBhcyBjb25zdCxcbiAgY3JhdmluZ3M6ICgpID0+IFsuLi5zdXBwb3J0S2V5cy5hbGwsICdjcmF2aW5ncyddIGFzIGNvbnN0LFxuICBjcmF2aW5nU3RhdHM6IChkYXlzPzogbnVtYmVyKSA9PiBbLi4uc3VwcG9ydEtleXMuY3JhdmluZ3MoKSwgJ3N0YXRzJywgZGF5c10gYXMgY29uc3QsXG4gIHdpbnM6ICgpID0+IFsuLi5zdXBwb3J0S2V5cy5hbGwsICd3aW5zJ10gYXMgY29uc3QsXG4gIHdpbnNCeUNhdGVnb3J5OiAoKSA9PiBbLi4uc3VwcG9ydEtleXMud2lucygpLCAnYnktY2F0ZWdvcnknXSBhcyBjb25zdCxcbiAgaGFiaXRzOiAoKSA9PiBbLi4uc3VwcG9ydEtleXMuYWxsLCAnaGFiaXRzJ10gYXMgY29uc3QsXG4gIHJlZmxlY3Rpb25zOiAoKSA9PiBbLi4uc3VwcG9ydEtleXMuYWxsLCAncmVmbGVjdGlvbnMnXSBhcyBjb25zdCxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2luc0J5Q2F0ZWdvcnkge1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICB3aW5zOiBXaW5SZXNwb25zZVtdO1xuICBjb3VudDogbnVtYmVyO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBIT09LU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCB1c2VyJ3MgZGFpbHkgY2hlY2staW5zXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZUNoZWNrSW5zKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNoZWNrSW5zKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8Q2hlY2tJblJlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHN1cHBvcnRLZXlzLmNoZWNrSW5zKCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Q2hlY2tJblJlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL3N1cHBvcnQvY2hlY2staW5zJyk7XG4gICAgICAvLyBBUEkgd3JhcHMgcmVzcG9uc2VzIGluIHsgZGF0YTogWy4uLl0sIG1ldGE6IHsuLi59IH1cbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy5kYXRhIHx8IHJlc3BvbnNlLmRhdGEgfHwgW107XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdG9kYXkncyBjaGVjay1pblxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VUb2RheUNoZWNrSW4oKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9kYXlDaGVja0luKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8Q2hlY2tJblJlc3BvbnNlIHwgbnVsbD4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogc3VwcG9ydEtleXMuY2hlY2tJblRvZGF5KCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Q2hlY2tJblJlc3BvbnNlIHwgbnVsbD4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvc3VwcG9ydC9jaGVjay1pbnMvdG9kYXknKTtcbiAgICAgIC8vIEFQSSB3cmFwcyByZXNwb25zZXMgaW4geyBkYXRhOiB7Li4ufSwgbWV0YTogey4uLn0gfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LmRhdGEgPz8gcmVzcG9uc2UuZGF0YSA/PyBudWxsO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHVzZXIncyBjaGVjay1pbiBzdHJlYWtcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlQ2hlY2tJblN0cmVhaygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDaGVja0luU3RyZWFrKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8Q2hlY2tJblN0cmVha1Jlc3BvbnNlPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBzdXBwb3J0S2V5cy5jaGVja0luU3RyZWFrKCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Q2hlY2tJblN0cmVha1Jlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL2FwaS92MS9zdXBwb3J0L2NoZWNrLWlucy9zdHJlYWsnKTtcbiAgICAgIC8vIEFQSSB3cmFwcyByZXNwb25zZXMgaW4geyBkYXRhOiB7Li4ufSwgbWV0YTogey4uLn0gfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LmRhdGEgfHwgcmVzcG9uc2UuZGF0YSB8fCB7IGN1cnJlbnRTdHJlYWs6IDAsIGxvbmdlc3RTdHJlYWs6IDAsIHRvdGFsQ2hlY2tJbnM6IDAgfTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB1c2VyJ3MgbW9vZCBsb2dzXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZU1vb2RMb2dzKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1vb2RMb2dzKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8TW9vZExvZ1Jlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHN1cHBvcnRLZXlzLm1vb2RMb2dzKCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8TW9vZExvZ1Jlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL3N1cHBvcnQvbW9vZCcpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdXNlcidzIHdpbnNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlV2lucygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VXaW5zKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8V2luUmVzcG9uc2VbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogc3VwcG9ydEtleXMud2lucygpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFdpblJlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL3N1cHBvcnQvd2lucycpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdXNlcidzIHdpbnMgZ3JvdXBlZCBieSBjYXRlZ29yeVxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VXaW5zQnlDYXRlZ29yeSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VXaW5zQnlDYXRlZ29yeShcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFdpbnNCeUNhdGVnb3J5W10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHN1cHBvcnRLZXlzLndpbnNCeUNhdGVnb3J5KCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8V2luc0J5Q2F0ZWdvcnlbXT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvc3VwcG9ydC93aW5zL2J5LWNhdGVnb3J5Jyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB1c2VyJ3MgaGFiaXRzXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZUhhYml0cygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIYWJpdHMoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxIYWJpdFJlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHN1cHBvcnRLZXlzLmhhYml0cygpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPEhhYml0UmVzcG9uc2VbXT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvc3VwcG9ydC9oYWJpdHMnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHVzZXIncyByZWZsZWN0aW9uc1xuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VSZWZsZWN0aW9ucygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWZsZWN0aW9ucyhcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFJlZmxlY3Rpb25SZXNwb25zZVtdPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBzdXBwb3J0S2V5cy5yZWZsZWN0aW9ucygpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFJlZmxlY3Rpb25SZXNwb25zZVtdPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL2FwaS92MS9zdXBwb3J0L3JlZmxlY3Rpb25zJyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB1c2VyJ3MgY3JhdmluZyBsb2dzXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZUNyYXZpbmdzKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNyYXZpbmdzKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8Q3JhdmluZ0xvZ1Jlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHN1cHBvcnRLZXlzLmNyYXZpbmdzKCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Q3JhdmluZ0xvZ1Jlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL3N1cHBvcnQvY3JhdmluZ3MnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGNyYXZpbmcgc3RhdGlzdGljcyBmb3IgYSBnaXZlbiBwZXJpb2RcbiAqXG4gKiBAcGFyYW0gZGF5cyAtIE51bWJlciBvZiBkYXlzIHRvIGluY2x1ZGUgKGRlZmF1bHQ6IDMwKVxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZUNyYXZpbmdTdGF0cygzMCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNyYXZpbmdTdGF0cyhcbiAgZGF5czogbnVtYmVyID0gMzAsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxDcmF2aW5nU3RhdHNSZXNwb25zZT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogc3VwcG9ydEtleXMuY3JhdmluZ1N0YXRzKGRheXMpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPENyYXZpbmdTdGF0c1Jlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldChgL2FwaS92MS9zdXBwb3J0L2NyYXZpbmdzL3N0YXRzP2RheXM9JHtkYXlzfWApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cbiJdfQ==