@kaspernj/api-maker 1.0.2129 → 1.0.2131
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/use-collection.d.ts +2 -60
- package/build/use-collection.d.ts.map +1 -1
- package/build/use-collection.js +292 -195
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export default useCollection;
|
|
2
2
|
export type UseCollectionResult = {
|
|
3
3
|
models: Array<import("./base-model.js").default>;
|
|
4
|
-
modelIdsCacheString:
|
|
4
|
+
modelIdsCacheString: string;
|
|
5
5
|
overallCount: number;
|
|
6
6
|
query: import("./collection.js").default<any>;
|
|
7
7
|
queryName: string;
|
|
@@ -14,63 +14,5 @@ export type UseCollectionResult = {
|
|
|
14
14
|
showNoRecordsAvailableContent: false | import("react").ReactNode;
|
|
15
15
|
showNoRecordsFoundContent: false | import("react").ReactNode;
|
|
16
16
|
};
|
|
17
|
-
|
|
18
|
-
* @typedef {object} UseCollectionResult
|
|
19
|
-
* @property {Array<import("./base-model.js").default>} models
|
|
20
|
-
* @property {Array<number | string>} modelIdsCacheString
|
|
21
|
-
* @property {number} overallCount
|
|
22
|
-
* @property {import("./collection.js").default} query
|
|
23
|
-
* @property {string} queryName
|
|
24
|
-
* @property {string} queryPerKey
|
|
25
|
-
* @property {string} queryQName
|
|
26
|
-
* @property {string} querySName
|
|
27
|
-
* @property {string} queryPageName
|
|
28
|
-
* @property {import("./result.js").default} result
|
|
29
|
-
* @property {string[]} searchParams
|
|
30
|
-
* @property {false | import("react").ReactNode} showNoRecordsAvailableContent
|
|
31
|
-
* @property {false | import("react").ReactNode} showNoRecordsFoundContent
|
|
32
|
-
*/
|
|
33
|
-
/**
|
|
34
|
-
* @param {object} props
|
|
35
|
-
* @param {Record<string, string[]>} props.abilities
|
|
36
|
-
* @param {import("./collection.js").default} props.collection
|
|
37
|
-
* @param {Record<string, any>} props.defaultParams
|
|
38
|
-
* @param {string[]} props.groupBy
|
|
39
|
-
* @param {function() : boolean} props.ifCondition
|
|
40
|
-
* @param {number} props.limit
|
|
41
|
-
* @param {typeof import("./base-model.js").default} props.modelClass
|
|
42
|
-
* @param {function() : import("react").ReactNode} props.noRecordsAvailableContent
|
|
43
|
-
* @param {function() : import("react").ReactNode} props.noRecordsFoundContent
|
|
44
|
-
* @param {function() : void} props.onModelsLoaded
|
|
45
|
-
* @param {boolean} props.pagination
|
|
46
|
-
* @param {string[]} props.preloads
|
|
47
|
-
* @param {function({query: import("./collection.js").default}) : import("./collection.js").default} props.queryMethod
|
|
48
|
-
* @param {string} props.queryName
|
|
49
|
-
* @param {Record<string, any>} props.ransack
|
|
50
|
-
* @param {Record<string, string[]>} props.select
|
|
51
|
-
* @param {Record<string, string[]>} props.selectColumns
|
|
52
|
-
* @param {any[]} cacheKeys
|
|
53
|
-
* @returns {UseCollectionResult & Record<string, any>}
|
|
54
|
-
*/
|
|
55
|
-
declare function useCollection(props: {
|
|
56
|
-
abilities: Record<string, string[]>;
|
|
57
|
-
collection: import("./collection.js").default<any>;
|
|
58
|
-
defaultParams: Record<string, any>;
|
|
59
|
-
groupBy: string[];
|
|
60
|
-
ifCondition: () => boolean;
|
|
61
|
-
limit: number;
|
|
62
|
-
modelClass: typeof import("./base-model.js").default;
|
|
63
|
-
noRecordsAvailableContent: () => import("react").ReactNode;
|
|
64
|
-
noRecordsFoundContent: () => import("react").ReactNode;
|
|
65
|
-
onModelsLoaded: () => void;
|
|
66
|
-
pagination: boolean;
|
|
67
|
-
preloads: string[];
|
|
68
|
-
queryMethod: (arg0: {
|
|
69
|
-
query: import("./collection.js").default<any>;
|
|
70
|
-
}) => import("./collection.js").default<any>;
|
|
71
|
-
queryName: string;
|
|
72
|
-
ransack: Record<string, any>;
|
|
73
|
-
select: Record<string, string[]>;
|
|
74
|
-
selectColumns: Record<string, string[]>;
|
|
75
|
-
}, cacheKeys?: any[]): UseCollectionResult & Record<string, any>;
|
|
17
|
+
declare function useCollection(props: any, cacheKeys?: any[]): UseCollectionResult & Record<string, any>;
|
|
76
18
|
//# sourceMappingURL=use-collection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-collection.d.ts","sourceRoot":"/src/","sources":["use-collection.js"],"names":[],"mappings":";;YAYc,KAAK,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC;yBACxC,
|
|
1
|
+
{"version":3,"file":"use-collection.d.ts","sourceRoot":"/src/","sources":["use-collection.js"],"names":[],"mappings":";;YAYc,KAAK,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC;yBACxC,MAAM;kBACN,MAAM;;eAEN,MAAM;iBACN,MAAM;gBACN,MAAM;gBACN,MAAM;mBACN,MAAM;YACN,OAAO,aAAa,EAAE,OAAO;kBAC7B,MAAM,EAAE;mCACR,KAAK,GAAG,OAAO,OAAO,EAAE,SAAS;+BACjC,KAAK,GAAG,OAAO,OAAO,EAAE,SAAS;;AA0W/C,yGA0DC"}
|
package/build/use-collection.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars, no-use-before-define, prefer-object-spread, sort-imports */
|
|
2
|
+
import { ShapeHook, useShapeHook } from "set-state-compare";
|
|
2
3
|
import debounce from "debounce";
|
|
3
4
|
import { digg } from "diggerize";
|
|
4
5
|
import * as inflection from "inflection";
|
|
5
6
|
import ModelEvents from "./model-events.js";
|
|
6
|
-
import {
|
|
7
|
+
import { useEffect } from "react";
|
|
7
8
|
import useCreatedEvent from "./use-created-event.js";
|
|
8
|
-
import useShape from "./use-shape.js";
|
|
9
9
|
import useQueryParams from "on-location-changed/build/use-query-params.js";
|
|
10
10
|
/**
|
|
11
11
|
* @typedef {object} UseCollectionResult
|
|
12
12
|
* @property {Array<import("./base-model.js").default>} models
|
|
13
|
-
* @property {
|
|
13
|
+
* @property {string} modelIdsCacheString
|
|
14
14
|
* @property {number} overallCount
|
|
15
15
|
* @property {import("./collection.js").default} query
|
|
16
16
|
* @property {string} queryName
|
|
@@ -45,89 +45,158 @@ import useQueryParams from "on-location-changed/build/use-query-params.js";
|
|
|
45
45
|
* @param {any[]} cacheKeys
|
|
46
46
|
* @returns {UseCollectionResult & Record<string, any>}
|
|
47
47
|
*/
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
/** Hook state container for useCollection. */
|
|
49
|
+
class UseCollectionShapeHook extends ShapeHook {
|
|
50
|
+
/** Constructor. */
|
|
51
|
+
constructor(props) {
|
|
52
|
+
super(props);
|
|
53
|
+
this.loadModelsGeneration = 0;
|
|
54
|
+
this.loadOverallCountGeneration = 0;
|
|
55
|
+
this.queryParams = undefined;
|
|
52
56
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
57
|
+
/** @returns {string} */
|
|
58
|
+
queryName() {
|
|
59
|
+
return this.p.queryName || digg(this.p.modelClass.modelClassData(), "collectionKey");
|
|
60
|
+
}
|
|
61
|
+
/** @returns {string} */
|
|
62
|
+
queryPerKey() {
|
|
63
|
+
return `${this.queryName()}_per`;
|
|
64
|
+
}
|
|
65
|
+
/** @returns {string} */
|
|
66
|
+
queryQName() {
|
|
67
|
+
return `${this.queryName()}_q`;
|
|
68
|
+
}
|
|
69
|
+
/** @returns {string} */
|
|
70
|
+
querySName() {
|
|
71
|
+
return `${this.queryName()}_s`;
|
|
72
|
+
}
|
|
73
|
+
/** @returns {string} */
|
|
74
|
+
queryPageName() {
|
|
75
|
+
return `${this.queryName()}_page`;
|
|
76
|
+
}
|
|
77
|
+
/** @returns {string} */
|
|
78
|
+
modelIdsCacheString() {
|
|
79
|
+
if (this.s.models === undefined) {
|
|
80
|
+
return "models-undefined";
|
|
81
|
+
}
|
|
82
|
+
else if (this.s.models.length === 0) {
|
|
83
|
+
return "no-models";
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return this.s.models.map((model) => model.cacheKey())?.join("---");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** @returns {Function & {clear?: () => void}} */
|
|
90
|
+
loadModelsDebounce() {
|
|
91
|
+
return this.cache("loadModelsDebounce", () => debounce(() => this.loadModels()));
|
|
88
92
|
}
|
|
89
|
-
|
|
90
|
-
|
|
93
|
+
/** @param {Record<string, any>} args */
|
|
94
|
+
showNoRecordsAvailableContent(args) {
|
|
95
|
+
let models, overallCount;
|
|
96
|
+
if (args.models !== undefined) {
|
|
97
|
+
models = args.models;
|
|
98
|
+
}
|
|
99
|
+
else if (this.s.models !== undefined) {
|
|
100
|
+
models = this.s.models;
|
|
101
|
+
}
|
|
102
|
+
if (args.overallCount !== undefined) {
|
|
103
|
+
overallCount = args.overallCount;
|
|
104
|
+
}
|
|
105
|
+
else if (this.s.overallCount !== undefined) {
|
|
106
|
+
overallCount = this.s.overallCount;
|
|
107
|
+
}
|
|
108
|
+
if (models === undefined || overallCount === undefined || this.p.noRecordsAvailableContent === undefined)
|
|
109
|
+
return false;
|
|
110
|
+
if (models.length === 0 && overallCount === 0 && this.p.noRecordsAvailableContent)
|
|
111
|
+
return true;
|
|
91
112
|
}
|
|
92
|
-
|
|
93
|
-
|
|
113
|
+
/** @param {Record<string, any>} args */
|
|
114
|
+
showNoRecordsFoundContent(args) {
|
|
115
|
+
let models, overallCount;
|
|
116
|
+
if (args.models !== undefined) {
|
|
117
|
+
models = args.models;
|
|
118
|
+
}
|
|
119
|
+
else if (this.s.models !== undefined) {
|
|
120
|
+
models = this.s.models;
|
|
121
|
+
}
|
|
122
|
+
if (args.overallCount !== undefined) {
|
|
123
|
+
overallCount = args.overallCount;
|
|
124
|
+
}
|
|
125
|
+
else if (this.s.overallCount !== undefined) {
|
|
126
|
+
overallCount = this.s.overallCount;
|
|
127
|
+
}
|
|
128
|
+
if (models === undefined || this.p.noRecordsFoundContent === undefined)
|
|
129
|
+
return false;
|
|
130
|
+
// Dont show noRecordsAvailableContent together with noRecordsAvailableContent
|
|
131
|
+
if (models.length === 0 && overallCount === 0 && this.p.noRecordsAvailableContent)
|
|
132
|
+
return false;
|
|
133
|
+
if (models.length === 0 && this.p.noRecordsFoundContent)
|
|
134
|
+
return true;
|
|
94
135
|
}
|
|
95
|
-
|
|
136
|
+
/** @returns {Promise<void>} */
|
|
137
|
+
loadOverallCount = async () => {
|
|
96
138
|
// Ignore late overall-count responses once a newer load cycle has started or the hook unmounted.
|
|
97
|
-
const loadOverallCountGeneration =
|
|
98
|
-
|
|
99
|
-
const baseQuery =
|
|
139
|
+
const loadOverallCountGeneration = this.loadOverallCountGeneration + 1;
|
|
140
|
+
this.loadOverallCountGeneration = loadOverallCountGeneration;
|
|
141
|
+
const baseQuery = this.p.collection || this.p.modelClass.all();
|
|
100
142
|
const overallCount = await baseQuery.count();
|
|
101
|
-
if (loadOverallCountGeneration !=
|
|
143
|
+
if (loadOverallCountGeneration != this.loadOverallCountGeneration)
|
|
102
144
|
return;
|
|
103
|
-
|
|
145
|
+
this.setState({
|
|
104
146
|
overallCount,
|
|
105
|
-
showNoRecordsAvailableContent: showNoRecordsAvailableContent({ overallCount }),
|
|
106
|
-
showNoRecordsFoundContent: showNoRecordsFoundContent({ overallCount })
|
|
147
|
+
showNoRecordsAvailableContent: this.showNoRecordsAvailableContent({ overallCount }),
|
|
148
|
+
showNoRecordsFoundContent: this.showNoRecordsFoundContent({ overallCount })
|
|
107
149
|
});
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
|
|
150
|
+
};
|
|
151
|
+
/** @returns {{qParams: Record<string, any>, searchParams: string[]}} */
|
|
152
|
+
loadQParams() {
|
|
153
|
+
let qParamsToSet = Object.assign({}, this.p.defaultParams);
|
|
111
154
|
const searchParams = [];
|
|
112
|
-
if (
|
|
113
|
-
|
|
155
|
+
if (this.queryParams && this.queryQName() in this.queryParams) {
|
|
156
|
+
qParamsToSet = JSON.parse(digg(this.queryParams, this.queryQName()));
|
|
157
|
+
}
|
|
158
|
+
if (this.queryParams?.[this.querySName()]) {
|
|
159
|
+
for (const rawSearchParam of this.queryParams[this.querySName()]) {
|
|
114
160
|
const parsedSearchParam = JSON.parse(rawSearchParam);
|
|
115
161
|
searchParams.push(parsedSearchParam);
|
|
116
162
|
}
|
|
117
163
|
}
|
|
118
|
-
|
|
164
|
+
this.setState({
|
|
119
165
|
qParams: qParamsToSet,
|
|
120
166
|
searchParams
|
|
121
167
|
});
|
|
122
|
-
|
|
123
|
-
|
|
168
|
+
return {
|
|
169
|
+
qParams: qParamsToSet,
|
|
170
|
+
searchParams
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* @param {object} [args]
|
|
175
|
+
* @param {Record<string, any>} [args.qParams]
|
|
176
|
+
* @param {string[]} [args.searchParams]
|
|
177
|
+
* @returns {{qParams: Record<string, any>, searchParams: string[]}}
|
|
178
|
+
*/
|
|
179
|
+
loadModelsArgs(args = {}) {
|
|
180
|
+
return {
|
|
181
|
+
qParams: args.qParams ?? this.s.qParams,
|
|
182
|
+
searchParams: args.searchParams ?? this.s.searchParams
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* @param {object} [args]
|
|
187
|
+
* @param {Record<string, any>} [args.qParams]
|
|
188
|
+
* @param {string[]} [args.searchParams]
|
|
189
|
+
* @returns {Promise<void>}
|
|
190
|
+
*/
|
|
191
|
+
loadModels = async (args = {}) => {
|
|
124
192
|
// Only the newest collection request is allowed to update state after navigation/filter changes.
|
|
125
|
-
const loadModelsGeneration =
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
193
|
+
const loadModelsGeneration = this.loadModelsGeneration + 1;
|
|
194
|
+
const { qParams, searchParams } = this.loadModelsArgs(args);
|
|
195
|
+
this.loadModelsGeneration = loadModelsGeneration;
|
|
196
|
+
let query = this.p.collection?.clone() || this.p.modelClass.ransack();
|
|
197
|
+
if (this.p.pagination) {
|
|
198
|
+
const page = this.queryParams?.[this.queryPageName()] || 1;
|
|
199
|
+
let per = this.queryParams?.[this.queryPerKey()] || 30;
|
|
131
200
|
if (per == "all") {
|
|
132
201
|
per = 999_999_999;
|
|
133
202
|
}
|
|
@@ -136,154 +205,182 @@ const useCollection = (props, cacheKeys = []) => {
|
|
|
136
205
|
}
|
|
137
206
|
query.page(page).per(per);
|
|
138
207
|
}
|
|
139
|
-
if (
|
|
140
|
-
query = query.groupBy(...
|
|
208
|
+
if (this.p.groupBy)
|
|
209
|
+
query = query.groupBy(...this.p.groupBy);
|
|
141
210
|
query = query
|
|
142
|
-
.ransack(
|
|
143
|
-
.search(
|
|
144
|
-
.searchKey(
|
|
145
|
-
.pageKey(
|
|
146
|
-
.perKey(
|
|
147
|
-
if (
|
|
148
|
-
query.abilities(
|
|
149
|
-
if (
|
|
150
|
-
query.limit(
|
|
151
|
-
if (
|
|
152
|
-
query.preload(
|
|
153
|
-
if (
|
|
154
|
-
query.ransack(
|
|
155
|
-
if (
|
|
156
|
-
query.select(
|
|
157
|
-
if (
|
|
158
|
-
query.selectColumns(
|
|
211
|
+
.ransack(qParams)
|
|
212
|
+
.search(searchParams)
|
|
213
|
+
.searchKey(this.queryQName())
|
|
214
|
+
.pageKey(this.queryPageName())
|
|
215
|
+
.perKey(this.queryPerKey());
|
|
216
|
+
if (this.p.abilities)
|
|
217
|
+
query.abilities(this.p.abilities);
|
|
218
|
+
if (this.p.limit !== undefined)
|
|
219
|
+
query.limit(this.p.limit);
|
|
220
|
+
if (this.p.preloads)
|
|
221
|
+
query.preload(this.p.preloads);
|
|
222
|
+
if (this.p.ransack)
|
|
223
|
+
query.ransack(this.p.ransack);
|
|
224
|
+
if (this.p.select)
|
|
225
|
+
query.select(this.p.select);
|
|
226
|
+
if (this.p.selectColumns)
|
|
227
|
+
query.selectColumns(this.p.selectColumns);
|
|
159
228
|
let result;
|
|
160
|
-
if (
|
|
161
|
-
result = await
|
|
229
|
+
if (this.p.queryMethod) {
|
|
230
|
+
result = await this.p.queryMethod({ query });
|
|
162
231
|
}
|
|
163
232
|
else {
|
|
164
233
|
result = await query.result();
|
|
165
234
|
}
|
|
166
235
|
const models = result.models();
|
|
167
|
-
if (loadModelsGeneration !=
|
|
236
|
+
if (loadModelsGeneration != this.loadModelsGeneration)
|
|
168
237
|
return;
|
|
169
|
-
if (
|
|
170
|
-
|
|
238
|
+
if (this.p.onModelsLoaded) {
|
|
239
|
+
this.p.onModelsLoaded({
|
|
171
240
|
models,
|
|
172
|
-
qParams:
|
|
241
|
+
qParams: this.s.qParams,
|
|
173
242
|
query,
|
|
174
243
|
result
|
|
175
244
|
});
|
|
176
245
|
}
|
|
177
|
-
|
|
178
|
-
models
|
|
246
|
+
this.setState({
|
|
247
|
+
models,
|
|
179
248
|
query,
|
|
180
249
|
result,
|
|
181
|
-
showNoRecordsAvailableContent: showNoRecordsAvailableContent({ models }),
|
|
182
|
-
showNoRecordsFoundContent: showNoRecordsFoundContent({ models })
|
|
250
|
+
showNoRecordsAvailableContent: this.showNoRecordsAvailableContent({ models }),
|
|
251
|
+
showNoRecordsFoundContent: this.showNoRecordsFoundContent({ models })
|
|
183
252
|
});
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
253
|
+
};
|
|
254
|
+
/** @param {{model: import("./base-model.js").default}} args */
|
|
255
|
+
onModelDestroyed(args) {
|
|
256
|
+
const destroyedModel = digg(args, "model");
|
|
257
|
+
this.setState({
|
|
258
|
+
models: this.s.models.filter((model) => model.id() != destroyedModel.id())
|
|
189
259
|
});
|
|
190
|
-
}
|
|
191
|
-
|
|
260
|
+
}
|
|
261
|
+
/** @param {{model: import("./base-model.js").default}} args */
|
|
262
|
+
onModelUpdated(args) {
|
|
192
263
|
const updatedModel = digg(args, "model");
|
|
193
|
-
const foundModel =
|
|
264
|
+
const foundModel = this.s.models.find((model) => model.id() == updatedModel.id());
|
|
194
265
|
if (foundModel)
|
|
195
|
-
loadModelsDebounce();
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
overallCount
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
}
|
|
227
|
-
else if (s.s.overallCount !== undefined) {
|
|
228
|
-
overallCount = s.s.overallCount;
|
|
229
|
-
}
|
|
230
|
-
if (models === undefined || s.props.noRecordsFoundContent === undefined)
|
|
231
|
-
return false;
|
|
232
|
-
// Dont show noRecordsAvailableContent together with noRecordsAvailableContent
|
|
233
|
-
if (models.length === 0 && overallCount === 0 && s.props.noRecordsAvailableContent)
|
|
234
|
-
return false;
|
|
235
|
-
if (models.length === 0 && s.props.noRecordsFoundContent)
|
|
236
|
-
return true;
|
|
237
|
-
}, []);
|
|
238
|
-
const onCreated = useCallback(() => {
|
|
239
|
-
loadModelsDebounce();
|
|
240
|
-
}, []);
|
|
241
|
-
// Collection loading has to wait until mount so fast responses cannot get stranded in ShapeHook's pre-mount queue.
|
|
242
|
-
useEffect(() => {
|
|
243
|
-
if (!("ifCondition" in s.props) || s.props.ifCondition) {
|
|
244
|
-
loadQParams();
|
|
245
|
-
loadModels();
|
|
246
|
-
}
|
|
247
|
-
}, [
|
|
248
|
-
modelClass,
|
|
249
|
-
s.props.ifCondition,
|
|
250
|
-
s.s.queryName,
|
|
251
|
-
s.m.queryParams[s.s.queryQName],
|
|
252
|
-
s.m.queryParams[s.s.queryPageName],
|
|
253
|
-
s.m.queryParams[s.s.queryPerKey],
|
|
254
|
-
s.m.queryParams[s.s.querySName],
|
|
255
|
-
collection
|
|
256
|
-
].concat(cacheKeys));
|
|
257
|
-
useEffect(() => {
|
|
258
|
-
if (s.props.noRecordsAvailableContent) {
|
|
259
|
-
loadOverallCount();
|
|
260
|
-
}
|
|
261
|
-
}, [modelClass]);
|
|
262
|
-
useCreatedEvent(s.p.modelClass, onCreated);
|
|
263
|
-
// Invalidate any in-flight async responses so unmounted hooks cannot write stale state.
|
|
264
|
-
useEffect(() => () => {
|
|
265
|
-
loadModelsGenerationRef.current += 1;
|
|
266
|
-
loadOverallCountGenerationRef.current += 1;
|
|
267
|
-
}, []);
|
|
268
|
-
useEffect(() => {
|
|
269
|
-
const connections = [];
|
|
270
|
-
if (s.s.models) {
|
|
271
|
-
for (const model of s.s.models) {
|
|
272
|
-
connections.push(ModelEvents.connectUpdated(model, onModelUpdated));
|
|
273
|
-
connections.push(ModelEvents.connectDestroyed(model, onModelDestroyed));
|
|
266
|
+
this.loadModelsDebounce()();
|
|
267
|
+
}
|
|
268
|
+
/** @returns {void} */
|
|
269
|
+
onCreated() {
|
|
270
|
+
this.loadModelsDebounce()();
|
|
271
|
+
}
|
|
272
|
+
/** @returns {void} */
|
|
273
|
+
componentDidMount() {
|
|
274
|
+
this.setState({ readyToLoad: true });
|
|
275
|
+
}
|
|
276
|
+
/** @returns {void} */
|
|
277
|
+
setup() {
|
|
278
|
+
this.useStates({
|
|
279
|
+
models: undefined,
|
|
280
|
+
overallCount: undefined,
|
|
281
|
+
qParams: {},
|
|
282
|
+
query: undefined,
|
|
283
|
+
readyToLoad: false,
|
|
284
|
+
result: undefined,
|
|
285
|
+
searchParams: undefined,
|
|
286
|
+
showNoRecordsAvailableContent: false,
|
|
287
|
+
showNoRecordsFoundContent: false
|
|
288
|
+
});
|
|
289
|
+
this.setInstance({ queryParams: useQueryParams() });
|
|
290
|
+
// Wait until componentDidMount has flipped readyToLoad so the first load runs after useShapeHook has marked the hook mounted.
|
|
291
|
+
useEffect(() => {
|
|
292
|
+
if (!this.s.readyToLoad)
|
|
293
|
+
return;
|
|
294
|
+
let ifConditionMet;
|
|
295
|
+
if (typeof this.p.ifCondition == "function") {
|
|
296
|
+
ifConditionMet = this.p.ifCondition();
|
|
274
297
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
for (const connection of connections) {
|
|
278
|
-
connection.unsubscribe();
|
|
298
|
+
else if (this.p.ifCondition === undefined) {
|
|
299
|
+
ifConditionMet = true;
|
|
279
300
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
301
|
+
else {
|
|
302
|
+
ifConditionMet = this.p.ifCondition;
|
|
303
|
+
}
|
|
304
|
+
if (ifConditionMet) {
|
|
305
|
+
const { qParams, searchParams } = this.loadQParams();
|
|
306
|
+
this.loadModels({ qParams, searchParams });
|
|
307
|
+
}
|
|
308
|
+
}, [
|
|
309
|
+
this.p.modelClass,
|
|
310
|
+
this.p.ifCondition,
|
|
311
|
+
this.queryName(),
|
|
312
|
+
this.queryParams?.[this.queryQName()],
|
|
313
|
+
this.queryParams?.[this.queryPageName()],
|
|
314
|
+
this.queryParams?.[this.queryPerKey()],
|
|
315
|
+
this.queryParams?.[this.querySName()],
|
|
316
|
+
this.s.readyToLoad,
|
|
317
|
+
this.p.collection
|
|
318
|
+
].concat(this.p.cacheKeys));
|
|
319
|
+
useEffect(() => {
|
|
320
|
+
if (!this.s.readyToLoad)
|
|
321
|
+
return;
|
|
322
|
+
if (this.p.noRecordsAvailableContent) {
|
|
323
|
+
this.loadOverallCount();
|
|
324
|
+
}
|
|
325
|
+
}, [this.p.modelClass, this.s.readyToLoad]);
|
|
326
|
+
useCreatedEvent(this.p.modelClass, () => this.onCreated());
|
|
327
|
+
// Invalidate any in-flight async responses so unmounted hooks cannot write stale state.
|
|
328
|
+
useEffect(() => () => {
|
|
329
|
+
this.loadModelsGeneration += 1;
|
|
330
|
+
this.loadOverallCountGeneration += 1;
|
|
331
|
+
this.loadModelsDebounce().clear?.();
|
|
332
|
+
}, []);
|
|
333
|
+
useEffect(() => {
|
|
334
|
+
const connections = [];
|
|
335
|
+
if (this.s.models) {
|
|
336
|
+
for (const model of this.s.models) {
|
|
337
|
+
connections.push(ModelEvents.connectUpdated(model, (args) => this.onModelUpdated(args)));
|
|
338
|
+
connections.push(ModelEvents.connectDestroyed(model, (args) => this.onModelDestroyed(args)));
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return () => {
|
|
342
|
+
for (const connection of connections) {
|
|
343
|
+
connection.unsubscribe();
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
}, [this.modelIdsCacheString()]);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
const useCollection = (props, cacheKeys = []) => {
|
|
350
|
+
const { abilities, collection, defaultParams, groupBy, ifCondition, limit, modelClass, noRecordsAvailableContent = undefined, noRecordsFoundContent = undefined, onModelsLoaded, pagination = false, preloads = [], queryMethod, queryName, ransack, select = {}, selectColumns, ...restProps } = props;
|
|
351
|
+
if (Object.keys(restProps).length > 0) {
|
|
352
|
+
throw new Error(`Unknown props given to useCollection: ${Object.keys(restProps).join(", ")}`);
|
|
353
|
+
}
|
|
354
|
+
const shapeHook = useShapeHook(UseCollectionShapeHook, {
|
|
355
|
+
abilities,
|
|
356
|
+
cacheKeys,
|
|
357
|
+
collection,
|
|
358
|
+
defaultParams,
|
|
359
|
+
groupBy,
|
|
360
|
+
ifCondition,
|
|
361
|
+
limit,
|
|
362
|
+
modelClass,
|
|
363
|
+
noRecordsAvailableContent,
|
|
364
|
+
noRecordsFoundContent,
|
|
365
|
+
onModelsLoaded,
|
|
366
|
+
pagination,
|
|
367
|
+
preloads,
|
|
368
|
+
queryMethod,
|
|
369
|
+
queryName,
|
|
370
|
+
ransack,
|
|
371
|
+
select,
|
|
372
|
+
selectColumns
|
|
373
|
+
});
|
|
374
|
+
const result = /** @type {UseCollectionResult & Record<string, any>} */ (Object.assign({}, shapeHook.state));
|
|
375
|
+
const modelVariableName = inflection.pluralize(inflection.camelize(shapeHook.p.modelClass.modelClassData().name, true));
|
|
376
|
+
result.modelIdsCacheString = shapeHook.modelIdsCacheString();
|
|
377
|
+
result.queryName = shapeHook.queryName();
|
|
378
|
+
result.queryPerKey = shapeHook.queryPerKey();
|
|
379
|
+
result.queryQName = shapeHook.queryQName();
|
|
380
|
+
result.querySName = shapeHook.querySName();
|
|
381
|
+
result.queryPageName = shapeHook.queryPageName();
|
|
382
|
+
result[modelVariableName] = shapeHook.s.models;
|
|
286
383
|
return result;
|
|
287
384
|
};
|
|
288
385
|
export default useCollection;
|
|
289
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInVzZS1jb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZGQUE2RjtBQUM3RixPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUE7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLFdBQVcsTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFDLE1BQU0sT0FBTyxDQUFBO0FBQzdELE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFBO0FBQ3BELE9BQU8sUUFBUSxNQUFNLGdCQUFnQixDQUFBO0FBQ3JDLE9BQU8sY0FBYyxNQUFNLCtDQUErQyxDQUFBO0FBRTFFOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDOUMsTUFBTSxFQUNKLFNBQVMsRUFDVCxVQUFVLEVBQ1YsYUFBYSxFQUNiLE9BQU8sRUFDUCxXQUFXLEVBQ1gsS0FBSyxFQUNMLFVBQVUsRUFDVix5QkFBeUIsR0FBRyxTQUFTLEVBQ3JDLHFCQUFxQixHQUFHLFNBQVMsRUFDakMsY0FBYyxFQUNkLFVBQVUsR0FBRyxLQUFLLEVBQ2xCLFFBQVEsR0FBRyxFQUFFLEVBQ2IsV0FBVyxFQUNYLFNBQVMsRUFBRSxnQkFBZ0IsRUFDM0IsT0FBTyxFQUNQLE1BQU0sR0FBRyxFQUFFLEVBQ1gsYUFBYSxFQUNiLEdBQUcsU0FBUyxFQUNiLEdBQUcsS0FBSyxDQUFBO0lBRVQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFD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LFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUUzRyxNQUFNLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUE7SUFDaEQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7SUFFdEMsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUE7QUFFRCxlQUFlLGFBQWEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZSwgcHJlZmVyLW9iamVjdC1zcHJlYWQsIHNvcnQtaW1wb3J0cyAqL1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCJkZWJvdW5jZVwiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTW9kZWxFdmVudHMgZnJvbSBcIi4vbW9kZWwtZXZlbnRzLmpzXCJcbmltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHVzZUNyZWF0ZWRFdmVudCBmcm9tIFwiLi91c2UtY3JlYXRlZC1ldmVudC5qc1wiXG5pbXBvcnQgdXNlU2hhcGUgZnJvbSBcIi4vdXNlLXNoYXBlLmpzXCJcbmltcG9ydCB1c2VRdWVyeVBhcmFtcyBmcm9tIFwib24tbG9jYXRpb24tY2hhbmdlZC9idWlsZC91c2UtcXVlcnktcGFyYW1zLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVc2VDb2xsZWN0aW9uUmVzdWx0XG4gKiBAcHJvcGVydHkge0FycmF5PGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0Pn0gbW9kZWxzXG4gKiBAcHJvcGVydHkge0FycmF5PG51bWJlciB8IHN0cmluZz59IG1vZGVsSWRzQ2FjaGVTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvdmVyYWxsQ291bnRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHF1ZXJ5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlQZXJLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeVFOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlTTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHF1ZXJ5UGFnZU5hbWVcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9yZXN1bHQuanNcIikuZGVmYXVsdH0gcmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzZWFyY2hQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7ZmFsc2UgfCBpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50XG4gKiBAcHJvcGVydHkge2ZhbHNlIHwgaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBwcm9wcy5hYmlsaXRpZXNcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHByb3BzLmNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcHJvcHMuZGVmYXVsdFBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHMuZ3JvdXBCeVxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogYm9vbGVhbn0gcHJvcHMuaWZDb25kaXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBwcm9wcy5saW1pdFxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9IHByb3BzLm1vZGVsQ2xhc3NcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gcHJvcHMubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudFxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBwcm9wcy5ub1JlY29yZHNGb3VuZENvbnRlbnRcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IHByb3BzLm9uTW9kZWxzTG9hZGVkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHByb3BzLnBhZ2luYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BzLnByZWxvYWRzXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHtxdWVyeTogaW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9KSA6IGltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fSBwcm9wcy5xdWVyeU1ldGhvZFxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BzLnF1ZXJ5TmFtZVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwcm9wcy5yYW5zYWNrXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvcHMuc2VsZWN0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvcHMuc2VsZWN0Q29sdW1uc1xuICogQHBhcmFtIHthbnlbXX0gY2FjaGVLZXlzXG4gKiBAcmV0dXJucyB7VXNlQ29sbGVjdGlvblJlc3VsdCAmIFJlY29yZDxzdHJpbmcsIGFueT59XG4gKi9cbmNvbnN0IHVzZUNvbGxlY3Rpb24gPSAocHJvcHMsIGNhY2hlS2V5cyA9IFtdKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhYmlsaXRpZXMsXG4gICAgY29sbGVjdGlvbixcbiAgICBkZWZhdWx0UGFyYW1zLFxuICAgIGdyb3VwQnksXG4gICAgaWZDb25kaXRpb24sXG4gICAgbGltaXQsXG4gICAgbW9kZWxDbGFzcyxcbiAgICBub1JlY29yZHNBdmFpbGFibGVDb250ZW50ID0gdW5kZWZpbmVkLFxuICAgIG5vUmVjb3Jkc0ZvdW5kQ29udGVudCA9IHVuZGVmaW5lZCxcbiAgICBvbk1vZGVsc0xvYWRlZCxcbiAgICBwYWdpbmF0aW9uID0gZmFsc2UsXG4gICAgcHJlbG9hZHMgPSBbXSxcbiAgICBxdWVyeU1ldGhvZCxcbiAgICBxdWVyeU5hbWU6IGluaXRpYWxRdWVyeU5hbWUsXG4gICAgcmFuc2FjayxcbiAgICBzZWxlY3QgPSB7fSxcbiAgICBzZWxlY3RDb2x1bW5zLFxuICAgIC4uLnJlc3RQcm9wc1xuICB9ID0gcHJvcHNcblxuICBpZiAoT2JqZWN0LmtleXMocmVzdFByb3BzKS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHByb3BzIGdpdmVuIHRvIHVzZUNvbGxlY3Rpb246ICR7T2JqZWN0LmtleXMocmVzdFByb3BzKS5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIGNvbnN0IHMgPSB1c2VTaGFwZShwcm9wcylcbiAgY29uc3QgcXVlcnlOYW1lID0gaW5pdGlhbFF1ZXJ5TmFtZSB8fCBkaWdnKG1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKSwgXCJjb2xsZWN0aW9uS2V5XCIpXG4gIGNvbnN0IGxvYWRNb2RlbHNHZW5lcmF0aW9uUmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uUmVmID0gdXNlUmVmKDApXG5cbiAgcy5tZXRhLnF1ZXJ5UGFyYW1zID0gdXNlUXVlcnlQYXJhbXMoKVxuXG4gIGNvbnN0IGhhc1FQYXJhbXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKHMucy5xdWVyeVFOYW1lIGluIHMubS5xdWVyeVBhcmFtcykgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBmYWxzZVxuICB9LCBbXSlcblxuICBjb25zdCBxUGFyYW1zID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChoYXNRUGFyYW1zKCkpIHJldHVybiBKU09OLnBhcnNlKGRpZ2cocy5tLnF1ZXJ5UGFyYW1zLCBzLnMucXVlcnlRTmFtZSkpXG5cbiAgICByZXR1cm4ge31cbiAgfSwgW10pXG5cbiAgcy51c2VTdGF0ZXMoe1xuICAgIG1vZGVsczogdW5kZWZpbmVkLFxuICAgIG92ZXJhbGxDb3VudDogdW5kZWZpbmVkLFxuICAgIHF1ZXJ5OiB1bmRlZmluZWQsXG4gICAgcXVlcnlOYW1lLFxuICAgIHF1ZXJ5UGVyS2V5OiBgJHtxdWVyeU5hbWV9X3BlcmAsXG4gICAgcXVlcnlRTmFtZTogYCR7cXVlcnlOYW1lfV9xYCxcbiAgICBxdWVyeVNOYW1lOiBgJHtxdWVyeU5hbWV9X3NgLFxuICAgIHF1ZXJ5UGFnZU5hbWU6IGAke3F1ZXJ5TmFtZX1fcGFnZWAsXG4gICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgc2VhcmNoUGFyYW1zOiB1bmRlZmluZWQsXG4gICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IGZhbHNlLFxuICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IGZhbHNlXG4gIH0pXG4gIHMudXNlU3RhdGVzKHtcbiAgICBxUGFyYW1zOiAoKSA9PiBxUGFyYW1zKClcbiAgfSlcblxuICBsZXQgbW9kZWxJZHNDYWNoZVN0cmluZ1xuXG4gIGlmIChzLnMubW9kZWxzID09PSB1bmRlZmluZWQpIHtcbiAgICBtb2RlbElkc0NhY2hlU3RyaW5nID0gXCJtb2RlbHMtdW5kZWZpbmVkXCJcbiAgfSBlbHNlIGlmIChzLnMubW9kZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgIG1vZGVsSWRzQ2FjaGVTdHJpbmcgPSBcIm5vLW1vZGVsc1wiXG4gIH0gZWxzZSB7XG4gICAgbW9kZWxJZHNDYWNoZVN0cmluZyA9IHMucy5tb2RlbHMubWFwKChtb2RlbCkgPT4gbW9kZWwuY2FjaGVLZXkoKSk/LmpvaW4oXCItLS1cIilcbiAgfVxuXG4gIGNvbnN0IGxvYWRPdmVyYWxsQ291bnQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgLy8gSWdub3JlIGxhdGUgb3ZlcmFsbC1jb3VudCByZXNwb25zZXMgb25jZSBhIG5ld2VyIGxvYWQgY3ljbGUgaGFzIHN0YXJ0ZWQgb3IgdGhlIGhvb2sgdW5tb3VudGVkLlxuICAgIGNvbnN0IGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uID0gbG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb25SZWYuY3VycmVudCArIDFcblxuICAgIGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uUmVmLmN1cnJlbnQgPSBsb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvblxuXG4gICAgY29uc3QgYmFzZVF1ZXJ5ID0gcy5wLmNvbGxlY3Rpb24gfHwgcy5wLm1vZGVsQ2xhc3MuYWxsKClcbiAgICBjb25zdCBvdmVyYWxsQ291bnQgPSBhd2FpdCBiYXNlUXVlcnkuY291bnQoKVxuXG4gICAgaWYgKGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uICE9IGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuXG4gICAgcy5zZXQoe1xuICAgICAgb3ZlcmFsbENvdW50LFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KHtvdmVyYWxsQ291bnR9KSxcbiAgICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQoe292ZXJhbGxDb3VudH0pXG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgbG9hZFFQYXJhbXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgcVBhcmFtc1RvU2V0ID0gaGFzUVBhcmFtcygpID8gcVBhcmFtcygpIDogT2JqZWN0LmFzc2lnbih7fSwgcy5wcm9wcy5kZWZhdWx0UGFyYW1zKVxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IFtdXG5cbiAgICBpZiAocy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVNOYW1lXSkge1xuICAgICAgZm9yIChjb25zdCByYXdTZWFyY2hQYXJhbSBvZiBzLm0ucXVlcnlQYXJhbXNbcy5zLnF1ZXJ5U05hbWVdKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFNlYXJjaFBhcmFtID0gSlNPTi5wYXJzZShyYXdTZWFyY2hQYXJhbSlcblxuICAgICAgICBzZWFyY2hQYXJhbXMucHVzaChwYXJzZWRTZWFyY2hQYXJhbSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzLnNldCh7XG4gICAgICBxUGFyYW1zOiBxUGFyYW1zVG9TZXQsXG4gICAgICBzZWFyY2hQYXJhbXNcbiAgICB9KVxuICB9LCBbXSlcblxuICBjb25zdCBsb2FkTW9kZWxzID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIC8vIE9ubHkgdGhlIG5ld2VzdCBjb2xsZWN0aW9uIHJlcXVlc3QgaXMgYWxsb3dlZCB0byB1cGRhdGUgc3RhdGUgYWZ0ZXIgbmF2aWdhdGlvbi9maWx0ZXIgY2hhbmdlcy5cbiAgICBjb25zdCBsb2FkTW9kZWxzR2VuZXJhdGlvbiA9IGxvYWRNb2RlbHNHZW5lcmF0aW9uUmVmLmN1cnJlbnQgKyAxXG5cbiAgICBsb2FkTW9kZWxzR2VuZXJhdGlvblJlZi5jdXJyZW50ID0gbG9hZE1vZGVsc0dlbmVyYXRpb25cbiAgICBsZXQgcXVlcnkgPSBzLnByb3BzLmNvbGxlY3Rpb24/LmNsb25lKCkgfHwgcy5wLm1vZGVsQ2xhc3MucmFuc2FjaygpXG5cbiAgICBpZiAocy5wcm9wcy5wYWdpbmF0aW9uKSB7XG4gICAgICBjb25zdCBwYWdlID0gcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVBhZ2VOYW1lXSB8fCAxXG4gICAgICBsZXQgcGVyID0gcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVBlcktleV0gfHwgMzBcblxuICAgICAgaWYgKHBlciA9PSBcImFsbFwiKSB7XG4gICAgICAgIHBlciA9IDk5OV85OTlfOTk5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXIgPSBOdW1iZXIocGVyKVxuICAgICAgfVxuXG4gICAgICBxdWVyeS5wYWdlKHBhZ2UpLnBlcihwZXIpXG4gICAgfVxuXG4gICAgaWYgKHMucHJvcHMuZ3JvdXBCeSkgcXVlcnkgPSBxdWVyeS5ncm91cEJ5KC4uLnMucC5ncm91cEJ5KVxuXG4gICAgcXVlcnkgPSBxdWVyeVxuICAgICAgLnJhbnNhY2socy5zLnFQYXJhbXMpXG4gICAgICAuc2VhcmNoKHMucy5zZWFyY2hQYXJhbXMpXG4gICAgICAuc2VhcmNoS2V5KHMucy5xdWVyeVFOYW1lKVxuICAgICAgLnBhZ2VLZXkocy5zLnF1ZXJ5UGFnZU5hbWUpXG4gICAgICAucGVyS2V5KHMucy5xdWVyeVBlcktleSlcblxuICAgIGlmIChzLnByb3BzLmFiaWxpdGllcykgcXVlcnkuYWJpbGl0aWVzKHMucC5hYmlsaXRpZXMpXG4gICAgaWYgKHMucHJvcHMubGltaXQgIT09IHVuZGVmaW5lZCkgcXVlcnkubGltaXQocy5wLmxpbWl0KVxuICAgIGlmIChzLnByb3BzLnByZWxvYWRzKSBxdWVyeS5wcmVsb2FkKHMucC5wcmVsb2FkcylcbiAgICBpZiAocy5wcm9wcy5yYW5zYWNrKSBxdWVyeS5yYW5zYWNrKHMucHJvcHMucmFuc2FjaylcbiAgICBpZiAocy5wcm9wcy5zZWxlY3QpIHF1ZXJ5LnNlbGVjdChzLnAuc2VsZWN0KVxuICAgIGlmIChzLnByb3BzLnNlbGVjdENvbHVtbnMpIHF1ZXJ5LnNlbGVjdENvbHVtbnMocy5wLnNlbGVjdENvbHVtbnMpXG5cbiAgICBsZXQgcmVzdWx0XG5cbiAgICBpZiAocy5wcm9wcy5xdWVyeU1ldGhvZCkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcy5wLnF1ZXJ5TWV0aG9kKHtxdWVyeX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHF1ZXJ5LnJlc3VsdCgpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxzID0gcmVzdWx0Lm1vZGVscygpXG5cbiAgICBpZiAobG9hZE1vZGVsc0dlbmVyYXRpb24gIT0gbG9hZE1vZGVsc0dlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG5cbiAgICBpZiAocy5wcm9wcy5vbk1vZGVsc0xvYWRlZCkge1xuICAgICAgcy5wLm9uTW9kZWxzTG9hZGVkKHtcbiAgICAgICAgbW9kZWxzLFxuICAgICAgICBxUGFyYW1zOiBzLnMucVBhcmFtcyxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHJlc3VsdFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBzLnNldCh7XG4gICAgICBtb2RlbHM6IHJlc3VsdC5tb2RlbHMoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgcmVzdWx0LFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KHttb2RlbHN9KSxcbiAgICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQoe21vZGVsc30pXG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgbG9hZE1vZGVsc0RlYm91bmNlID0gdXNlQ2FsbGJhY2soZGVib3VuY2UobG9hZE1vZGVscyksIFtdKVxuICBjb25zdCBvbk1vZGVsRGVzdHJveWVkID0gdXNlQ2FsbGJhY2soKGFyZ3MpID0+IHtcbiAgICBzLnNldCh7XG4gICAgICBtb2RlbHM6IHMucy5tb2RlbHMuZmlsdGVyKChtb2RlbCkgPT4gbW9kZWwuaWQoKSAhPSBhcmdzLm1vZGVsLmlkKCkpXG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgb25Nb2RlbFVwZGF0ZWQgPSB1c2VDYWxsYmFjaygoYXJncykgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRNb2RlbCA9IGRpZ2coYXJncywgXCJtb2RlbFwiKVxuICAgIGNvbnN0IGZvdW5kTW9kZWwgPSBzLnMubW9kZWxzLmZpbmQoKG1vZGVsKSA9PiBtb2RlbC5pZCgpID09IHVwZGF0ZWRNb2RlbC5pZCgpKVxuXG4gICAgaWYgKGZvdW5kTW9kZWwpIGxvYWRNb2RlbHNEZWJvdW5jZSgpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50ID0gdXNlQ2FsbGJhY2soKGFyZ3MpID0+IHtcbiAgICBsZXQgbW9kZWxzLCBvdmVyYWxsQ291bnRcblxuICAgIGlmIChhcmdzLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBhcmdzLm1vZGVsc1xuICAgIH0gZWxzZSBpZiAocy5zLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBzLnMubW9kZWxzXG4gICAgfVxuXG4gICAgaWYgKGFyZ3Mub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IGFyZ3Mub3ZlcmFsbENvdW50XG4gICAgfSBlbHNlIGlmIChzLnMub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IHMucy5vdmVyYWxsQ291bnRcbiAgICB9XG5cbiAgICBpZiAobW9kZWxzID09PSB1bmRlZmluZWQgfHwgb3ZlcmFsbENvdW50ID09PSB1bmRlZmluZWQgfHwgcy5wLm5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT09IDAgJiYgb3ZlcmFsbENvdW50ID09PSAwICYmIHMucC5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50KSByZXR1cm4gdHJ1ZVxuICB9LCBbXSlcblxuICBjb25zdCBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50ID0gdXNlQ2FsbGJhY2soKGFyZ3MpID0+IHtcbiAgICBsZXQgbW9kZWxzLCBvdmVyYWxsQ291bnRcblxuICAgIGlmIChhcmdzLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBhcmdzLm1vZGVsc1xuICAgIH0gZWxzZSBpZiAocy5zLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBzLnMubW9kZWxzXG4gICAgfVxuXG4gICAgaWYgKGFyZ3Mub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IGFyZ3Mub3ZlcmFsbENvdW50XG4gICAgfSBlbHNlIGlmIChzLnMub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IHMucy5vdmVyYWxsQ291bnRcbiAgICB9XG5cbiAgICBpZiAobW9kZWxzID09PSB1bmRlZmluZWQgfHwgcy5wcm9wcy5ub1JlY29yZHNGb3VuZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlXG5cbiAgICAvLyBEb250IHNob3cgbm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCB0b2dldGhlciB3aXRoIG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnRcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCAmJiBvdmVyYWxsQ291bnQgPT09IDAgJiYgcy5wcm9wcy5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50KSByZXR1cm4gZmFsc2VcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCAmJiBzLnByb3BzLm5vUmVjb3Jkc0ZvdW5kQ29udGVudCkgcmV0dXJuIHRydWVcbiAgfSwgW10pXG5cbiAgY29uc3Qgb25DcmVhdGVkID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGxvYWRNb2RlbHNEZWJvdW5jZSgpXG4gIH0sIFtdKVxuXG4gIC8vIENvbGxlY3Rpb24gbG9hZGluZyBoYXMgdG8gd2FpdCB1bnRpbCBtb3VudCBzbyBmYXN0IHJlc3BvbnNlcyBjYW5ub3QgZ2V0IHN0cmFuZGVkIGluIFNoYXBlSG9vaydzIHByZS1tb3VudCBxdWV1ZS5cbiAgdXNlRWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGlmICghKFwiaWZDb25kaXRpb25cIiBpbiBzLnByb3BzKSB8fCBzLnByb3BzLmlmQ29uZGl0aW9uKSB7XG4gICAgICAgIGxvYWRRUGFyYW1zKClcbiAgICAgICAgbG9hZE1vZGVscygpXG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgcy5wcm9wcy5pZkNvbmRpdGlvbixcbiAgICAgIHMucy5xdWVyeU5hbWUsXG4gICAgICBzLm0ucXVlcnlQYXJhbXNbcy5zLnF1ZXJ5UU5hbWVdLFxuICAgICAgcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVBhZ2VOYW1lXSxcbiAgICAgIHMubS5xdWVyeVBhcmFtc1tzLnMucXVlcnlQZXJLZXldLFxuICAgICAgcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVNOYW1lXSxcbiAgICAgIGNvbGxlY3Rpb25cbiAgICBdLmNvbmNhdChjYWNoZUtleXMpXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzLnByb3BzLm5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQpIHtcbiAgICAgIGxvYWRPdmVyYWxsQ291bnQoKVxuICAgIH1cbiAgfSwgW21vZGVsQ2xhc3NdKVxuXG4gIHVzZUNyZWF0ZWRFdmVudChzLnAubW9kZWxDbGFzcywgb25DcmVhdGVkKVxuXG4gIC8vIEludmFsaWRhdGUgYW55IGluLWZsaWdodCBhc3luYyByZXNwb25zZXMgc28gdW5tb3VudGVkIGhvb2tzIGNhbm5vdCB3cml0ZSBzdGFsZSBzdGF0ZS5cbiAgdXNlRWZmZWN0KCgpID0+ICgpID0+IHtcbiAgICBsb2FkTW9kZWxzR2VuZXJhdGlvblJlZi5jdXJyZW50ICs9IDFcbiAgICBsb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvblJlZi5jdXJyZW50ICs9IDFcbiAgfSwgW10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IFtdXG5cbiAgICBpZiAocy5zLm1vZGVscykge1xuICAgICAgZm9yKGNvbnN0IG1vZGVsIG9mIHMucy5tb2RlbHMpIHtcbiAgICAgICAgY29ubmVjdGlvbnMucHVzaChNb2RlbEV2ZW50cy5jb25uZWN0VXBkYXRlZChtb2RlbCwgb25Nb2RlbFVwZGF0ZWQpKVxuICAgICAgICBjb25uZWN0aW9ucy5wdXNoKE1vZGVsRXZlbnRzLmNvbm5lY3REZXN0cm95ZWQobW9kZWwsIG9uTW9kZWxEZXN0cm95ZWQpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBmb3IoY29uc3QgY29ubmVjdGlvbiBvZiBjb25uZWN0aW9ucykge1xuICAgICAgICBjb25uZWN0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFttb2RlbElkc0NhY2hlU3RyaW5nXSlcblxuICBjb25zdCByZXN1bHQgPSAvKiogQHR5cGUge1VzZUNvbGxlY3Rpb25SZXN1bHQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoT2JqZWN0LmFzc2lnbih7fSwgcy5zdGF0ZSkpXG4gIGNvbnN0IG1vZGVsVmFyaWFibGVOYW1lID0gaW5mbGVjdGlvbi5wbHVyYWxpemUoaW5mbGVjdGlvbi5jYW1lbGl6ZShtb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCkubmFtZSwgdHJ1ZSkpXG5cbiAgcmVzdWx0Lm1vZGVsSWRzQ2FjaGVTdHJpbmcgPSBtb2RlbElkc0NhY2hlU3RyaW5nXG4gIHJlc3VsdFttb2RlbFZhcmlhYmxlTmFtZV0gPSBzLnMubW9kZWxzXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VDb2xsZWN0aW9uXG4iXX0=
|
|
386
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInVzZS1jb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZGQUE2RjtBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3pELE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQTtBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sV0FBVyxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxPQUFPLENBQUE7QUFDL0IsT0FBTyxlQUFlLE1BQU0sd0JBQXdCLENBQUE7QUFDcEQsT0FBTyxjQUFjLE1BQU0sK0NBQStDLENBQUE7QUFFMUU7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILDhDQUE4QztBQUM5QyxNQUFNLHNCQUF1QixTQUFRLFNBQVM7SUFDNUMsbUJBQW1CO0lBQ25CLFlBQVksS0FBSztRQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNaLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUE7UUFDN0IsSUFBSSxDQUFDLDBCQUEwQixHQUFHLENBQUMsQ0FBQTtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtJQUM5QixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQTtJQUN0RixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLFdBQVc7UUFDVCxPQUFPLEdBQUcsSUFBSSxDQUFDLFNB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QyxDQUFBO0FBRUQsZUFBZSxhQUFhLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycywgbm8tdXNlLWJlZm9yZS1kZWZpbmUsIHByZWZlci1vYmplY3Qtc3ByZWFkLCBzb3J0LWltcG9ydHMgKi9cbmltcG9ydCB7U2hhcGVIb29rLCB1c2VTaGFwZUhvb2t9IGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZVwiXG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcImRlYm91bmNlXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBNb2RlbEV2ZW50cyBmcm9tIFwiLi9tb2RlbC1ldmVudHMuanNcIlxuaW1wb3J0IHt1c2VFZmZlY3R9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgdXNlQ3JlYXRlZEV2ZW50IGZyb20gXCIuL3VzZS1jcmVhdGVkLWV2ZW50LmpzXCJcbmltcG9ydCB1c2VRdWVyeVBhcmFtcyBmcm9tIFwib24tbG9jYXRpb24tY2hhbmdlZC9idWlsZC91c2UtcXVlcnktcGFyYW1zLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVc2VDb2xsZWN0aW9uUmVzdWx0XG4gKiBAcHJvcGVydHkge0FycmF5PGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0Pn0gbW9kZWxzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWxJZHNDYWNoZVN0cmluZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG92ZXJhbGxDb3VudFxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdH0gcXVlcnlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeVBlcktleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHF1ZXJ5UU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeVNOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlQYWdlTmFtZVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3Jlc3VsdC5qc1wiKS5kZWZhdWx0fSByZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHNlYXJjaFBhcmFtc1xuICogQHByb3BlcnR5IHtmYWxzZSB8IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnRcbiAqIEBwcm9wZXJ0eSB7ZmFsc2UgfCBpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IHByb3BzLmFiaWxpdGllc1xuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdH0gcHJvcHMuY29sbGVjdGlvblxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwcm9wcy5kZWZhdWx0UGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcy5ncm91cEJ5XG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiBib29sZWFufSBwcm9wcy5pZkNvbmRpdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IHByb3BzLmxpbWl0XG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdH0gcHJvcHMubW9kZWxDbGFzc1xuICogQHBhcmFtIHtmdW5jdGlvbigpIDogaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBwcm9wcy5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50XG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiBpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IHByb3BzLm5vUmVjb3Jkc0ZvdW5kQ29udGVudFxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogdm9pZH0gcHJvcHMub25Nb2RlbHNMb2FkZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJvcHMucGFnaW5hdGlvblxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHMucHJlbG9hZHNcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oe3F1ZXJ5OiBpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdH0pIDogaW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHByb3BzLnF1ZXJ5TWV0aG9kXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcHMucXVlcnlOYW1lXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHByb3BzLnJhbnNhY2tcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBwcm9wcy5zZWxlY3RcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBwcm9wcy5zZWxlY3RDb2x1bW5zXG4gKiBAcGFyYW0ge2FueVtdfSBjYWNoZUtleXNcbiAqIEByZXR1cm5zIHtVc2VDb2xsZWN0aW9uUmVzdWx0ICYgUmVjb3JkPHN0cmluZywgYW55Pn1cbiAqL1xuLyoqIEhvb2sgc3RhdGUgY29udGFpbmVyIGZvciB1c2VDb2xsZWN0aW9uLiAqL1xuY2xhc3MgVXNlQ29sbGVjdGlvblNoYXBlSG9vayBleHRlbmRzIFNoYXBlSG9vayB7XG4gIC8qKiBDb25zdHJ1Y3Rvci4gKi9cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLmxvYWRNb2RlbHNHZW5lcmF0aW9uID0gMFxuICAgIHRoaXMubG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb24gPSAwXG4gICAgdGhpcy5xdWVyeVBhcmFtcyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHF1ZXJ5TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wLnF1ZXJ5TmFtZSB8fCBkaWdnKHRoaXMucC5tb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCksIFwiY29sbGVjdGlvbktleVwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHF1ZXJ5UGVyS2V5KCkge1xuICAgIHJldHVybiBgJHt0aGlzLnF1ZXJ5TmFtZSgpfV9wZXJgXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgcXVlcnlRTmFtZSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5xdWVyeU5hbWUoKX1fcWBcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBxdWVyeVNOYW1lKCkge1xuICAgIHJldHVybiBgJHt0aGlzLnF1ZXJ5TmFtZSgpfV9zYFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHF1ZXJ5UGFnZU5hbWUoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMucXVlcnlOYW1lKCl9X3BhZ2VgXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgbW9kZWxJZHNDYWNoZVN0cmluZygpIHtcbiAgICBpZiAodGhpcy5zLm1vZGVscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gXCJtb2RlbHMtdW5kZWZpbmVkXCJcbiAgICB9IGVsc2UgaWYgKHRoaXMucy5tb2RlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJuby1tb2RlbHNcIlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5zLm1vZGVscy5tYXAoKG1vZGVsKSA9PiBtb2RlbC5jYWNoZUtleSgpKT8uam9pbihcIi0tLVwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7RnVuY3Rpb24gJiB7Y2xlYXI/OiAoKSA9PiB2b2lkfX0gKi9cbiAgbG9hZE1vZGVsc0RlYm91bmNlKCkge1xuICAgIHJldHVybiB0aGlzLmNhY2hlKFwibG9hZE1vZGVsc0RlYm91bmNlXCIsICgpID0+IGRlYm91bmNlKCgpID0+IHRoaXMubG9hZE1vZGVscygpKSlcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MgKi9cbiAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQoYXJncykge1xuICAgIGxldCBtb2RlbHMsIG92ZXJhbGxDb3VudFxuXG4gICAgaWYgKGFyZ3MubW9kZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGVscyA9IGFyZ3MubW9kZWxzXG4gICAgfSBlbHNlIGlmICh0aGlzLnMubW9kZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGVscyA9IHRoaXMucy5tb2RlbHNcbiAgICB9XG5cbiAgICBpZiAoYXJncy5vdmVyYWxsQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3ZlcmFsbENvdW50ID0gYXJncy5vdmVyYWxsQ291bnRcbiAgICB9IGVsc2UgaWYgKHRoaXMucy5vdmVyYWxsQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3ZlcmFsbENvdW50ID0gdGhpcy5zLm92ZXJhbGxDb3VudFxuICAgIH1cblxuICAgIGlmIChtb2RlbHMgPT09IHVuZGVmaW5lZCB8fCBvdmVyYWxsQ291bnQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnAubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2VcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCAmJiBvdmVyYWxsQ291bnQgPT09IDAgJiYgdGhpcy5wLm5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQpIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzICovXG4gIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQoYXJncykge1xuICAgIGxldCBtb2RlbHMsIG92ZXJhbGxDb3VudFxuXG4gICAgaWYgKGFyZ3MubW9kZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGVscyA9IGFyZ3MubW9kZWxzXG4gICAgfSBlbHNlIGlmICh0aGlzLnMubW9kZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGVscyA9IHRoaXMucy5tb2RlbHNcbiAgICB9XG5cbiAgICBpZiAoYXJncy5vdmVyYWxsQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3ZlcmFsbENvdW50ID0gYXJncy5vdmVyYWxsQ291bnRcbiAgICB9IGVsc2UgaWYgKHRoaXMucy5vdmVyYWxsQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3ZlcmFsbENvdW50ID0gdGhpcy5zLm92ZXJhbGxDb3VudFxuICAgIH1cblxuICAgIGlmIChtb2RlbHMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnAubm9SZWNvcmRzRm91bmRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZVxuXG4gICAgLy8gRG9udCBzaG93IG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQgdG9nZXRoZXIgd2l0aCBub1JlY29yZHNBdmFpbGFibGVDb250ZW50XG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT09IDAgJiYgb3ZlcmFsbENvdW50ID09PSAwICYmIHRoaXMucC5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50KSByZXR1cm4gZmFsc2VcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnAubm9SZWNvcmRzRm91bmRDb250ZW50KSByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBsb2FkT3ZlcmFsbENvdW50ID0gYXN5bmMgKCkgPT4ge1xuICAgIC8vIElnbm9yZSBsYXRlIG92ZXJhbGwtY291bnQgcmVzcG9uc2VzIG9uY2UgYSBuZXdlciBsb2FkIGN5Y2xlIGhhcyBzdGFydGVkIG9yIHRoZSBob29rIHVubW91bnRlZC5cbiAgICBjb25zdCBsb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvbiA9IHRoaXMubG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb24gKyAxXG5cbiAgICB0aGlzLmxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uID0gbG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb25cblxuICAgIGNvbnN0IGJhc2VRdWVyeSA9IHRoaXMucC5jb2xsZWN0aW9uIHx8IHRoaXMucC5tb2RlbENsYXNzLmFsbCgpXG4gICAgY29uc3Qgb3ZlcmFsbENvdW50ID0gYXdhaXQgYmFzZVF1ZXJ5LmNvdW50KClcblxuICAgIGlmIChsb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvbiAhPSB0aGlzLmxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uKSByZXR1cm5cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgb3ZlcmFsbENvdW50LFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHRoaXMuc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQoe292ZXJhbGxDb3VudH0pLFxuICAgICAgc2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudDogdGhpcy5zaG93Tm9SZWNvcmRzRm91bmRDb250ZW50KHtvdmVyYWxsQ291bnR9KVxuICAgIH0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3txUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzZWFyY2hQYXJhbXM6IHN0cmluZ1tdfX0gKi9cbiAgbG9hZFFQYXJhbXMoKSB7XG4gICAgbGV0IHFQYXJhbXNUb1NldCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucC5kZWZhdWx0UGFyYW1zKVxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IFtdXG5cbiAgICBpZiAodGhpcy5xdWVyeVBhcmFtcyAmJiB0aGlzLnF1ZXJ5UU5hbWUoKSBpbiB0aGlzLnF1ZXJ5UGFyYW1zKSB7XG4gICAgICBxUGFyYW1zVG9TZXQgPSBKU09OLnBhcnNlKGRpZ2codGhpcy5xdWVyeVBhcmFtcywgdGhpcy5xdWVyeVFOYW1lKCkpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVNOYW1lKCldKSB7XG4gICAgICBmb3IgKGNvbnN0IHJhd1NlYXJjaFBhcmFtIG9mIHRoaXMucXVlcnlQYXJhbXNbdGhpcy5xdWVyeVNOYW1lKCldKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFNlYXJjaFBhcmFtID0gSlNPTi5wYXJzZShyYXdTZWFyY2hQYXJhbSlcblxuICAgICAgICBzZWFyY2hQYXJhbXMucHVzaChwYXJzZWRTZWFyY2hQYXJhbSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHFQYXJhbXM6IHFQYXJhbXNUb1NldCxcbiAgICAgIHNlYXJjaFBhcmFtc1xuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgcVBhcmFtczogcVBhcmFtc1RvU2V0LFxuICAgICAgc2VhcmNoUGFyYW1zXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc11cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXJncy5xUGFyYW1zXVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5zZWFyY2hQYXJhbXNdXG4gICAqIEByZXR1cm5zIHt7cVBhcmFtczogUmVjb3JkPHN0cmluZywgYW55Piwgc2VhcmNoUGFyYW1zOiBzdHJpbmdbXX19XG4gICAqL1xuICBsb2FkTW9kZWxzQXJncyhhcmdzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcVBhcmFtczogYXJncy5xUGFyYW1zID8/IHRoaXMucy5xUGFyYW1zLFxuICAgICAgc2VhcmNoUGFyYW1zOiBhcmdzLnNlYXJjaFBhcmFtcyA/PyB0aGlzLnMuc2VhcmNoUGFyYW1zXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc11cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXJncy5xUGFyYW1zXVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5zZWFyY2hQYXJhbXNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgbG9hZE1vZGVscyA9IGFzeW5jIChhcmdzID0ge30pID0+IHtcbiAgICAvLyBPbmx5IHRoZSBuZXdlc3QgY29sbGVjdGlvbiByZXF1ZXN0IGlzIGFsbG93ZWQgdG8gdXBkYXRlIHN0YXRlIGFmdGVyIG5hdmlnYXRpb24vZmlsdGVyIGNoYW5nZXMuXG4gICAgY29uc3QgbG9hZE1vZGVsc0dlbmVyYXRpb24gPSB0aGlzLmxvYWRNb2RlbHNHZW5lcmF0aW9uICsgMVxuICAgIGNvbnN0IHtxUGFyYW1zLCBzZWFyY2hQYXJhbXN9ID0gdGhpcy5sb2FkTW9kZWxzQXJncyhhcmdzKVxuXG4gICAgdGhpcy5sb2FkTW9kZWxzR2VuZXJhdGlvbiA9IGxvYWRNb2RlbHNHZW5lcmF0aW9uXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5wLmNvbGxlY3Rpb24/LmNsb25lKCkgfHwgdGhpcy5wLm1vZGVsQ2xhc3MucmFuc2FjaygpXG5cbiAgICBpZiAodGhpcy5wLnBhZ2luYXRpb24pIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBhZ2VOYW1lKCldIHx8IDFcbiAgICAgIGxldCBwZXIgPSB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBlcktleSgpXSB8fCAzMFxuXG4gICAgICBpZiAocGVyID09IFwiYWxsXCIpIHtcbiAgICAgICAgcGVyID0gOTk5Xzk5OV85OTlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlciA9IE51bWJlcihwZXIpXG4gICAgICB9XG5cbiAgICAgIHF1ZXJ5LnBhZ2UocGFnZSkucGVyKHBlcilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wLmdyb3VwQnkpIHF1ZXJ5ID0gcXVlcnkuZ3JvdXBCeSguLi50aGlzLnAuZ3JvdXBCeSlcblxuICAgIHF1ZXJ5ID0gcXVlcnlcbiAgICAgIC5yYW5zYWNrKHFQYXJhbXMpXG4gICAgICAuc2VhcmNoKHNlYXJjaFBhcmFtcylcbiAgICAgIC5zZWFyY2hLZXkodGhpcy5xdWVyeVFOYW1lKCkpXG4gICAgICAucGFnZUtleSh0aGlzLnF1ZXJ5UGFnZU5hbWUoKSlcbiAgICAgIC5wZXJLZXkodGhpcy5xdWVyeVBlcktleSgpKVxuXG4gICAgaWYgKHRoaXMucC5hYmlsaXRpZXMpIHF1ZXJ5LmFiaWxpdGllcyh0aGlzLnAuYWJpbGl0aWVzKVxuICAgIGlmICh0aGlzLnAubGltaXQgIT09IHVuZGVmaW5lZCkgcXVlcnkubGltaXQodGhpcy5wLmxpbWl0KVxuICAgIGlmICh0aGlzLnAucHJlbG9hZHMpIHF1ZXJ5LnByZWxvYWQodGhpcy5wLnByZWxvYWRzKVxuICAgIGlmICh0aGlzLnAucmFuc2FjaykgcXVlcnkucmFuc2Fjayh0aGlzLnAucmFuc2FjaylcbiAgICBpZiAodGhpcy5wLnNlbGVjdCkgcXVlcnkuc2VsZWN0KHRoaXMucC5zZWxlY3QpXG4gICAgaWYgKHRoaXMucC5zZWxlY3RDb2x1bW5zKSBxdWVyeS5zZWxlY3RDb2x1bW5zKHRoaXMucC5zZWxlY3RDb2x1bW5zKVxuXG4gICAgbGV0IHJlc3VsdFxuXG4gICAgaWYgKHRoaXMucC5xdWVyeU1ldGhvZCkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5wLnF1ZXJ5TWV0aG9kKHtxdWVyeX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHF1ZXJ5LnJlc3VsdCgpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxzID0gcmVzdWx0Lm1vZGVscygpXG5cbiAgICBpZiAobG9hZE1vZGVsc0dlbmVyYXRpb24gIT0gdGhpcy5sb2FkTW9kZWxzR2VuZXJhdGlvbikgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5wLm9uTW9kZWxzTG9hZGVkKSB7XG4gICAgICB0aGlzLnAub25Nb2RlbHNMb2FkZWQoe1xuICAgICAgICBtb2RlbHMsXG4gICAgICAgIHFQYXJhbXM6IHRoaXMucy5xUGFyYW1zLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgcmVzdWx0XG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbW9kZWxzLFxuICAgICAgcXVlcnksXG4gICAgICByZXN1bHQsXG4gICAgICBzaG93Tm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudDogdGhpcy5zaG93Tm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCh7bW9kZWxzfSksXG4gICAgICBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50OiB0aGlzLnNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQoe21vZGVsc30pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3ttb2RlbDogaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9fSBhcmdzICovXG4gIG9uTW9kZWxEZXN0cm95ZWQoYXJncykge1xuICAgIGNvbnN0IGRlc3Ryb3llZE1vZGVsID0gZGlnZyhhcmdzLCBcIm1vZGVsXCIpXG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIG1vZGVsczogdGhpcy5zLm1vZGVscy5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5pZCgpICE9IGRlc3Ryb3llZE1vZGVsLmlkKCkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3ttb2RlbDogaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9fSBhcmdzICovXG4gIG9uTW9kZWxVcGRhdGVkKGFyZ3MpIHtcbiAgICBjb25zdCB1cGRhdGVkTW9kZWwgPSBkaWdnKGFyZ3MsIFwibW9kZWxcIilcbiAgICBjb25zdCBmb3VuZE1vZGVsID0gdGhpcy5zLm1vZGVscy5maW5kKChtb2RlbCkgPT4gbW9kZWwuaWQoKSA9PSB1cGRhdGVkTW9kZWwuaWQoKSlcblxuICAgIGlmIChmb3VuZE1vZGVsKSB0aGlzLmxvYWRNb2RlbHNEZWJvdW5jZSgpKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgb25DcmVhdGVkKCkge1xuICAgIHRoaXMubG9hZE1vZGVsc0RlYm91bmNlKCkoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtyZWFkeVRvTG9hZDogdHJ1ZX0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHNldHVwKCkge1xuICAgIHRoaXMudXNlU3RhdGVzKHtcbiAgICAgIG1vZGVsczogdW5kZWZpbmVkLFxuICAgICAgb3ZlcmFsbENvdW50OiB1bmRlZmluZWQsXG4gICAgICBxUGFyYW1zOiB7fSxcbiAgICAgIHF1ZXJ5OiB1bmRlZmluZWQsXG4gICAgICByZWFkeVRvTG9hZDogZmFsc2UsXG4gICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgIHNlYXJjaFBhcmFtczogdW5kZWZpbmVkLFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudDogZmFsc2VcbiAgICB9KVxuICAgIHRoaXMuc2V0SW5zdGFuY2Uoe3F1ZXJ5UGFyYW1zOiB1c2VRdWVyeVBhcmFtcygpfSlcblxuICAgIC8vIFdhaXQgdW50aWwgY29tcG9uZW50RGlkTW91bnQgaGFzIGZsaXBwZWQgcmVhZHlUb0xvYWQgc28gdGhlIGZpcnN0IGxvYWQgcnVucyBhZnRlciB1c2VTaGFwZUhvb2sgaGFzIG1hcmtlZCB0aGUgaG9vayBtb3VudGVkLlxuICAgIHVzZUVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnMucmVhZHlUb0xvYWQpIHJldHVyblxuICAgICAgICBsZXQgaWZDb25kaXRpb25NZXRcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucC5pZkNvbmRpdGlvbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBpZkNvbmRpdGlvbk1ldCA9IHRoaXMucC5pZkNvbmRpdGlvbigpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wLmlmQ29uZGl0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZkNvbmRpdGlvbk1ldCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZkNvbmRpdGlvbk1ldCA9IHRoaXMucC5pZkNvbmRpdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlmQ29uZGl0aW9uTWV0KSB7XG4gICAgICAgICAgY29uc3Qge3FQYXJhbXMsIHNlYXJjaFBhcmFtc30gPSB0aGlzLmxvYWRRUGFyYW1zKClcblxuICAgICAgICAgIHRoaXMubG9hZE1vZGVscyh7cVBhcmFtcywgc2VhcmNoUGFyYW1zfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtcbiAgICAgICAgdGhpcy5wLm1vZGVsQ2xhc3MsXG4gICAgICAgIHRoaXMucC5pZkNvbmRpdGlvbixcbiAgICAgICAgdGhpcy5xdWVyeU5hbWUoKSxcbiAgICAgICAgdGhpcy5xdWVyeVBhcmFtcz8uW3RoaXMucXVlcnlRTmFtZSgpXSxcbiAgICAgICAgdGhpcy5xdWVyeVBhcmFtcz8uW3RoaXMucXVlcnlQYWdlTmFtZSgpXSxcbiAgICAgICAgdGhpcy5xdWVyeVBhcmFtcz8uW3RoaXMucXVlcnlQZXJLZXkoKV0sXG4gICAgICAgIHRoaXMucXVlcnlQYXJhbXM/Llt0aGlzLnF1ZXJ5U05hbWUoKV0sXG4gICAgICAgIHRoaXMucy5yZWFkeVRvTG9hZCxcbiAgICAgICAgdGhpcy5wLmNvbGxlY3Rpb25cbiAgICAgIF0uY29uY2F0KHRoaXMucC5jYWNoZUtleXMpXG4gICAgKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5zLnJlYWR5VG9Mb2FkKSByZXR1cm5cbiAgICAgIGlmICh0aGlzLnAubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCkge1xuICAgICAgICB0aGlzLmxvYWRPdmVyYWxsQ291bnQoKVxuICAgICAgfVxuICAgIH0sIFt0aGlzLnAubW9kZWxDbGFzcywgdGhpcy5zLnJlYWR5VG9Mb2FkXSlcblxuICAgIHVzZUNyZWF0ZWRFdmVudCh0aGlzLnAubW9kZWxDbGFzcywgKCkgPT4gdGhpcy5vbkNyZWF0ZWQoKSlcblxuICAgIC8vIEludmFsaWRhdGUgYW55IGluLWZsaWdodCBhc3luYyByZXNwb25zZXMgc28gdW5tb3VudGVkIGhvb2tzIGNhbm5vdCB3cml0ZSBzdGFsZSBzdGF0ZS5cbiAgICB1c2VFZmZlY3QoKCkgPT4gKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkTW9kZWxzR2VuZXJhdGlvbiArPSAxXG4gICAgICB0aGlzLmxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uICs9IDFcbiAgICAgIHRoaXMubG9hZE1vZGVsc0RlYm91bmNlKCkuY2xlYXI/LigpXG4gICAgfSwgW10pXG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgY29ubmVjdGlvbnMgPSBbXVxuXG4gICAgICBpZiAodGhpcy5zLm1vZGVscykge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHRoaXMucy5tb2RlbHMpIHtcbiAgICAgICAgICBjb25uZWN0aW9ucy5wdXNoKE1vZGVsRXZlbnRzLmNvbm5lY3RVcGRhdGVkKG1vZGVsLCAoYXJncykgPT4gdGhpcy5vbk1vZGVsVXBkYXRlZChhcmdzKSkpXG4gICAgICAgICAgY29ubmVjdGlvbnMucHVzaChNb2RlbEV2ZW50cy5jb25uZWN0RGVzdHJveWVkKG1vZGVsLCAoYXJncykgPT4gdGhpcy5vbk1vZGVsRGVzdHJveWVkKGFyZ3MpKSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIHtcbiAgICAgICAgICBjb25uZWN0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFt0aGlzLm1vZGVsSWRzQ2FjaGVTdHJpbmcoKV0pXG4gIH1cbn1cblxuY29uc3QgdXNlQ29sbGVjdGlvbiA9IChwcm9wcywgY2FjaGVLZXlzID0gW10pID0+IHtcbiAgY29uc3Qge1xuICAgIGFiaWxpdGllcyxcbiAgICBjb2xsZWN0aW9uLFxuICAgIGRlZmF1bHRQYXJhbXMsXG4gICAgZ3JvdXBCeSxcbiAgICBpZkNvbmRpdGlvbixcbiAgICBsaW1pdCxcbiAgICBtb2RlbENsYXNzLFxuICAgIG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQgPSB1bmRlZmluZWQsXG4gICAgbm9SZWNvcmRzRm91bmRDb250ZW50ID0gdW5kZWZpbmVkLFxuICAgIG9uTW9kZWxzTG9hZGVkLFxuICAgIHBhZ2luYXRpb24gPSBmYWxzZSxcbiAgICBwcmVsb2FkcyA9IFtdLFxuICAgIHF1ZXJ5TWV0aG9kLFxuICAgIHF1ZXJ5TmFtZSxcbiAgICByYW5zYWNrLFxuICAgIHNlbGVjdCA9IHt9LFxuICAgIHNlbGVjdENvbHVtbnMsXG4gICAgLi4ucmVzdFByb3BzXG4gIH0gPSBwcm9wc1xuXG4gIGlmIChPYmplY3Qua2V5cyhyZXN0UHJvcHMpLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJvcHMgZ2l2ZW4gdG8gdXNlQ29sbGVjdGlvbjogJHtPYmplY3Qua2V5cyhyZXN0UHJvcHMpLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgY29uc3Qgc2hhcGVIb29rID0gdXNlU2hhcGVIb29rKFVzZUNvbGxlY3Rpb25TaGFwZUhvb2ssIHtcbiAgICBhYmlsaXRpZXMsXG4gICAgY2FjaGVLZXlzLFxuICAgIGNvbGxlY3Rpb24sXG4gICAgZGVmYXVsdFBhcmFtcyxcbiAgICBncm91cEJ5LFxuICAgIGlmQ29uZGl0aW9uLFxuICAgIGxpbWl0LFxuICAgIG1vZGVsQ2xhc3MsXG4gICAgbm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCxcbiAgICBub1JlY29yZHNGb3VuZENvbnRlbnQsXG4gICAgb25Nb2RlbHNMb2FkZWQsXG4gICAgcGFnaW5hdGlvbixcbiAgICBwcmVsb2FkcyxcbiAgICBxdWVyeU1ldGhvZCxcbiAgICBxdWVyeU5hbWUsXG4gICAgcmFuc2FjayxcbiAgICBzZWxlY3QsXG4gICAgc2VsZWN0Q29sdW1uc1xuICB9KVxuICBjb25zdCByZXN1bHQgPSAvKiogQHR5cGUge1VzZUNvbGxlY3Rpb25SZXN1bHQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoT2JqZWN0LmFzc2lnbih7fSwgc2hhcGVIb29rLnN0YXRlKSlcbiAgY29uc3QgbW9kZWxWYXJpYWJsZU5hbWUgPSBpbmZsZWN0aW9uLnBsdXJhbGl6ZShpbmZsZWN0aW9uLmNhbWVsaXplKHNoYXBlSG9vay5wLm1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lLCB0cnVlKSlcblxuICByZXN1bHQubW9kZWxJZHNDYWNoZVN0cmluZyA9IHNoYXBlSG9vay5tb2RlbElkc0NhY2hlU3RyaW5nKClcbiAgcmVzdWx0LnF1ZXJ5TmFtZSA9IHNoYXBlSG9vay5xdWVyeU5hbWUoKVxuICByZXN1bHQucXVlcnlQZXJLZXkgPSBzaGFwZUhvb2sucXVlcnlQZXJLZXkoKVxuICByZXN1bHQucXVlcnlRTmFtZSA9IHNoYXBlSG9vay5xdWVyeVFOYW1lKClcbiAgcmVzdWx0LnF1ZXJ5U05hbWUgPSBzaGFwZUhvb2sucXVlcnlTTmFtZSgpXG4gIHJlc3VsdC5xdWVyeVBhZ2VOYW1lID0gc2hhcGVIb29rLnF1ZXJ5UGFnZU5hbWUoKVxuICByZXN1bHRbbW9kZWxWYXJpYWJsZU5hbWVdID0gc2hhcGVIb29rLnMubW9kZWxzXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VDb2xsZWN0aW9uXG4iXX0=
|