angular-odata 0.122.0 → 0.124.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/api.mjs +373 -0
- package/esm2022/lib/cache/cache.mjs +175 -0
- package/{esm2020 → esm2022}/lib/cache/storage.mjs +1 -1
- package/esm2022/lib/client.mjs +252 -0
- package/{esm2020 → esm2022}/lib/helper.mjs +1 -1
- package/{esm2020 → esm2022}/lib/loaders.mjs +1 -1
- package/esm2022/lib/models/collection.mjs +865 -0
- package/esm2022/lib/models/model.mjs +535 -0
- package/esm2022/lib/models/options.mjs +1117 -0
- package/{esm2020 → esm2022}/lib/module.mjs +5 -5
- package/esm2022/lib/resources/path/segments.mjs +124 -0
- package/esm2022/lib/resources/query/builder.mjs +624 -0
- package/esm2022/lib/resources/query/expressions/base.mjs +20 -0
- package/esm2022/lib/resources/query/expressions/compute.mjs +39 -0
- package/esm2022/lib/resources/query/expressions/count.mjs +99 -0
- package/esm2022/lib/resources/query/expressions/expand.mjs +125 -0
- package/esm2022/lib/resources/query/expressions/filter.mjs +161 -0
- package/esm2022/lib/resources/query/expressions/orderby.mjs +56 -0
- package/esm2022/lib/resources/query/expressions/search.mjs +122 -0
- package/esm2022/lib/resources/query/expressions/select.mjs +31 -0
- package/esm2022/lib/resources/query/expressions/syntax.mjs +444 -0
- package/{esm2020 → esm2022}/lib/resources/query/handlers.mjs +1 -1
- package/esm2022/lib/resources/query/options.mjs +115 -0
- package/{esm2020 → esm2022}/lib/resources/request.mjs +1 -1
- package/esm2022/lib/resources/resource.mjs +257 -0
- package/{esm2020 → esm2022}/lib/resources/responses/annotations.mjs +1 -1
- package/esm2022/lib/resources/responses/csdl/csdl-annotation.mjs +33 -0
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-container.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-enum-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-function-action.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-reference.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-schema.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structural-property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structured-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-type-definition.mjs +1 -1
- package/esm2022/lib/resources/responses/metadata.mjs +547 -0
- package/{esm2020 → esm2022}/lib/resources/responses/response.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/action.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/batch.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/count.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/entity.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/function.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/media.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/navigation-property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/reference.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/value.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/annotation.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/callable.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/element.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/entity-container.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/enum-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/parsers/callable.mjs +1 -1
- package/esm2022/lib/schema/parsers/edm.mjs +99 -0
- package/{esm2020 → esm2022}/lib/schema/parsers/enum-type.mjs +2 -2
- package/esm2022/lib/schema/parsers/structured-type.mjs +502 -0
- package/{esm2020 → esm2022}/lib/schema/schema.mjs +1 -1
- package/esm2022/lib/schema/structured-type.mjs +207 -0
- package/esm2022/lib/services/base.mjs +29 -0
- package/{esm2020 → esm2022}/lib/services/entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/services/factory.mjs +4 -4
- package/{esm2020 → esm2022}/lib/services/singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/settings.mjs +1 -1
- package/{esm2020 → esm2022}/lib/types.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/arrays.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/durations.mjs +1 -1
- package/esm2022/lib/utils/enums.mjs +61 -0
- package/{esm2020 → esm2022}/lib/utils/http.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/objects.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/odata.mjs +1 -1
- package/esm2022/lib/utils/types.mjs +136 -0
- package/{fesm2020 → fesm2022}/angular-odata.mjs +544 -373
- package/fesm2022/angular-odata.mjs.map +1 -0
- package/lib/helper.d.ts +1 -1
- package/lib/models/model.d.ts +4 -2
- package/lib/models/options.d.ts +7 -8
- package/lib/resources/path/segments.d.ts +15 -6
- package/lib/resources/query/builder.d.ts +21 -20
- package/lib/resources/query/expressions/base.d.ts +6 -4
- package/lib/resources/query/expressions/compute.d.ts +10 -8
- package/lib/resources/query/expressions/count.d.ts +14 -11
- package/lib/resources/query/expressions/expand.d.ts +23 -19
- package/lib/resources/query/expressions/filter.d.ts +22 -20
- package/lib/resources/query/expressions/orderby.d.ts +12 -9
- package/lib/resources/query/expressions/search.d.ts +12 -9
- package/lib/resources/query/expressions/select.d.ts +9 -7
- package/lib/resources/query/expressions/syntax.d.ts +75 -71
- package/lib/resources/query/handlers.d.ts +2 -2
- package/lib/resources/query/options.d.ts +15 -6
- package/lib/resources/resource.d.ts +2 -2
- package/lib/resources/responses/types.d.ts +3 -3
- package/lib/resources/types/options.d.ts +7 -7
- package/lib/schema/parsers/structured-type.d.ts +8 -5
- package/lib/schema/structured-type.d.ts +2 -1
- package/lib/types.d.ts +15 -15
- package/lib/utils/durations.d.ts +1 -1
- package/lib/utils/enums.d.ts +3 -0
- package/lib/utils/types.d.ts +1 -0
- package/package.json +9 -15
- package/esm2020/lib/api.mjs +0 -373
- package/esm2020/lib/cache/cache.mjs +0 -173
- package/esm2020/lib/client.mjs +0 -252
- package/esm2020/lib/models/collection.mjs +0 -861
- package/esm2020/lib/models/model.mjs +0 -507
- package/esm2020/lib/models/options.mjs +0 -1110
- package/esm2020/lib/resources/path/segments.mjs +0 -124
- package/esm2020/lib/resources/query/builder.mjs +0 -588
- package/esm2020/lib/resources/query/expressions/base.mjs +0 -20
- package/esm2020/lib/resources/query/expressions/compute.mjs +0 -39
- package/esm2020/lib/resources/query/expressions/count.mjs +0 -89
- package/esm2020/lib/resources/query/expressions/expand.mjs +0 -115
- package/esm2020/lib/resources/query/expressions/filter.mjs +0 -161
- package/esm2020/lib/resources/query/expressions/orderby.mjs +0 -56
- package/esm2020/lib/resources/query/expressions/search.mjs +0 -122
- package/esm2020/lib/resources/query/expressions/select.mjs +0 -31
- package/esm2020/lib/resources/query/expressions/syntax.mjs +0 -409
- package/esm2020/lib/resources/query/options.mjs +0 -115
- package/esm2020/lib/resources/resource.mjs +0 -251
- package/esm2020/lib/resources/responses/csdl/csdl-annotation.mjs +0 -33
- package/esm2020/lib/resources/responses/metadata.mjs +0 -547
- package/esm2020/lib/schema/parsers/edm.mjs +0 -104
- package/esm2020/lib/schema/parsers/structured-type.mjs +0 -490
- package/esm2020/lib/schema/structured-type.mjs +0 -202
- package/esm2020/lib/services/base.mjs +0 -29
- package/esm2020/lib/utils/enums.mjs +0 -45
- package/esm2020/lib/utils/types.mjs +0 -133
- package/fesm2015/angular-odata.mjs +0 -11811
- package/fesm2015/angular-odata.mjs.map +0 -1
- package/fesm2020/angular-odata.mjs.map +0 -1
- /package/{esm2020 → esm2022}/angular-odata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/memory.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/path/handlers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/path/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/query/expressions/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/query/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/types.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/metadata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/entity-set.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/parsers/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/entity.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/arraybuffers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/dates.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/strings.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/urls.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
|
@@ -1,861 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from '@angular/core';
|
|
2
|
-
import { forkJoin, Observable, of, throwError } from 'rxjs';
|
|
3
|
-
import { finalize, map, switchMap } from 'rxjs/operators';
|
|
4
|
-
import { DEFAULT_VERSION } from '../constants';
|
|
5
|
-
import { ODataHelper } from '../helper';
|
|
6
|
-
import { ODataEntitiesAnnotations, ODataEntityAnnotations, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
|
|
7
|
-
import { Types } from '../utils/types';
|
|
8
|
-
import { BUBBLING, INCLUDE_DEEP, INCLUDE_SHALLOW, ODataModelEvent, ODataModelEventType, ODataModelOptions, ODataModelState, } from './options';
|
|
9
|
-
export class ODataCollection {
|
|
10
|
-
constructor(entities = [], { parent, resource, annots, model, reset = false, } = {}) {
|
|
11
|
-
this._parent = null;
|
|
12
|
-
this._resource = null;
|
|
13
|
-
this._resources = [];
|
|
14
|
-
this._entries = [];
|
|
15
|
-
//Events
|
|
16
|
-
this.events$ = new EventEmitter();
|
|
17
|
-
this._sortBy = null;
|
|
18
|
-
const Klass = this.constructor;
|
|
19
|
-
if (model === undefined && Klass.model !== null)
|
|
20
|
-
model = Klass.model;
|
|
21
|
-
if (model === undefined)
|
|
22
|
-
throw new Error('Collection: Collection need model');
|
|
23
|
-
this._model = model;
|
|
24
|
-
// Parent
|
|
25
|
-
if (parent !== undefined) {
|
|
26
|
-
this._parent = parent;
|
|
27
|
-
}
|
|
28
|
-
// Resource
|
|
29
|
-
if (this._parent === null && resource === undefined)
|
|
30
|
-
resource = this._model.meta.collectionResourceFactory();
|
|
31
|
-
if (resource !== undefined) {
|
|
32
|
-
this.attach(resource);
|
|
33
|
-
}
|
|
34
|
-
// Annotations
|
|
35
|
-
this._annotations =
|
|
36
|
-
annots ||
|
|
37
|
-
new ODataEntitiesAnnotations(ODataHelper[resource?.api?.options.version || DEFAULT_VERSION]);
|
|
38
|
-
entities = entities || [];
|
|
39
|
-
this.assign(entities, { reset });
|
|
40
|
-
}
|
|
41
|
-
models() {
|
|
42
|
-
return this._entries
|
|
43
|
-
.filter((e) => e.state !== ODataModelState.Removed)
|
|
44
|
-
.map((e) => e.model);
|
|
45
|
-
}
|
|
46
|
-
get length() {
|
|
47
|
-
return this.models().length;
|
|
48
|
-
}
|
|
49
|
-
isParentOf(child) {
|
|
50
|
-
return (child !== this &&
|
|
51
|
-
ODataModelOptions.chain(child).some((p) => p[0] === this));
|
|
52
|
-
}
|
|
53
|
-
resource() {
|
|
54
|
-
return ODataModelOptions.resource(this);
|
|
55
|
-
}
|
|
56
|
-
pushResource(resource) {
|
|
57
|
-
// Push current parent and resource
|
|
58
|
-
this._resources.push({ parent: this._parent, resource: this._resource });
|
|
59
|
-
// Replace parent and resource
|
|
60
|
-
this._parent = null;
|
|
61
|
-
this._resource = resource;
|
|
62
|
-
}
|
|
63
|
-
popResource() {
|
|
64
|
-
// Pop parent and resource
|
|
65
|
-
const pop = this._resources.pop();
|
|
66
|
-
if (pop !== undefined) {
|
|
67
|
-
const current = { parent: this._parent, resource: this._resource };
|
|
68
|
-
this._parent = pop.parent;
|
|
69
|
-
this._resource = pop.resource;
|
|
70
|
-
return current;
|
|
71
|
-
}
|
|
72
|
-
return undefined;
|
|
73
|
-
}
|
|
74
|
-
attach(resource) {
|
|
75
|
-
if (this._resource !== null &&
|
|
76
|
-
this._resource.type() !== resource.type() &&
|
|
77
|
-
!this._resource.isSubtypeOf(resource))
|
|
78
|
-
throw new Error(`attach: Can't reattach ${this._resource.type()} to ${resource.type()}`);
|
|
79
|
-
this._entries.forEach(({ model }) => {
|
|
80
|
-
const modelResource = this._model.meta.modelResourceFactory(resource.cloneQuery());
|
|
81
|
-
if (modelResource !== undefined)
|
|
82
|
-
model.attach(modelResource);
|
|
83
|
-
});
|
|
84
|
-
const current = this._resource;
|
|
85
|
-
if (current === null || !current.isEqualTo(resource)) {
|
|
86
|
-
this._resource = resource;
|
|
87
|
-
this.events$.emit(new ODataModelEvent(ODataModelEventType.Attach, {
|
|
88
|
-
collection: this,
|
|
89
|
-
previous: current,
|
|
90
|
-
value: resource,
|
|
91
|
-
}));
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
withResource(resource, ctx) {
|
|
95
|
-
// Push
|
|
96
|
-
this.pushResource(resource);
|
|
97
|
-
// Execute
|
|
98
|
-
const result = ctx(this);
|
|
99
|
-
if (result instanceof Observable) {
|
|
100
|
-
return result.pipe(finalize(() => this.popResource()));
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
// Pop
|
|
104
|
-
this.popResource();
|
|
105
|
-
return result;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
asEntitySet(ctx) {
|
|
109
|
-
// Build new resource
|
|
110
|
-
const query = this._resource?.cloneQuery();
|
|
111
|
-
let resource = this._model.meta.collectionResourceFactory(query);
|
|
112
|
-
if (resource === undefined)
|
|
113
|
-
throw new Error('asEntitySet: Collection does not have associated EntitySet endpoint');
|
|
114
|
-
return this.withResource(resource, ctx);
|
|
115
|
-
}
|
|
116
|
-
annots() {
|
|
117
|
-
return this._annotations;
|
|
118
|
-
}
|
|
119
|
-
modelFactory(data, { reset = false } = {}) {
|
|
120
|
-
let Model = this._model;
|
|
121
|
-
const annots = new ODataEntityAnnotations(this._annotations.helper);
|
|
122
|
-
annots.update(data);
|
|
123
|
-
if (annots?.type !== undefined && Model.meta !== null) {
|
|
124
|
-
let schema = Model.meta.findChildOptions((o) => o.isTypeOf(annots.type))?.schema;
|
|
125
|
-
if (schema !== undefined && schema.model !== undefined)
|
|
126
|
-
// Change to child model
|
|
127
|
-
Model = schema.model;
|
|
128
|
-
}
|
|
129
|
-
return new Model(data, {
|
|
130
|
-
annots,
|
|
131
|
-
reset,
|
|
132
|
-
parent: [this, null],
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
toEntities({ client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
|
|
136
|
-
return this._entries
|
|
137
|
-
.filter(({ model, state }) => state !== ODataModelState.Removed && chain.every((c) => c !== model))
|
|
138
|
-
.map(({ model, state }) => {
|
|
139
|
-
var changesOnly = changes_only && state !== ODataModelState.Added;
|
|
140
|
-
return model.toEntity({
|
|
141
|
-
client_id,
|
|
142
|
-
include_navigation,
|
|
143
|
-
include_concurrency,
|
|
144
|
-
include_computed,
|
|
145
|
-
include_key,
|
|
146
|
-
include_non_field,
|
|
147
|
-
field_mapping,
|
|
148
|
-
changes_only: changesOnly,
|
|
149
|
-
chain: [this, ...chain],
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
toJSON() {
|
|
154
|
-
return this.toEntities();
|
|
155
|
-
}
|
|
156
|
-
hasChanged({ include_navigation } = {}) {
|
|
157
|
-
return (this._entries.some((e) => e.state !== ODataModelState.Unchanged) ||
|
|
158
|
-
this.models().some((m) => m.hasChanged({ include_navigation })));
|
|
159
|
-
}
|
|
160
|
-
clone() {
|
|
161
|
-
let Ctor = this.constructor;
|
|
162
|
-
return new Ctor(this.toEntities(INCLUDE_SHALLOW), {
|
|
163
|
-
resource: this.resource(),
|
|
164
|
-
annots: this.annots(),
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
_request(obs$, { remove } = {}) {
|
|
168
|
-
this.events$.emit(new ODataModelEvent(ODataModelEventType.Request, {
|
|
169
|
-
collection: this,
|
|
170
|
-
options: { observable: obs$ },
|
|
171
|
-
}));
|
|
172
|
-
return obs$.pipe(map(({ entities, annots }) => {
|
|
173
|
-
this._annotations = annots;
|
|
174
|
-
const models = (entities || []).map((entity) => this.modelFactory(entity, { reset: true }));
|
|
175
|
-
this.assign(models, { reset: true, remove });
|
|
176
|
-
this.events$.emit(new ODataModelEvent(ODataModelEventType.Sync, {
|
|
177
|
-
collection: this,
|
|
178
|
-
options: { models, entities, annots },
|
|
179
|
-
}));
|
|
180
|
-
return models;
|
|
181
|
-
}));
|
|
182
|
-
}
|
|
183
|
-
fetch({ withCount, remove, ...options } = {}) {
|
|
184
|
-
const resource = this.resource();
|
|
185
|
-
const obs$ = resource instanceof ODataEntitySetResource
|
|
186
|
-
? resource.fetch({ withCount, ...options })
|
|
187
|
-
: resource.fetch({
|
|
188
|
-
responseType: 'entities',
|
|
189
|
-
withCount,
|
|
190
|
-
...options,
|
|
191
|
-
});
|
|
192
|
-
return this._request(obs$, { remove });
|
|
193
|
-
}
|
|
194
|
-
fetchAll({ withCount, remove, ...options } = {}) {
|
|
195
|
-
const resource = this.resource();
|
|
196
|
-
const obs$ = resource.fetchAll({ withCount, ...options });
|
|
197
|
-
return this._request(obs$, { remove });
|
|
198
|
-
}
|
|
199
|
-
fetchMany(top, { withCount, remove, ...options } = {}) {
|
|
200
|
-
const resource = this.resource();
|
|
201
|
-
resource.query((q) => remove || this.length == 0 ? q.skip().clear() : q.skip(this.length));
|
|
202
|
-
const obs$ = resource.fetchMany(top, { withCount, ...options });
|
|
203
|
-
return this._request(obs$, { remove: remove ?? false });
|
|
204
|
-
}
|
|
205
|
-
fetchOne({ withCount, remove, ...options } = {}) {
|
|
206
|
-
return this.fetchMany(1, { withCount, remove, ...options }).pipe(map((models) => models[0]));
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Save all models in the collection
|
|
210
|
-
* @param relModel The model is relationship
|
|
211
|
-
* @param method The method to use
|
|
212
|
-
* @param options HttpOptions
|
|
213
|
-
*/
|
|
214
|
-
save({ relModel = false, method, ...options } = {}) {
|
|
215
|
-
const resource = this.resource();
|
|
216
|
-
if (resource instanceof ODataPropertyResource)
|
|
217
|
-
return throwError(() => new Error('save: Resource is ODataPropertyResource'));
|
|
218
|
-
let toDestroyEntity = [];
|
|
219
|
-
let toRemoveReference = [];
|
|
220
|
-
let toDestroyContained = [];
|
|
221
|
-
let toCreateEntity = [];
|
|
222
|
-
let toAddReference = [];
|
|
223
|
-
let toCreateContained = [];
|
|
224
|
-
let toUpdateEntity = [];
|
|
225
|
-
let toUpdateContained = [];
|
|
226
|
-
this._entries.forEach(({ model, state }) => {
|
|
227
|
-
if (state === ODataModelState.Removed) {
|
|
228
|
-
if (relModel) {
|
|
229
|
-
toDestroyEntity.push(model);
|
|
230
|
-
}
|
|
231
|
-
else if (!model.isNew()) {
|
|
232
|
-
toRemoveReference.push(model);
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
toDestroyContained.push(model);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
else if (state === ODataModelState.Added) {
|
|
239
|
-
if (relModel) {
|
|
240
|
-
toCreateEntity.push(model);
|
|
241
|
-
}
|
|
242
|
-
else if (!model.isNew()) {
|
|
243
|
-
toAddReference.push(model);
|
|
244
|
-
}
|
|
245
|
-
else {
|
|
246
|
-
toCreateContained.push(model);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
else if (model.hasChanged()) {
|
|
250
|
-
toUpdateEntity.push(model);
|
|
251
|
-
}
|
|
252
|
-
});
|
|
253
|
-
if (toDestroyEntity.length > 0 ||
|
|
254
|
-
toRemoveReference.length > 0 ||
|
|
255
|
-
toDestroyContained.length > 0 ||
|
|
256
|
-
toCreateEntity.length > 0 ||
|
|
257
|
-
toAddReference.length > 0 ||
|
|
258
|
-
toCreateContained.length > 0 ||
|
|
259
|
-
toUpdateEntity.length > 0 ||
|
|
260
|
-
toUpdateContained.length > 0) {
|
|
261
|
-
const obs$ = forkJoin([
|
|
262
|
-
...toDestroyEntity.map((m) => m.asEntity((e) => e.destroy(options))),
|
|
263
|
-
...toRemoveReference.map((m) => this.removeReference(m, options)),
|
|
264
|
-
...toDestroyContained.map((m) => m.destroy(options)),
|
|
265
|
-
...toCreateEntity.map((m) => m.asEntity((e) => e.save({ method: 'create', ...options }))),
|
|
266
|
-
...toAddReference.map((m) => this.addReference(m, options)),
|
|
267
|
-
...toCreateContained.map((m) => m.save({ method: 'create', ...options })),
|
|
268
|
-
...toUpdateEntity.map((m) => m.asEntity((e) => e.save({ method, ...options }))),
|
|
269
|
-
...toUpdateContained.map((m) => m.save({ method, ...options })),
|
|
270
|
-
]);
|
|
271
|
-
this.events$.emit(new ODataModelEvent(ODataModelEventType.Request, {
|
|
272
|
-
collection: this,
|
|
273
|
-
options: { observable: obs$ },
|
|
274
|
-
}));
|
|
275
|
-
return obs$.pipe(map(() => {
|
|
276
|
-
this._entries = this._entries
|
|
277
|
-
.filter((entry) => entry.state !== ODataModelState.Removed)
|
|
278
|
-
.map((entry) => ({ ...entry, state: ODataModelState.Unchanged }));
|
|
279
|
-
this.events$.emit(new ODataModelEvent(ODataModelEventType.Sync, { collection: this }));
|
|
280
|
-
return this;
|
|
281
|
-
}));
|
|
282
|
-
}
|
|
283
|
-
return of(this);
|
|
284
|
-
}
|
|
285
|
-
addReference(model, options) {
|
|
286
|
-
const resource = this.resource();
|
|
287
|
-
if (!model.isNew() && resource instanceof ODataNavigationPropertyResource) {
|
|
288
|
-
return resource
|
|
289
|
-
.reference()
|
|
290
|
-
.add(model._meta.entityResource(model), options)
|
|
291
|
-
.pipe(map(() => model));
|
|
292
|
-
}
|
|
293
|
-
return of(model);
|
|
294
|
-
}
|
|
295
|
-
_addModel(model, { silent = false, reset = false, reparent = false, merge = false, position = -1, } = {}) {
|
|
296
|
-
const key = model.key();
|
|
297
|
-
let entry = this._findEntry({
|
|
298
|
-
model,
|
|
299
|
-
key,
|
|
300
|
-
cid: model[this._model.meta.cid],
|
|
301
|
-
});
|
|
302
|
-
if (entry !== undefined && entry.state !== ODataModelState.Removed) {
|
|
303
|
-
if (merge) {
|
|
304
|
-
entry.model.assign(model.toEntity());
|
|
305
|
-
}
|
|
306
|
-
return entry.model;
|
|
307
|
-
}
|
|
308
|
-
if (entry !== undefined && entry.state === ODataModelState.Removed) {
|
|
309
|
-
const index = this._entries.indexOf(entry);
|
|
310
|
-
this._entries.splice(index, 1);
|
|
311
|
-
}
|
|
312
|
-
// Create Entry
|
|
313
|
-
entry = {
|
|
314
|
-
state: reset ? ODataModelState.Unchanged : ODataModelState.Added,
|
|
315
|
-
model,
|
|
316
|
-
key: model.key(),
|
|
317
|
-
};
|
|
318
|
-
// Set Parent
|
|
319
|
-
if (reparent)
|
|
320
|
-
model._parent = [this, null];
|
|
321
|
-
// Subscribe
|
|
322
|
-
this._link(entry);
|
|
323
|
-
// Now add
|
|
324
|
-
if (position >= 0)
|
|
325
|
-
this._entries.splice(position, 0, entry);
|
|
326
|
-
else
|
|
327
|
-
this._entries.push(entry);
|
|
328
|
-
if (!silent) {
|
|
329
|
-
model.events$.emit(new ODataModelEvent(ODataModelEventType.Add, {
|
|
330
|
-
model,
|
|
331
|
-
collection: this,
|
|
332
|
-
}));
|
|
333
|
-
}
|
|
334
|
-
return entry.model;
|
|
335
|
-
}
|
|
336
|
-
addModel(model, { silent = false, reset = false, reparent = false, merge = false, position = -1, } = {}) {
|
|
337
|
-
if (position < 0)
|
|
338
|
-
position = this._bisect(model);
|
|
339
|
-
const added = this._addModel(model, {
|
|
340
|
-
silent,
|
|
341
|
-
reset,
|
|
342
|
-
merge,
|
|
343
|
-
position,
|
|
344
|
-
reparent,
|
|
345
|
-
});
|
|
346
|
-
if (!silent && added !== undefined) {
|
|
347
|
-
this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
|
|
348
|
-
collection: this,
|
|
349
|
-
options: { added: [added], removed: [], merged: [] },
|
|
350
|
-
}));
|
|
351
|
-
}
|
|
352
|
-
return added;
|
|
353
|
-
}
|
|
354
|
-
add(model, { silent = false, reparent = false, server = true, merge = false, position = -1, } = {}) {
|
|
355
|
-
if (server) {
|
|
356
|
-
return this.addReference(model).pipe(map((model) => {
|
|
357
|
-
return this.addModel(model, {
|
|
358
|
-
silent,
|
|
359
|
-
position,
|
|
360
|
-
reparent,
|
|
361
|
-
merge,
|
|
362
|
-
reset: true,
|
|
363
|
-
});
|
|
364
|
-
}));
|
|
365
|
-
}
|
|
366
|
-
else {
|
|
367
|
-
return of(this.addModel(model, { silent, position, merge, reparent }));
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
removeReference(model, options) {
|
|
371
|
-
let resource = this.resource();
|
|
372
|
-
if (!model.isNew() && resource instanceof ODataNavigationPropertyResource) {
|
|
373
|
-
let target = this._model.meta.api.options.deleteRefBy === 'id'
|
|
374
|
-
? model._meta.entityResource(model)
|
|
375
|
-
: undefined;
|
|
376
|
-
if (this._model.meta.api.options.deleteRefBy === 'path') {
|
|
377
|
-
resource = resource.key(model.key());
|
|
378
|
-
}
|
|
379
|
-
return resource
|
|
380
|
-
.reference()
|
|
381
|
-
.remove(target, options)
|
|
382
|
-
.pipe(map(() => model));
|
|
383
|
-
}
|
|
384
|
-
return of(model);
|
|
385
|
-
}
|
|
386
|
-
_removeModel(model, { silent = false, reset = false, } = {}) {
|
|
387
|
-
const key = model.key();
|
|
388
|
-
let entry = this._findEntry({
|
|
389
|
-
model,
|
|
390
|
-
key,
|
|
391
|
-
cid: model[this._model.meta.cid],
|
|
392
|
-
});
|
|
393
|
-
if (entry === undefined || entry.state === ODataModelState.Removed) {
|
|
394
|
-
return model;
|
|
395
|
-
}
|
|
396
|
-
// Emit Event
|
|
397
|
-
if (!silent)
|
|
398
|
-
model.events$.emit(new ODataModelEvent(ODataModelEventType.Remove, {
|
|
399
|
-
model,
|
|
400
|
-
collection: this,
|
|
401
|
-
}));
|
|
402
|
-
// Now remove
|
|
403
|
-
const index = this._entries.indexOf(entry);
|
|
404
|
-
this._entries.splice(index, 1);
|
|
405
|
-
if (!(reset || entry.state === ODataModelState.Added)) {
|
|
406
|
-
// Move to end of array and mark as removed
|
|
407
|
-
entry.state = ODataModelState.Removed;
|
|
408
|
-
this._entries.push(entry);
|
|
409
|
-
}
|
|
410
|
-
this._unlink(entry);
|
|
411
|
-
return entry.model;
|
|
412
|
-
}
|
|
413
|
-
removeModel(model, { silent = false, reset = false, } = {}) {
|
|
414
|
-
const removed = this._removeModel(model, { silent, reset });
|
|
415
|
-
if (!silent && removed !== undefined) {
|
|
416
|
-
this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
|
|
417
|
-
collection: this,
|
|
418
|
-
options: { added: [], removed: [removed], merged: [] },
|
|
419
|
-
}));
|
|
420
|
-
}
|
|
421
|
-
return removed;
|
|
422
|
-
}
|
|
423
|
-
remove(model, { silent = false, server = true, } = {}) {
|
|
424
|
-
if (server) {
|
|
425
|
-
return this.removeReference(model).pipe(map((model) => this.removeModel(model, { silent, reset: true })));
|
|
426
|
-
}
|
|
427
|
-
else {
|
|
428
|
-
return of(this.removeModel(model, { silent }));
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
_moveModel(model, position) {
|
|
432
|
-
const key = model.key();
|
|
433
|
-
let entry = this._findEntry({
|
|
434
|
-
model,
|
|
435
|
-
key,
|
|
436
|
-
cid: model[this._model.meta.cid],
|
|
437
|
-
});
|
|
438
|
-
if (entry === undefined || entry.state === ODataModelState.Removed) {
|
|
439
|
-
return model;
|
|
440
|
-
}
|
|
441
|
-
// Now remove
|
|
442
|
-
const index = this._entries.indexOf(entry);
|
|
443
|
-
this._entries.splice(index, 1);
|
|
444
|
-
this._entries.splice(position, 0, entry);
|
|
445
|
-
return entry.model;
|
|
446
|
-
}
|
|
447
|
-
create(attrs = {}, { silent = false, server = true, } = {}) {
|
|
448
|
-
const model = this.modelFactory(attrs);
|
|
449
|
-
return (model.isValid() && server ? model.save() : of(model)).pipe(switchMap((model) => this.add(model, { silent, server })), map(() => model));
|
|
450
|
-
}
|
|
451
|
-
set(path, value, {}) {
|
|
452
|
-
const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
|
|
453
|
-
if (pathArray.length === 0)
|
|
454
|
-
return undefined;
|
|
455
|
-
if (pathArray.length > 1) {
|
|
456
|
-
const model = this._entries[Number(pathArray[0])].model;
|
|
457
|
-
return model.set(pathArray.slice(1), value, {});
|
|
458
|
-
}
|
|
459
|
-
if (pathArray.length === 1 && ODataModelOptions.isModel(value)) {
|
|
460
|
-
let toAdd = [];
|
|
461
|
-
let toChange = [];
|
|
462
|
-
let toRemove = [];
|
|
463
|
-
let index = Number(pathArray[0]);
|
|
464
|
-
const model = this.models()[index];
|
|
465
|
-
const entry = this._findEntry({ model });
|
|
466
|
-
if (entry !== undefined) {
|
|
467
|
-
//TODO: Remove/Add or Merge?
|
|
468
|
-
// Merge
|
|
469
|
-
entry.model.assign(value.toEntity({ client_id: true, ...INCLUDE_DEEP }));
|
|
470
|
-
if (entry.model.hasChanged())
|
|
471
|
-
toChange.push(model);
|
|
472
|
-
}
|
|
473
|
-
else {
|
|
474
|
-
// Add
|
|
475
|
-
this._addModel(value, { reparent: true });
|
|
476
|
-
toAdd.push(model);
|
|
477
|
-
}
|
|
478
|
-
this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
|
|
479
|
-
collection: this,
|
|
480
|
-
options: { added: toAdd, removed: toRemove, changed: toChange },
|
|
481
|
-
}));
|
|
482
|
-
return value;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
get(path) {
|
|
486
|
-
const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
|
|
487
|
-
if (pathArray.length === 0)
|
|
488
|
-
return undefined;
|
|
489
|
-
const value = this.models()[Number(pathArray[0])];
|
|
490
|
-
if (pathArray.length > 1 && ODataModelOptions.isModel(value)) {
|
|
491
|
-
return value.get(pathArray.slice(1));
|
|
492
|
-
}
|
|
493
|
-
return value;
|
|
494
|
-
}
|
|
495
|
-
has(path) {
|
|
496
|
-
const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
|
|
497
|
-
if (pathArray.length === 0)
|
|
498
|
-
return false;
|
|
499
|
-
const value = this.models()[Number(pathArray[0])];
|
|
500
|
-
if (pathArray.length > 1 && ODataModelOptions.isModel(value)) {
|
|
501
|
-
return value.has(pathArray.slice(1));
|
|
502
|
-
}
|
|
503
|
-
return value !== undefined;
|
|
504
|
-
}
|
|
505
|
-
reset({ path, silent = false, } = {}) {
|
|
506
|
-
let toAdd = [];
|
|
507
|
-
let toChange = [];
|
|
508
|
-
let toRemove = [];
|
|
509
|
-
if (path !== undefined) {
|
|
510
|
-
// Reset by path
|
|
511
|
-
const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
|
|
512
|
-
const index = Number(pathArray[0]);
|
|
513
|
-
if (!Number.isNaN(index)) {
|
|
514
|
-
const model = this.models()[index];
|
|
515
|
-
if (ODataModelOptions.isModel(model)) {
|
|
516
|
-
const entry = this._findEntry({ model });
|
|
517
|
-
if (entry.state === ODataModelState.Unchanged &&
|
|
518
|
-
entry.model.hasChanged()) {
|
|
519
|
-
toChange = [entry];
|
|
520
|
-
}
|
|
521
|
-
path = pathArray.slice(1);
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
else {
|
|
526
|
-
// Reset all
|
|
527
|
-
toAdd = this._entries.filter((e) => e.state === ODataModelState.Removed);
|
|
528
|
-
toChange = this._entries.filter((e) => e.state === ODataModelState.Unchanged && e.model.hasChanged());
|
|
529
|
-
toRemove = this._entries.filter((e) => e.state === ODataModelState.Added);
|
|
530
|
-
}
|
|
531
|
-
toRemove.forEach((entry) => {
|
|
532
|
-
this._removeModel(entry.model, { silent });
|
|
533
|
-
});
|
|
534
|
-
toAdd.forEach((entry) => {
|
|
535
|
-
this._addModel(entry.model, { silent });
|
|
536
|
-
});
|
|
537
|
-
toChange.forEach((entry) => {
|
|
538
|
-
entry.model.reset({ path, silent });
|
|
539
|
-
entry.state = ODataModelState.Unchanged;
|
|
540
|
-
});
|
|
541
|
-
if (!silent &&
|
|
542
|
-
(toAdd.length > 0 || toRemove.length > 0 || toChange.length > 0)) {
|
|
543
|
-
this.events$.emit(new ODataModelEvent(ODataModelEventType.Reset, {
|
|
544
|
-
collection: this,
|
|
545
|
-
options: {
|
|
546
|
-
added: toAdd.map((e) => e.model),
|
|
547
|
-
removed: toRemove.map((e) => e.model),
|
|
548
|
-
changed: toChange.map((e) => e.model),
|
|
549
|
-
},
|
|
550
|
-
}));
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
clear({ silent = false } = {}) {
|
|
554
|
-
let toRemove = this.models();
|
|
555
|
-
toRemove.forEach((m) => {
|
|
556
|
-
this._removeModel(m, { silent });
|
|
557
|
-
});
|
|
558
|
-
this._entries = [];
|
|
559
|
-
if (!silent) {
|
|
560
|
-
this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
|
|
561
|
-
collection: this,
|
|
562
|
-
options: { removed: toRemove },
|
|
563
|
-
}));
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
assign(objects, { remove = true, reset = false, reparent = false, silent = false, } = {}) {
|
|
567
|
-
const Model = this._model;
|
|
568
|
-
const offset = remove ? 0 : this.length;
|
|
569
|
-
let toAdd = [];
|
|
570
|
-
let toChange = [];
|
|
571
|
-
let toRemove = [];
|
|
572
|
-
let toSort = [];
|
|
573
|
-
let modelMap = [];
|
|
574
|
-
objects.forEach((obj, index) => {
|
|
575
|
-
const isModel = ODataModelOptions.isModel(obj);
|
|
576
|
-
const position = index + offset;
|
|
577
|
-
const key = Model !== null && Model.meta ? Model.meta.resolveKey(obj) : undefined;
|
|
578
|
-
const cid = Model.meta.cid in obj ? obj[Model.meta.cid] : undefined;
|
|
579
|
-
// Try find entry
|
|
580
|
-
const entry = isModel
|
|
581
|
-
? this._findEntry({ model: obj }) // By Model
|
|
582
|
-
: this._findEntry({ cid, key }); // By Cid or Key
|
|
583
|
-
let model;
|
|
584
|
-
if (entry !== undefined) {
|
|
585
|
-
// Merge
|
|
586
|
-
model = entry.model;
|
|
587
|
-
if (model !== obj) {
|
|
588
|
-
// Get entity from model
|
|
589
|
-
if (isModel) {
|
|
590
|
-
const entity = obj.toEntity({
|
|
591
|
-
client_id: true,
|
|
592
|
-
...INCLUDE_DEEP,
|
|
593
|
-
});
|
|
594
|
-
model.assign(entity, { reset, silent });
|
|
595
|
-
}
|
|
596
|
-
else {
|
|
597
|
-
const helper = this._annotations.helper;
|
|
598
|
-
const annots = new ODataEntityAnnotations(helper, helper.annotations(obj));
|
|
599
|
-
const entity = annots.attributes(obj, 'full');
|
|
600
|
-
model._annotations = annots;
|
|
601
|
-
model.assign(entity, { reset, silent });
|
|
602
|
-
}
|
|
603
|
-
// Model Change?
|
|
604
|
-
if (model.hasChanged())
|
|
605
|
-
toChange.push([model, position]);
|
|
606
|
-
}
|
|
607
|
-
// Has Sort or Index Change?
|
|
608
|
-
if (toSort.length > 0 || position !== this.models().indexOf(model)) {
|
|
609
|
-
toSort.push([model, position]);
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
else {
|
|
613
|
-
// Add
|
|
614
|
-
model = isModel
|
|
615
|
-
? obj
|
|
616
|
-
: this.modelFactory(obj);
|
|
617
|
-
toAdd.push([model, position]);
|
|
618
|
-
}
|
|
619
|
-
modelMap.push(model[Model.meta.cid]);
|
|
620
|
-
});
|
|
621
|
-
if (remove) {
|
|
622
|
-
this._entries.forEach((entry, position) => {
|
|
623
|
-
if (modelMap.indexOf(entry.model[Model.meta.cid]) === -1)
|
|
624
|
-
toRemove.push([entry.model, position]);
|
|
625
|
-
});
|
|
626
|
-
}
|
|
627
|
-
// Apply remove, add and sort
|
|
628
|
-
toRemove.forEach(([model, position]) => {
|
|
629
|
-
this._removeModel(model, { silent, reset });
|
|
630
|
-
});
|
|
631
|
-
toAdd.forEach(([model, position]) => {
|
|
632
|
-
this._addModel(model, { silent, reset, reparent, position });
|
|
633
|
-
});
|
|
634
|
-
toSort.forEach(([model, position]) => {
|
|
635
|
-
this._moveModel(model, position);
|
|
636
|
-
});
|
|
637
|
-
if ((!silent &&
|
|
638
|
-
(toAdd.length > 0 ||
|
|
639
|
-
toRemove.length > 0 ||
|
|
640
|
-
toChange.length > 0 ||
|
|
641
|
-
toSort.length > 0)) ||
|
|
642
|
-
reset) {
|
|
643
|
-
this._sortBy = null;
|
|
644
|
-
this.events$.emit(new ODataModelEvent(reset ? ODataModelEventType.Reset : ODataModelEventType.Update, {
|
|
645
|
-
collection: this,
|
|
646
|
-
options: {
|
|
647
|
-
added: toAdd,
|
|
648
|
-
removed: toRemove,
|
|
649
|
-
changed: toChange,
|
|
650
|
-
sorted: toSort,
|
|
651
|
-
},
|
|
652
|
-
}));
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
query(ctx) {
|
|
656
|
-
const resource = this.resource();
|
|
657
|
-
resource.query(ctx);
|
|
658
|
-
this.attach(resource);
|
|
659
|
-
return this;
|
|
660
|
-
}
|
|
661
|
-
callFunction(name, params, responseType, { ...options } = {}) {
|
|
662
|
-
const resource = this.resource();
|
|
663
|
-
if (resource instanceof ODataEntitySetResource) {
|
|
664
|
-
const func = resource.function(name);
|
|
665
|
-
func.query((q) => q.apply(options));
|
|
666
|
-
switch (responseType) {
|
|
667
|
-
case 'property':
|
|
668
|
-
return func.callProperty(params, options);
|
|
669
|
-
case 'model':
|
|
670
|
-
return func.callModel(params, options);
|
|
671
|
-
case 'collection':
|
|
672
|
-
return func.callCollection(params, options);
|
|
673
|
-
default:
|
|
674
|
-
return func.call(params, { responseType, ...options });
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
return throwError(() => new Error(`callFunction: Can't function without ODataEntitySetResource`));
|
|
678
|
-
}
|
|
679
|
-
callAction(name, params, responseType, { ...options } = {}) {
|
|
680
|
-
const resource = this.resource();
|
|
681
|
-
if (!(resource instanceof ODataEntitySetResource)) {
|
|
682
|
-
return throwError(() => new Error(`callAction: Can't action without ODataEntitySetResource`));
|
|
683
|
-
}
|
|
684
|
-
const action = resource.action(name);
|
|
685
|
-
action.query((q) => q.apply(options));
|
|
686
|
-
switch (responseType) {
|
|
687
|
-
case 'property':
|
|
688
|
-
return action.callProperty(params, options);
|
|
689
|
-
case 'model':
|
|
690
|
-
return action.callModel(params, options);
|
|
691
|
-
case 'collection':
|
|
692
|
-
return action.callCollection(params, options);
|
|
693
|
-
default:
|
|
694
|
-
return action.call(params, { responseType, ...options });
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
_unlink(entry) {
|
|
698
|
-
if (entry.subscription) {
|
|
699
|
-
entry.subscription.unsubscribe();
|
|
700
|
-
entry.subscription = undefined;
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
_link(entry) {
|
|
704
|
-
if (entry.subscription) {
|
|
705
|
-
throw new Error('Collection: Subscription already exists');
|
|
706
|
-
}
|
|
707
|
-
entry.subscription = entry.model.events$.subscribe((event) => {
|
|
708
|
-
if (BUBBLING.indexOf(event.name) !== -1 &&
|
|
709
|
-
event.bubbling &&
|
|
710
|
-
!event.visited(this)) {
|
|
711
|
-
if (event.model === entry.model) {
|
|
712
|
-
if (event.name === 'destroy') {
|
|
713
|
-
this.removeModel(entry.model, { reset: true });
|
|
714
|
-
}
|
|
715
|
-
else if (event.name === 'change' && event.options?.key) {
|
|
716
|
-
entry.key = entry.model.key();
|
|
717
|
-
}
|
|
718
|
-
}
|
|
719
|
-
const index = this.models().indexOf(entry.model);
|
|
720
|
-
this.events$.emit(event.push(this, index));
|
|
721
|
-
}
|
|
722
|
-
});
|
|
723
|
-
}
|
|
724
|
-
_findEntry({ model, cid, key, } = {}) {
|
|
725
|
-
return this._entries.find((entry) => {
|
|
726
|
-
const byModel = model !== undefined && entry.model.equals(model);
|
|
727
|
-
const byCid = cid !== undefined && entry.model[this._model.meta.cid] === cid;
|
|
728
|
-
const byKey = key !== undefined &&
|
|
729
|
-
entry.key !== undefined &&
|
|
730
|
-
Types.isEqual(entry.key, key);
|
|
731
|
-
return byModel || byCid || byKey;
|
|
732
|
-
});
|
|
733
|
-
}
|
|
734
|
-
// Collection functions
|
|
735
|
-
equals(other) {
|
|
736
|
-
return this === other;
|
|
737
|
-
}
|
|
738
|
-
get [Symbol.toStringTag]() {
|
|
739
|
-
return 'Collection';
|
|
740
|
-
}
|
|
741
|
-
[Symbol.iterator]() {
|
|
742
|
-
let pointer = 0;
|
|
743
|
-
let models = this.models();
|
|
744
|
-
return {
|
|
745
|
-
next() {
|
|
746
|
-
return {
|
|
747
|
-
done: pointer === models.length,
|
|
748
|
-
value: models[pointer++],
|
|
749
|
-
};
|
|
750
|
-
},
|
|
751
|
-
};
|
|
752
|
-
}
|
|
753
|
-
filter(predicate, thisArg) {
|
|
754
|
-
return this.models().filter(predicate);
|
|
755
|
-
}
|
|
756
|
-
map(callbackfn, thisArg) {
|
|
757
|
-
return this.models().map(callbackfn, thisArg);
|
|
758
|
-
}
|
|
759
|
-
find(predicate, thisArg) {
|
|
760
|
-
return this.models().find(predicate);
|
|
761
|
-
}
|
|
762
|
-
reduce(callbackfn, initialValue) {
|
|
763
|
-
return this.models().reduce(callbackfn, initialValue);
|
|
764
|
-
}
|
|
765
|
-
first() {
|
|
766
|
-
return this.models()[0];
|
|
767
|
-
}
|
|
768
|
-
last() {
|
|
769
|
-
const models = this.models();
|
|
770
|
-
return models[models.length - 1];
|
|
771
|
-
}
|
|
772
|
-
next(model) {
|
|
773
|
-
const index = this.indexOf(model);
|
|
774
|
-
if (index === -1 || index === this.length - 1) {
|
|
775
|
-
return undefined;
|
|
776
|
-
}
|
|
777
|
-
return this.get(index + 1);
|
|
778
|
-
}
|
|
779
|
-
prev(model) {
|
|
780
|
-
const index = this.indexOf(model);
|
|
781
|
-
if (index <= 0) {
|
|
782
|
-
return undefined;
|
|
783
|
-
}
|
|
784
|
-
return this.get(index - 1);
|
|
785
|
-
}
|
|
786
|
-
every(predicate) {
|
|
787
|
-
return this.models().every(predicate);
|
|
788
|
-
}
|
|
789
|
-
some(predicate) {
|
|
790
|
-
return this.models().some(predicate);
|
|
791
|
-
}
|
|
792
|
-
contains(model) {
|
|
793
|
-
return this.some((m) => m.equals(model));
|
|
794
|
-
}
|
|
795
|
-
indexOf(model) {
|
|
796
|
-
const models = this.models();
|
|
797
|
-
const m = models.find((m) => m.equals(model));
|
|
798
|
-
return m === undefined ? -1 : models.indexOf(m);
|
|
799
|
-
}
|
|
800
|
-
isEmpty() {
|
|
801
|
-
// Local length and if exists remote length
|
|
802
|
-
return (this.length === 0 &&
|
|
803
|
-
this.annots().count !== undefined &&
|
|
804
|
-
this.annots().count === 0);
|
|
805
|
-
}
|
|
806
|
-
//#region Sort
|
|
807
|
-
_bisect(model) {
|
|
808
|
-
let index = -1;
|
|
809
|
-
if (this._sortBy !== null) {
|
|
810
|
-
for (index = 0; index < this._entries.length; index++) {
|
|
811
|
-
if (this._compare(model, this._entries[index], this._sortBy, 0) < 0) {
|
|
812
|
-
return index;
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
}
|
|
816
|
-
return index;
|
|
817
|
-
}
|
|
818
|
-
_compare(e1, e2, by, index) {
|
|
819
|
-
let m1 = ODataModelOptions.isModel(e1)
|
|
820
|
-
? e1
|
|
821
|
-
: e1.model;
|
|
822
|
-
let m2 = ODataModelOptions.isModel(e2)
|
|
823
|
-
? e2
|
|
824
|
-
: e2.model;
|
|
825
|
-
let value1 = m1.get(by[index].field);
|
|
826
|
-
let value2 = m2.get(by[index].field);
|
|
827
|
-
let result = 0;
|
|
828
|
-
if (value1 == null && value2 != null)
|
|
829
|
-
result = -1;
|
|
830
|
-
else if (value1 != null && value2 == null)
|
|
831
|
-
result = 1;
|
|
832
|
-
else if (value1 == null && value2 == null)
|
|
833
|
-
result = 0;
|
|
834
|
-
else if (typeof value1 == 'string' || value1 instanceof String) {
|
|
835
|
-
if (value1.localeCompare && value1 != value2) {
|
|
836
|
-
return (by[index].order || 1) * value1.localeCompare(value2);
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
else {
|
|
840
|
-
result = value1 < value2 ? -1 : 1;
|
|
841
|
-
}
|
|
842
|
-
if (value1 == value2) {
|
|
843
|
-
return by.length - 1 > index ? this._compare(e1, e2, by, index + 1) : 0;
|
|
844
|
-
}
|
|
845
|
-
return (by[index].order || 1) * result;
|
|
846
|
-
}
|
|
847
|
-
isSorted() {
|
|
848
|
-
return this._sortBy !== null;
|
|
849
|
-
}
|
|
850
|
-
sort(by, { silent } = {}) {
|
|
851
|
-
this._sortBy = by;
|
|
852
|
-
this._entries = this._entries.sort((e1, e2) => this._compare(e1, e2, by, 0));
|
|
853
|
-
if (!silent) {
|
|
854
|
-
this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
|
|
855
|
-
collection: this,
|
|
856
|
-
}));
|
|
857
|
-
}
|
|
858
|
-
}
|
|
859
|
-
}
|
|
860
|
-
ODataCollection.model = null;
|
|
861
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFJTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBRXRCLHNCQUFzQixFQUV0QiwrQkFBK0IsRUFFL0IscUJBQXFCLEdBR3RCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixlQUFlLEVBR2YsZUFBZSxFQUNmLG1CQUFtQixFQUVuQixpQkFBaUIsRUFDakIsZUFBZSxHQUNoQixNQUFNLFdBQVcsQ0FBQztBQUVuQixNQUFNLE9BQU8sZUFBZTtJQTRDMUIsWUFDRSxXQUFxRCxFQUFFLEVBQ3ZELEVBQ0UsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssR0FBRyxLQUFLLE1BT1gsRUFBRTtRQXREUixZQUFPLEdBS0ksSUFBSSxDQUFDO1FBQ2hCLGNBQVMsR0FJRSxJQUFJLENBQUM7UUFDaEIsZUFBVSxHQVlKLEVBQUUsQ0FBQztRQUVULGFBQVEsR0FBNEIsRUFBRSxDQUFDO1FBYXZDLFFBQVE7UUFDUixZ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Q0gsQ0FBQztTQUNIO0lBQ0gsQ0FBQzs7QUEzeENNLHFCQUFLLEdBQTZCLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBERUZBVUxUX1ZFUlNJT04gfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHtcbiAgRW50aXR5S2V5LFxuICBPRGF0YUFjdGlvbk9wdGlvbnMsXG4gIE9EYXRhRW50aXRpZXMsXG4gIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFGdW5jdGlvbk9wdGlvbnMsXG4gIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhT3B0aW9ucyxcbiAgT0RhdGFQcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXIsXG4gIE9EYXRhUmVzb3VyY2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBPRGF0YVN0cnVjdHVyZWRUeXBlIH0gZnJvbSAnLi4vc2NoZW1hL3N0cnVjdHVyZWQtdHlwZSc7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCB7IE9EYXRhTW9kZWwgfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7XG4gIEJVQkJMSU5HLFxuICBJTkNMVURFX0RFRVAsXG4gIElOQ0xVREVfU0hBTExPVyxcbiAgTW9kZWxGaWVsZE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxFbnRyeSxcbiAgT0RhdGFNb2RlbEV2ZW50LFxuICBPRGF0YU1vZGVsRXZlbnRUeXBlLFxuICBPRGF0YU1vZGVsRmllbGQsXG4gIE9EYXRhTW9kZWxPcHRpb25zLFxuICBPRGF0YU1vZGVsU3RhdGUsXG59IGZyb20gJy4vb3B0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUNvbGxlY3Rpb248VCwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+XG4gIGltcGxlbWVudHMgSXRlcmFibGU8TT5cbntcbiAgc3RhdGljIG1vZGVsOiB0eXBlb2YgT0RhdGFNb2RlbCB8IG51bGwgPSBudWxsO1xuICBfcGFyZW50OlxuICAgIHwgW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF1cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2U6XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2VzOiB7XG4gICAgcGFyZW50OlxuICAgICAgfCBbXG4gICAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgICAgXVxuICAgICAgfCBudWxsO1xuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IG51bGw7XG4gIH1bXSA9IFtdO1xuICBfYW5ub3RhdGlvbnMhOiBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM8VD47XG4gIF9lbnRyaWVzOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICBfbW9kZWw6IHR5cGVvZiBPRGF0YU1vZGVsO1xuXG4gIG1vZGVscygpIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllc1xuICAgICAgLmZpbHRlcigoZSkgPT4gZS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpXG4gICAgICAubWFwKChlKSA9PiBlLm1vZGVsKTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5sZW5ndGg7XG4gIH1cblxuICAvL0V2ZW50c1xuICBldmVudHMkID0gbmV3IEV2ZW50RW1pdHRlcjxPRGF0YU1vZGVsRXZlbnQ8VD4+KCk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGVudGl0aWVzOiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdID0gW10sXG4gICAge1xuICAgICAgcGFyZW50LFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBhbm5vdHMsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgcGFyZW50PzogW09EYXRhTW9kZWw8YW55PiwgT0RhdGFNb2RlbEZpZWxkPGFueT5dO1xuICAgICAgcmVzb3VyY2U/OiBPRGF0YVJlc291cmNlPFQ+O1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPFQ+O1xuICAgICAgbW9kZWw/OiB0eXBlb2YgT0RhdGFNb2RlbDtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgY29uc3QgS2xhc3MgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPRGF0YUNvbGxlY3Rpb247XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQgJiYgS2xhc3MubW9kZWwgIT09IG51bGwpIG1vZGVsID0gS2xhc3MubW9kZWw7XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb246IENvbGxlY3Rpb24gbmVlZCBtb2RlbCcpO1xuICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG5cbiAgICAvLyBQYXJlbnRcbiAgICBpZiAocGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICB9XG5cbiAgICAvLyBSZXNvdXJjZVxuICAgIGlmICh0aGlzLl9wYXJlbnQgPT09IG51bGwgJiYgcmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJlc291cmNlID0gdGhpcy5fbW9kZWwubWV0YS5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5KCkgYXNcbiAgICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hdHRhY2goXG4gICAgICAgIHJlc291cmNlIGFzXG4gICAgICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQW5ub3RhdGlvbnNcbiAgICB0aGlzLl9hbm5vdGF0aW9ucyA9XG4gICAgICBhbm5vdHMgfHxcbiAgICAgIG5ldyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMoXG4gICAgICAgIE9EYXRhSGVscGVyW3Jlc291cmNlPy5hcGk/Lm9wdGlvbnMudmVyc2lvbiB8fCBERUZBVUxUX1ZFUlNJT05dXG4gICAgICApO1xuXG4gICAgZW50aXRpZXMgPSBlbnRpdGllcyB8fCBbXTtcbiAgICB0aGlzLmFzc2lnbihlbnRpdGllcywgeyByZXNldCB9KTtcbiAgfVxuXG4gIGlzUGFyZW50T2YoXG4gICAgY2hpbGQ6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoaWxkICE9PSB0aGlzICYmXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5jaGFpbihjaGlsZCkuc29tZSgocCkgPT4gcFswXSA9PT0gdGhpcylcbiAgICApO1xuICB9XG5cbiAgcmVzb3VyY2UoKTpcbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPiB7XG4gICAgcmV0dXJuIE9EYXRhTW9kZWxPcHRpb25zLnJlc291cmNlPFQ+KHRoaXMpIGFzXG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD47XG4gIH1cblxuICBwdXNoUmVzb3VyY2UoXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgKSB7XG4gICAgLy8gUHVzaCBjdXJyZW50IHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9yZXNvdXJjZXMucHVzaCh7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfSk7XG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgcG9wUmVzb3VyY2UoKSB7XG4gICAgLy8gUG9wIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICBjb25zdCBwb3AgPSB0aGlzLl9yZXNvdXJjZXMucG9wKCk7XG4gICAgaWYgKHBvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0geyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH07XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwb3AucGFyZW50O1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSBwb3AucmVzb3VyY2U7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGF0dGFjaChcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICApIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXNvdXJjZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5fcmVzb3VyY2UudHlwZSgpICE9PSByZXNvdXJjZS50eXBlKCkgJiZcbiAgICAgICF0aGlzLl9yZXNvdXJjZS5pc1N1YnR5cGVPZihyZXNvdXJjZSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBhdHRhY2g6IENhbid0IHJlYXR0YWNoICR7dGhpcy5fcmVzb3VyY2UudHlwZSgpfSB0byAke3Jlc291cmNlLnR5cGUoKX1gXG4gICAgICApO1xuXG4gICAgdGhpcy5fZW50cmllcy5mb3JFYWNoKCh7IG1vZGVsIH0pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsUmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLm1vZGVsUmVzb3VyY2VGYWN0b3J5KFxuICAgICAgICByZXNvdXJjZS5jbG9uZVF1ZXJ5PFQ+KClcbiAgICAgICkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPjtcbiAgICAgIGlmIChtb2RlbFJlc291cmNlICE9PSB1bmRlZmluZWQpIG1vZGVsLmF0dGFjaChtb2RlbFJlc291cmNlKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9yZXNvdXJjZTtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCAhY3VycmVudC5pc0VxdWFsVG8ocmVzb3VyY2UpKSB7XG4gICAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5BdHRhY2gsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICAgIHZhbHVlOiByZXNvdXJjZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHdpdGhSZXNvdXJjZTxSPihcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPixcbiAgICBjdHg6IChjb2xsZWN0aW9uOiB0aGlzKSA9PiBSXG4gICk6IFIge1xuICAgIC8vIFB1c2hcbiAgICB0aGlzLnB1c2hSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgLy8gRXhlY3V0ZVxuICAgIGNvbnN0IHJlc3VsdCA9IGN0eCh0aGlzKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIChyZXN1bHQgYXMgYW55KS5waXBlKGZpbmFsaXplKCgpID0+IHRoaXMucG9wUmVzb3VyY2UoKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQb3BcbiAgICAgIHRoaXMucG9wUmVzb3VyY2UoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgYXNFbnRpdHlTZXQ8Uj4oY3R4OiAoY29sbGVjdGlvbjogdGhpcykgPT4gUik6IFIge1xuICAgIC8vIEJ1aWxkIG5ldyByZXNvdXJjZVxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5fcmVzb3VyY2U/LmNsb25lUXVlcnk8VD4oKTtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkocXVlcnkpO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnYXNFbnRpdHlTZXQ6IENvbGxlY3Rpb24gZG9lcyBub3QgaGF2ZSBhc3NvY2lhdGVkIEVudGl0eVNldCBlbmRwb2ludCdcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMud2l0aFJlc291cmNlKHJlc291cmNlLCBjdHgpO1xuICB9XG5cbiAgYW5ub3RzKCkge1xuICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgbW9kZWxGYWN0b3J5KFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7IHJlc2V0ID0gZmFsc2UgfTogeyByZXNldD86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE0ge1xuICAgIGxldCBNb2RlbCA9IHRoaXMuX21vZGVsO1xuICAgIGNvbnN0IGFubm90cyA9IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKHRoaXMuX2Fubm90YXRpb25zLmhlbHBlcik7XG4gICAgYW5ub3RzLnVwZGF0ZShkYXRhKTtcblxuICAgIGlmIChhbm5vdHM/LnR5cGUgIT09IHVuZGVmaW5lZCAmJiBNb2RlbC5tZXRhICE9PSBudWxsKSB7XG4gICAgICBsZXQgc2NoZW1hID0gTW9kZWwubWV0YS5maW5kQ2hpbGRPcHRpb25zKChvKSA9PlxuICAgICAgICBvLmlzVHlwZU9mKGFubm90cy50eXBlIGFzIHN0cmluZylcbiAgICAgICk/LnNjaGVtYTtcbiAgICAgIGlmIChzY2hlbWEgIT09IHVuZGVmaW5lZCAmJiBzY2hlbWEubW9kZWwgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLy8gQ2hhbmdlIHRvIGNoaWxkIG1vZGVsXG4gICAgICAgIE1vZGVsID0gc2NoZW1hLm1vZGVsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTW9kZWwoZGF0YSwge1xuICAgICAgYW5ub3RzLFxuICAgICAgcmVzZXQsXG4gICAgICBwYXJlbnQ6IFt0aGlzLCBudWxsXSxcbiAgICB9KSBhcyBNO1xuICB9XG5cbiAgdG9FbnRpdGllcyh7XG4gICAgY2xpZW50X2lkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2tleSA9IHRydWUsXG4gICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgY2hhaW4gPSBbXSxcbiAgfToge1xuICAgIGNsaWVudF9pZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgY2hhaW4/OiAoT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PilbXTtcbiAgfSA9IHt9KTogKFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh7IG1vZGVsLCBzdGF0ZSB9KSA9PlxuICAgICAgICAgIHN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCAmJiBjaGFpbi5ldmVyeSgoYykgPT4gYyAhPT0gbW9kZWwpXG4gICAgICApXG4gICAgICAubWFwKCh7IG1vZGVsLCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgIHZhciBjaGFuZ2VzT25seSA9IGNoYW5nZXNfb25seSAmJiBzdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLkFkZGVkO1xuICAgICAgICByZXR1cm4gbW9kZWwudG9FbnRpdHkoe1xuICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgICAgIGluY2x1ZGVfa2V5LFxuICAgICAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzT25seSxcbiAgICAgICAgICBjaGFpbjogW3RoaXMsIC4uLmNoYWluXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0VudGl0aWVzKCk7XG4gIH1cblxuICBoYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fZW50cmllcy5zb21lKChlKSA9PiBlLnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkKSB8fFxuICAgICAgdGhpcy5tb2RlbHMoKS5zb21lKChtKSA9PiBtLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpXG4gICAgKTtcbiAgfVxuXG4gIGNsb25lPEMgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248VCwgTT4+KCkge1xuICAgIGxldCBDdG9yID0gPHR5cGVvZiBPRGF0YUNvbGxlY3Rpb24+dGhpcy5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gbmV3IEN0b3IodGhpcy50b0VudGl0aWVzKElOQ0xVREVfU0hBTExPVyksIHtcbiAgICAgIHJlc291cmNlOiB0aGlzLnJlc291cmNlKCksXG4gICAgICBhbm5vdHM6IHRoaXMuYW5ub3RzKCksXG4gICAgfSkgYXMgQztcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3QoXG4gICAgb2JzJDogT2JzZXJ2YWJsZTxPRGF0YUVudGl0aWVzPGFueT4+LFxuICAgIHsgcmVtb3ZlIH06IHsgcmVtb3ZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxNW10+IHtcbiAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXF1ZXN0LCB7XG4gICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdGllcywgYW5ub3RzIH0pID0+IHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICAgIGNvbnN0IG1vZGVscyA9IChlbnRpdGllcyB8fCBbXSkubWFwKFxuICAgICAgICAgIChlbnRpdHkpID0+IHRoaXMubW9kZWxGYWN0b3J5KGVudGl0eSwgeyByZXNldDogdHJ1ZSB9KSBhcyBNXG4gICAgICAgICkgYXMgTVtdO1xuICAgICAgICB0aGlzLmFzc2lnbihtb2RlbHMsIHsgcmVzZXQ6IHRydWUsIHJlbW92ZSB9KTtcbiAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChPRGF0YU1vZGVsRXZlbnRUeXBlLlN5bmMsIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgICBvcHRpb25zOiB7IG1vZGVscywgZW50aXRpZXMsIGFubm90cyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtb2RlbHM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBmZXRjaCh7XG4gICAgd2l0aENvdW50LFxuICAgIHJlbW92ZSxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICByZW1vdmU/OiBib29sZWFuO1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG5cbiAgICBjb25zdCBvYnMkID1cbiAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZVxuICAgICAgICA/IHJlc291cmNlLmZldGNoKHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pXG4gICAgICAgIDogcmVzb3VyY2UuZmV0Y2goe1xuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLFxuICAgICAgICAgICAgd2l0aENvdW50LFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIHsgcmVtb3ZlIH0pO1xuICB9XG5cbiAgZmV0Y2hBbGwoe1xuICAgIHdpdGhDb3VudCxcbiAgICByZW1vdmUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPE1bXT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuXG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlLmZldGNoQWxsKHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgeyByZW1vdmUgfSk7XG4gIH1cblxuICBmZXRjaE1hbnkoXG4gICAgdG9wOiBudW1iZXIsXG4gICAge1xuICAgICAgd2l0aENvdW50LFxuICAgICAgcmVtb3ZlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiBPYnNlcnZhYmxlPE1bXT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIHJlc291cmNlLnF1ZXJ5KChxKSA9PlxuICAgICAgcmVtb3ZlIHx8IHRoaXMubGVuZ3RoID09IDAgPyBxLnNraXAoKS5jbGVhcigpIDogcS5za2lwKHRoaXMubGVuZ3RoKVxuICAgICk7XG5cbiAgICBjb25zdCBvYnMkID0gcmVzb3VyY2UuZmV0Y2hNYW55KHRvcCwgeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCB7IHJlbW92ZTogcmVtb3ZlID8/IGZhbHNlIH0pO1xuICB9XG5cbiAgZmV0Y2hPbmUoe1xuICAgIHdpdGhDb3VudCxcbiAgICByZW1vdmUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaE1hbnkoMSwgeyB3aXRoQ291bnQsIHJlbW92ZSwgLi4ub3B0aW9ucyB9KS5waXBlKFxuICAgICAgbWFwKChtb2RlbHMpID0+IG1vZGVsc1swXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYWxsIG1vZGVscyBpbiB0aGUgY29sbGVjdGlvblxuICAgKiBAcGFyYW0gcmVsTW9kZWwgVGhlIG1vZGVsIGlzIHJlbGF0aW9uc2hpcFxuICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gdXNlXG4gICAqIEBwYXJhbSBvcHRpb25zIEh0dHBPcHRpb25zXG4gICAqL1xuICBzYXZlKHtcbiAgICByZWxNb2RlbCA9IGZhbHNlLFxuICAgIG1ldGhvZCxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICByZWxNb2RlbD86IGJvb2xlYW47XG4gICAgbWV0aG9kPzogJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFQcm9wZXJ0eVJlc291cmNlKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+IG5ldyBFcnJvcignc2F2ZTogUmVzb3VyY2UgaXMgT0RhdGFQcm9wZXJ0eVJlc291cmNlJylcbiAgICAgICk7XG5cbiAgICBsZXQgdG9EZXN0cm95RW50aXR5OiBNW10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmVSZWZlcmVuY2U6IE1bXSA9IFtdO1xuICAgIGxldCB0b0Rlc3Ryb3lDb250YWluZWQ6IE1bXSA9IFtdO1xuICAgIGxldCB0b0NyZWF0ZUVudGl0eTogTVtdID0gW107XG4gICAgbGV0IHRvQWRkUmVmZXJlbmNlOiBNW10gPSBbXTtcbiAgICBsZXQgdG9DcmVhdGVDb250YWluZWQ6IE1bXSA9IFtdO1xuICAgIGxldCB0b1VwZGF0ZUVudGl0eTogTVtdID0gW107XG4gICAgbGV0IHRvVXBkYXRlQ29udGFpbmVkOiBNW10gPSBbXTtcblxuICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoeyBtb2RlbCwgc3RhdGUgfSkgPT4ge1xuICAgICAgaWYgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1vZGVsLmlzTmV3KCkpIHtcbiAgICAgICAgICB0b1JlbW92ZVJlZmVyZW5jZS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lDb250YWluZWQucHVzaChtb2RlbCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0NyZWF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIGlmICghbW9kZWwuaXNOZXcoKSkge1xuICAgICAgICAgIHRvQWRkUmVmZXJlbmNlLnB1c2gobW9kZWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvQ3JlYXRlQ29udGFpbmVkLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vZGVsLmhhc0NoYW5nZWQoKSkge1xuICAgICAgICB0b1VwZGF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICB0b0Rlc3Ryb3lFbnRpdHkubGVuZ3RoID4gMCB8fFxuICAgICAgdG9SZW1vdmVSZWZlcmVuY2UubGVuZ3RoID4gMCB8fFxuICAgICAgdG9EZXN0cm95Q29udGFpbmVkLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQ3JlYXRlRW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQWRkUmVmZXJlbmNlLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQ3JlYXRlQ29udGFpbmVkLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvVXBkYXRlRW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvVXBkYXRlQ29udGFpbmVkLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IG9icyQgPSBmb3JrSm9pbihbXG4gICAgICAgIC4uLnRvRGVzdHJveUVudGl0eS5tYXAoKG0pID0+IG0uYXNFbnRpdHkoKGUpID0+IGUuZGVzdHJveShvcHRpb25zKSkpLFxuICAgICAgICAuLi50b1JlbW92ZVJlZmVyZW5jZS5tYXAoKG0pID0+IHRoaXMucmVtb3ZlUmVmZXJlbmNlKG0sIG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9EZXN0cm95Q29udGFpbmVkLm1hcCgobSkgPT4gbS5kZXN0cm95KG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9DcmVhdGVFbnRpdHkubWFwKChtKSA9PlxuICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUuc2F2ZSh7IG1ldGhvZDogJ2NyZWF0ZScsIC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICksXG4gICAgICAgIC4uLnRvQWRkUmVmZXJlbmNlLm1hcCgobSkgPT4gdGhpcy5hZGRSZWZlcmVuY2UobSwgb3B0aW9ucykpLFxuICAgICAgICAuLi50b0NyZWF0ZUNvbnRhaW5lZC5tYXAoKG0pID0+XG4gICAgICAgICAgbS5zYXZlKHsgbWV0aG9kOiAnY3JlYXRlJywgLi4ub3B0aW9ucyB9KVxuICAgICAgICApLFxuICAgICAgICAuLi50b1VwZGF0ZUVudGl0eS5tYXAoKG0pID0+XG4gICAgICAgICAgbS5hc0VudGl0eSgoZSkgPT4gZS5zYXZlKHsgbWV0aG9kLCAuLi5vcHRpb25zIH0pKVxuICAgICAgICApLFxuICAgICAgICAuLi50b1VwZGF0ZUNvbnRhaW5lZC5tYXAoKG0pID0+IG0uc2F2ZSh7IG1ldGhvZCwgLi4ub3B0aW9ucyB9KSksXG4gICAgICBdKTtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuUmVxdWVzdCwge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczogeyBvYnNlcnZhYmxlOiBvYnMkIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9lbnRyaWVzID0gdGhpcy5fZW50cmllc1xuICAgICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZClcbiAgICAgICAgICAgIC5tYXAoKGVudHJ5KSA9PiAoeyAuLi5lbnRyeSwgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgfSkpO1xuICAgICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChPRGF0YU1vZGVsRXZlbnRUeXBlLlN5bmMsIHsgY29sbGVjdGlvbjogdGhpcyB9KVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb2YodGhpcyk7XG4gIH1cblxuICBwcml2YXRlIGFkZFJlZmVyZW5jZShtb2RlbDogTSwgb3B0aW9ucz86IE9EYXRhT3B0aW9ucyk6IE9ic2VydmFibGU8TT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghbW9kZWwuaXNOZXcoKSAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIHJldHVybiByZXNvdXJjZVxuICAgICAgICAucmVmZXJlbmNlKClcbiAgICAgICAgLmFkZChcbiAgICAgICAgICBtb2RlbC5fbWV0YS5lbnRpdHlSZXNvdXJjZShtb2RlbCkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPixcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgIClcbiAgICAgICAgLnBpcGUobWFwKCgpID0+IG1vZGVsKSk7XG4gICAgfVxuICAgIHJldHVybiBvZihtb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIF9hZGRNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgbWVyZ2UgPSBmYWxzZSxcbiAgICAgIHBvc2l0aW9uID0gLTEsXG4gICAgfToge1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICAgIHBvc2l0aW9uPzogbnVtYmVyO1xuICAgIH0gPSB7fVxuICApOiBNIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbC5rZXkoKTtcbiAgICBsZXQgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoe1xuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICBjaWQ6ICg8YW55Pm1vZGVsKVt0aGlzLl9tb2RlbC5tZXRhLmNpZF0sXG4gICAgfSk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZW50cnkuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgZW50cnkubW9kZWwuYXNzaWduKG1vZGVsLnRvRW50aXR5KCkgYXMgVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIEVudHJ5XG4gICAgZW50cnkgPSB7XG4gICAgICBzdGF0ZTogcmVzZXQgPyBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkIDogT0RhdGFNb2RlbFN0YXRlLkFkZGVkLFxuICAgICAgbW9kZWwsXG4gICAgICBrZXk6IG1vZGVsLmtleSgpLFxuICAgIH07XG4gICAgLy8gU2V0IFBhcmVudFxuICAgIGlmIChyZXBhcmVudCkgbW9kZWwuX3BhcmVudCA9IFt0aGlzLCBudWxsXTtcbiAgICAvLyBTdWJzY3JpYmVcbiAgICB0aGlzLl9saW5rKGVudHJ5KTtcbiAgICAvLyBOb3cgYWRkXG4gICAgaWYgKHBvc2l0aW9uID49IDApIHRoaXMuX2VudHJpZXMuc3BsaWNlKHBvc2l0aW9uLCAwLCBlbnRyeSk7XG4gICAgZWxzZSB0aGlzLl9lbnRyaWVzLnB1c2goZW50cnkpO1xuXG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIG1vZGVsLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChPRGF0YU1vZGVsRXZlbnRUeXBlLkFkZCwge1xuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gIH1cblxuICBwcml2YXRlIGFkZE1vZGVsKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBtZXJnZSA9IGZhbHNlLFxuICAgICAgcG9zaXRpb24gPSAtMSxcbiAgICB9OiB7XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcG9zaXRpb24/OiBudW1iZXI7XG4gICAgfSA9IHt9XG4gICk6IE0ge1xuICAgIGlmIChwb3NpdGlvbiA8IDApIHBvc2l0aW9uID0gdGhpcy5fYmlzZWN0KG1vZGVsKTtcbiAgICBjb25zdCBhZGRlZCA9IHRoaXMuX2FkZE1vZGVsKG1vZGVsLCB7XG4gICAgICBzaWxlbnQsXG4gICAgICByZXNldCxcbiAgICAgIG1lcmdlLFxuICAgICAgcG9zaXRpb24sXG4gICAgICByZXBhcmVudCxcbiAgICB9KTtcbiAgICBpZiAoIXNpbGVudCAmJiBhZGRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSwge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczogeyBhZGRlZDogW2FkZGVkXSwgcmVtb3ZlZDogW10sIG1lcmdlZDogW10gfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhZGRlZDtcbiAgfVxuXG4gIGFkZChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzZXJ2ZXIgPSB0cnVlLFxuICAgICAgbWVyZ2UgPSBmYWxzZSxcbiAgICAgIHBvc2l0aW9uID0gLTEsXG4gICAgfToge1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIHNlcnZlcj86IGJvb2xlYW47XG4gICAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgICBwb3NpdGlvbj86IG51bWJlcjtcbiAgICB9ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxNPiB7XG4gICAgaWYgKHNlcnZlcikge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkUmVmZXJlbmNlKG1vZGVsKS5waXBlKFxuICAgICAgICBtYXAoKG1vZGVsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWRkTW9kZWwobW9kZWwsIHtcbiAgICAgICAgICAgIHNpbGVudCxcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgcmVwYXJlbnQsXG4gICAgICAgICAgICBtZXJnZSxcbiAgICAgICAgICAgIHJlc2V0OiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuYWRkTW9kZWwobW9kZWwsIHsgc2lsZW50LCBwb3NpdGlvbiwgbWVyZ2UsIHJlcGFyZW50IH0pKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVJlZmVyZW5jZShtb2RlbDogTSwgb3B0aW9ucz86IE9EYXRhT3B0aW9ucyk6IE9ic2VydmFibGU8TT4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIW1vZGVsLmlzTmV3KCkgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICBsZXQgdGFyZ2V0ID1cbiAgICAgICAgdGhpcy5fbW9kZWwubWV0YS5hcGkub3B0aW9ucy5kZWxldGVSZWZCeSA9PT0gJ2lkJ1xuICAgICAgICAgID8gKG1vZGVsLl9tZXRhLmVudGl0eVJlc291cmNlKG1vZGVsKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHRoaXMuX21vZGVsLm1ldGEuYXBpLm9wdGlvbnMuZGVsZXRlUmVmQnkgPT09ICdwYXRoJykge1xuICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlLmtleShtb2RlbC5rZXkoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgICAgLnJlZmVyZW5jZSgpXG4gICAgICAgIC5yZW1vdmUodGFyZ2V0LCBvcHRpb25zKVxuICAgICAgICAucGlwZShtYXAoKCkgPT4gbW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mKG1vZGVsKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZU1vZGVsKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHJlc2V0PzogYm9vbGVhbiB9ID0ge31cbiAgKTogTSB7XG4gICAgY29uc3Qga2V5ID0gbW9kZWwua2V5KCk7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KHtcbiAgICAgIG1vZGVsLFxuICAgICAga2V5LFxuICAgICAgY2lkOiAoPGFueT5tb2RlbClbdGhpcy5fbW9kZWwubWV0YS5jaWRdLFxuICAgIH0pO1xuICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH1cblxuICAgIC8vIEVtaXQgRXZlbnRcbiAgICBpZiAoIXNpbGVudClcbiAgICAgIG1vZGVsLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChPRGF0YU1vZGVsRXZlbnRUeXBlLlJlbW92ZSwge1xuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgLy8gTm93IHJlbW92ZVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKCEocmVzZXQgfHwgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCkpIHtcbiAgICAgIC8vIE1vdmUgdG8gZW5kIG9mIGFycmF5IGFuZCBtYXJrIGFzIHJlbW92ZWRcbiAgICAgIGVudHJ5LnN0YXRlID0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQ7XG4gICAgICB0aGlzLl9lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cbiAgICB0aGlzLl91bmxpbmsoZW50cnkpO1xuICAgIHJldHVybiBlbnRyeS5tb2RlbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHsgc2lsZW50PzogYm9vbGVhbjsgcmVzZXQ/OiBib29sZWFuIH0gPSB7fVxuICApOiBNIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5fcmVtb3ZlTW9kZWwobW9kZWwsIHsgc2lsZW50LCByZXNldCB9KTtcbiAgICBpZiAoIXNpbGVudCAmJiByZW1vdmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBvcHRpb25zOiB7IGFkZGVkOiBbXSwgcmVtb3ZlZDogW3JlbW92ZWRdLCBtZXJnZWQ6IFtdIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVtb3ZlZDtcbiAgfVxuXG4gIHJlbW92ZShcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyBzZXJ2ZXI/OiBib29sZWFuIH0gPSB7fVxuICApOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBpZiAoc2VydmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVSZWZlcmVuY2UobW9kZWwpLnBpcGUoXG4gICAgICAgIG1hcCgobW9kZWwpID0+IHRoaXMucmVtb3ZlTW9kZWwobW9kZWwsIHsgc2lsZW50LCByZXNldDogdHJ1ZSB9KSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZih0aGlzLnJlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbW92ZU1vZGVsKG1vZGVsOiBNLCBwb3NpdGlvbjogbnVtYmVyKTogTSB7XG4gICAgY29uc3Qga2V5ID0gbW9kZWwua2V5KCk7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KHtcbiAgICAgIG1vZGVsLFxuICAgICAga2V5LFxuICAgICAgY2lkOiAoPGFueT5tb2RlbClbdGhpcy5fbW9kZWwubWV0YS5jaWRdLFxuICAgIH0pO1xuICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH1cblxuICAgIC8vIE5vdyByZW1vdmVcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgdGhpcy5fZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKHBvc2l0aW9uLCAwLCBlbnRyeSk7XG5cbiAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gIH1cblxuICBjcmVhdGUoXG4gICAgYXR0cnM6IFQgPSB7fSBhcyBULFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHNlcnZlcj86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbEZhY3RvcnkoYXR0cnMpO1xuICAgIHJldHVybiAobW9kZWwuaXNWYWxpZCgpICYmIHNlcnZlciA/IG1vZGVsLnNhdmUoKSA6IG9mKG1vZGVsKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgobW9kZWwpID0+IHRoaXMuYWRkKG1vZGVsLCB7IHNpbGVudCwgc2VydmVyIH0pKSxcbiAgICAgIG1hcCgoKSA9PiBtb2RlbClcbiAgICApO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZTogYW55LCB7fToge30gJiBNb2RlbEZpZWxkT3B0aW9ucykge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9lbnRyaWVzW051bWJlcihwYXRoQXJyYXlbMF0pXS5tb2RlbDtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSwge30pO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgbGV0IHRvQWRkOiBNW10gPSBbXTtcbiAgICAgIGxldCB0b0NoYW5nZTogTVtdID0gW107XG4gICAgICBsZXQgdG9SZW1vdmU6IE1bXSA9IFtdO1xuICAgICAgbGV0IGluZGV4ID0gTnVtYmVyKHBhdGhBcnJheVswXSk7XG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzKClbaW5kZXhdO1xuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoeyBtb2RlbCB9KTtcbiAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vVE9ETzogUmVtb3ZlL0FkZCBvciBNZXJnZT9cbiAgICAgICAgLy8gTWVyZ2VcbiAgICAgICAgZW50cnkubW9kZWwuYXNzaWduKFxuICAgICAgICAgIHZhbHVlLnRvRW50aXR5KHsgY2xpZW50X2lkOiB0cnVlLCAuLi5JTkNMVURFX0RFRVAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVudHJ5Lm1vZGVsLmhhc0NoYW5nZWQoKSkgdG9DaGFuZ2UucHVzaChtb2RlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBZGRcbiAgICAgICAgdGhpcy5fYWRkTW9kZWwodmFsdWUsIHsgcmVwYXJlbnQ6IHRydWUgfSk7XG4gICAgICAgIHRvQWRkLnB1c2gobW9kZWwpO1xuICAgICAgfVxuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IHRvQWRkLCByZW1vdmVkOiB0b1JlbW92ZSwgY2hhbmdlZDogdG9DaGFuZ2UgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0KHBhdGg6IG51bWJlcik6IE0gfCB1bmRlZmluZWQ7XG4gIGdldChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSk6IGFueTtcbiAgZ2V0KHBhdGg6IGFueSk6IGFueSB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiBgJHtwYXRofWAubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubW9kZWxzKClbTnVtYmVyKHBhdGhBcnJheVswXSldO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmdldChwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBoYXMocGF0aDogbnVtYmVyIHwgc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IGAke3BhdGh9YC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1vZGVscygpW051bWJlcihwYXRoQXJyYXlbMF0pXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEgJiYgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5oYXMocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICByZXNldCh7XG4gICAgcGF0aCxcbiAgICBzaWxlbnQgPSBmYWxzZSxcbiAgfTogeyBwYXRoPzogc3RyaW5nIHwgc3RyaW5nW107IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgbGV0IHRvQWRkOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICAgIGxldCB0b0NoYW5nZTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmU6IE9EYXRhTW9kZWxFbnRyeTxULCBNPltdID0gW107XG5cbiAgICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSZXNldCBieSBwYXRoXG4gICAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogYCR7cGF0aH1gLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICAgKSBhcyBhbnlbXTtcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHBhdGhBcnJheVswXSk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihpbmRleCkpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVscygpW2luZGV4XTtcbiAgICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwobW9kZWwpKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoeyBtb2RlbCB9KSBhcyBPRGF0YU1vZGVsRW50cnk8VCwgTT47XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgJiZcbiAgICAgICAgICAgIGVudHJ5Lm1vZGVsLmhhc0NoYW5nZWQoKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdG9DaGFuZ2UgPSBbZW50cnldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRoID0gcGF0aEFycmF5LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IGFsbFxuICAgICAgdG9BZGQgPSB0aGlzLl9lbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpO1xuICAgICAgdG9DaGFuZ2UgPSB0aGlzLl9lbnRyaWVzLmZpbHRlcihcbiAgICAgICAgKGUpID0+IGUuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgJiYgZS5tb2RlbC5oYXNDaGFuZ2VkKClcbiAgICAgICk7XG4gICAgICB0b1JlbW92ZSA9IHRoaXMuX2VudHJpZXMuZmlsdGVyKChlKSA9PiBlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQpO1xuICAgIH1cblxuICAgIHRvUmVtb3ZlLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVNb2RlbChlbnRyeS5tb2RlbCwgeyBzaWxlbnQgfSk7XG4gICAgfSk7XG4gICAgdG9BZGQuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIHRoaXMuX2FkZE1vZGVsKGVudHJ5Lm1vZGVsLCB7IHNpbGVudCB9KTtcbiAgICB9KTtcbiAgICB0b0NoYW5nZS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgZW50cnkubW9kZWwucmVzZXQoeyBwYXRoLCBzaWxlbnQgfSk7XG4gICAgICBlbnRyeS5zdGF0ZSA9IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQ7XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgIXNpbGVudCAmJlxuICAgICAgKHRvQWRkLmxlbmd0aCA+IDAgfHwgdG9SZW1vdmUubGVuZ3RoID4gMCB8fCB0b0NoYW5nZS5sZW5ndGggPiAwKVxuICAgICkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXNldCwge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgYWRkZWQ6IHRvQWRkLm1hcCgoZSkgPT4gZS5tb2RlbCksXG4gICAgICAgICAgICByZW1vdmVkOiB0b1JlbW92ZS5tYXAoKGUpID0+IGUubW9kZWwpLFxuICAgICAgICAgICAgY2hhbmdlZDogdG9DaGFuZ2UubWFwKChlKSA9PiBlLm1vZGVsKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjbGVhcih7IHNpbGVudCA9IGZhbHNlIH06IHsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBsZXQgdG9SZW1vdmU6IE1bXSA9IHRoaXMubW9kZWxzKCk7XG4gICAgdG9SZW1vdmUuZm9yRWFjaCgobSkgPT4ge1xuICAgICAgdGhpcy5fcmVtb3ZlTW9kZWwobSwgeyBzaWxlbnQgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fZW50cmllcyA9IFtdO1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSwge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczogeyByZW1vdmVkOiB0b1JlbW92ZSB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgb2JqZWN0czogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSB8IE1bXSxcbiAgICB7XG4gICAgICByZW1vdmUgPSB0cnVlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICByZW1vdmU/OiBib29sZWFuO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgY29uc3QgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICBjb25zdCBvZmZzZXQgPSByZW1vdmUgPyAwIDogdGhpcy5sZW5ndGg7XG5cbiAgICBsZXQgdG9BZGQ6IFtNLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgdG9DaGFuZ2U6IFtNLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmU6IFtNLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgdG9Tb3J0OiBbTSwgbnVtYmVyXVtdID0gW107XG4gICAgbGV0IG1vZGVsTWFwOiBzdHJpbmdbXSA9IFtdO1xuICAgIG9iamVjdHMuZm9yRWFjaCgob2JqLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXNNb2RlbCA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwob2JqKTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gaW5kZXggKyBvZmZzZXQ7XG4gICAgICBjb25zdCBrZXkgPVxuICAgICAgICBNb2RlbCAhPT0gbnVsbCAmJiBNb2RlbC5tZXRhID8gTW9kZWwubWV0YS5yZXNvbHZlS2V5KG9iaikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBjaWQgPVxuICAgICAgICBNb2RlbC5tZXRhLmNpZCBpbiBvYmogPyAoPGFueT5vYmopW01vZGVsLm1ldGEuY2lkXSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRyeSBmaW5kIGVudHJ5XG4gICAgICBjb25zdCBlbnRyeSA9IGlzTW9kZWxcbiAgICAgICAgPyB0aGlzLl9maW5kRW50cnkoeyBtb2RlbDogb2JqIGFzIE0gfSkgLy8gQnkgTW9kZWxcbiAgICAgICAgOiB0aGlzLl9maW5kRW50cnkoeyBjaWQsIGtleSB9KTsgLy8gQnkgQ2lkIG9yIEtleVxuXG4gICAgICBsZXQgbW9kZWw6IE07XG4gICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBNZXJnZVxuICAgICAgICBtb2RlbCA9IGVudHJ5Lm1vZGVsO1xuICAgICAgICBpZiAobW9kZWwgIT09IG9iaikge1xuICAgICAgICAgIC8vIEdldCBlbnRpdHkgZnJvbSBtb2RlbFxuICAgICAgICAgIGlmIChpc01vZGVsKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSAob2JqIGFzIE0pLnRvRW50aXR5KHtcbiAgICAgICAgICAgICAgY2xpZW50X2lkOiB0cnVlLFxuICAgICAgICAgICAgICAuLi5JTkNMVURFX0RFRVAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vZGVsLmFzc2lnbihlbnRpdHksIHsgcmVzZXQsIHNpbGVudCB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGVscGVyID0gdGhpcy5fYW5ub3RhdGlvbnMuaGVscGVyO1xuICAgICAgICAgICAgY29uc3QgYW5ub3RzID0gbmV3IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM8VD4oXG4gICAgICAgICAgICAgIGhlbHBlcixcbiAgICAgICAgICAgICAgaGVscGVyLmFubm90YXRpb25zKG9iailcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBhbm5vdHMuYXR0cmlidXRlcyhvYmosICdmdWxsJyk7XG4gICAgICAgICAgICBtb2RlbC5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICAgICAgICBtb2RlbC5hc3NpZ24oZW50aXR5LCB7IHJlc2V0LCBzaWxlbnQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE1vZGVsIENoYW5nZT9cbiAgICAgICAgICBpZiAobW9kZWwuaGFzQ2hhbmdlZCgpKSB0b0NoYW5nZS5wdXNoKFttb2RlbCwgcG9zaXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYXMgU29ydCBvciBJbmRleCBDaGFuZ2U/XG4gICAgICAgIGlmICh0b1NvcnQubGVuZ3RoID4gMCB8fCBwb3NpdGlvbiAhPT0gdGhpcy5tb2RlbHMoKS5pbmRleE9mKG1vZGVsKSkge1xuICAgICAgICAgIHRvU29ydC5wdXNoKFttb2RlbCwgcG9zaXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWRkXG4gICAgICAgIG1vZGVsID0gaXNNb2RlbFxuICAgICAgICAgID8gKG9iaiBhcyBNKVxuICAgICAgICAgIDogdGhpcy5tb2RlbEZhY3Rvcnkob2JqIGFzIFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSk7XG4gICAgICAgIHRvQWRkLnB1c2goW21vZGVsLCBwb3NpdGlvbl0pO1xuICAgICAgfVxuICAgICAgbW9kZWxNYXAucHVzaCgoPGFueT5tb2RlbClbTW9kZWwubWV0YS5jaWRdKTtcbiAgICB9KTtcblxuICAgIGlmIChyZW1vdmUpIHtcbiAgICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoZW50cnksIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgIGlmIChtb2RlbE1hcC5pbmRleE9mKCg8YW55PmVudHJ5Lm1vZGVsKVtNb2RlbC5tZXRhLmNpZF0pID09PSAtMSlcbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKFtlbnRyeS5tb2RlbCwgcG9zaXRpb25dKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHJlbW92ZSwgYWRkIGFuZCBzb3J0XG4gICAgdG9SZW1vdmUuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQgfSk7XG4gICAgfSk7XG4gICAgdG9BZGQuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX2FkZE1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQsIHJlcGFyZW50LCBwb3NpdGlvbiB9KTtcbiAgICB9KTtcbiAgICB0b1NvcnQuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX21vdmVNb2RlbChtb2RlbCwgcG9zaXRpb24pO1xuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgKCFzaWxlbnQgJiZcbiAgICAgICAgKHRvQWRkLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICB0b1JlbW92ZS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgdG9DaGFuZ2UubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHRvU29ydC5sZW5ndGggPiAwKSkgfHxcbiAgICAgIHJlc2V0XG4gICAgKSB7XG4gICAgICB0aGlzLl9zb3J0QnkgPSBudWxsO1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoXG4gICAgICAgICAgcmVzZXQgPyBPRGF0YU1vZGVsRXZlbnRUeXBlLlJlc2V0IDogT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgYWRkZWQ6IHRvQWRkLFxuICAgICAgICAgICAgICByZW1vdmVkOiB0b1JlbW92ZSxcbiAgICAgICAgICAgICAgY2hhbmdlZDogdG9DaGFuZ2UsXG4gICAgICAgICAgICAgIHNvcnRlZDogdG9Tb3J0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcXVlcnkoXG4gICAgY3R4OiAocTogT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyPFQ+LCBzPzogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPikgPT4gdm9pZFxuICApIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICByZXNvdXJjZS5xdWVyeShjdHgpO1xuICAgIHRoaXMuYXR0YWNoKHJlc291cmNlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNhbGxGdW5jdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhRnVuY3Rpb25PcHRpb25zPFI+ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSIHwgT0RhdGFNb2RlbDxSPiB8IE9EYXRhQ29sbGVjdGlvbjxSLCBPRGF0YU1vZGVsPFI+PiB8IG51bGw+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlKSB7XG4gICAgICBjb25zdCBmdW5jID0gcmVzb3VyY2UuZnVuY3Rpb248UCwgUj4obmFtZSk7XG4gICAgICBmdW5jLnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgRXJyb3IoYGNhbGxGdW5jdGlvbjogQ2FuJ3QgZnVuY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVNldFJlc291cmNlYClcbiAgICApO1xuICB9XG5cbiAgY2FsbEFjdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhQWN0aW9uT3B0aW9uczxSPiA9IHt9XG4gICk6IE9ic2VydmFibGU8UiB8IE9EYXRhTW9kZWw8Uj4gfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj4gfCBudWxsPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlKSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKGBjYWxsQWN0aW9uOiBDYW4ndCBhY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVNldFJlc291cmNlYClcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGFjdGlvbiA9IHJlc291cmNlLmFjdGlvbjxQLCBSPihuYW1lKTtcbiAgICBhY3Rpb24ucXVlcnkoKHEpID0+IHEuYXBwbHkob3B0aW9ucykpO1xuICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdW5saW5rKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uKSB7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saW5rKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb246IFN1YnNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cycpO1xuICAgIH1cbiAgICBlbnRyeS5zdWJzY3JpcHRpb24gPSBlbnRyeS5tb2RlbC5ldmVudHMkLnN1YnNjcmliZShcbiAgICAgIChldmVudDogT0RhdGFNb2RlbEV2ZW50PFQ+KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBCVUJCTElORy5pbmRleE9mKGV2ZW50Lm5hbWUpICE9PSAtMSAmJlxuICAgICAgICAgIGV2ZW50LmJ1YmJsaW5nICYmXG4gICAgICAgICAgIWV2ZW50LnZpc2l0ZWQodGhpcylcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGV2ZW50Lm1vZGVsID09PSBlbnRyeS5tb2RlbCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdkZXN0cm95Jykge1xuICAgICAgICAgICAgICB0aGlzLnJlbW92ZU1vZGVsKGVudHJ5Lm1vZGVsLCB7IHJlc2V0OiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5uYW1lID09PSAnY2hhbmdlJyAmJiBldmVudC5vcHRpb25zPy5rZXkpIHtcbiAgICAgICAgICAgICAgZW50cnkua2V5ID0gZW50cnkubW9kZWwua2V5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1vZGVscygpLmluZGV4T2YoZW50cnkubW9kZWwpO1xuICAgICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KGV2ZW50LnB1c2godGhpcywgaW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9maW5kRW50cnkoe1xuICAgIG1vZGVsLFxuICAgIGNpZCxcbiAgICBrZXksXG4gIH06IHtcbiAgICBtb2RlbD86IE9EYXRhTW9kZWw8VD47XG4gICAgY2lkPzogc3RyaW5nO1xuICAgIGtleT86IEVudGl0eUtleTxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllcy5maW5kKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgYnlNb2RlbCA9IG1vZGVsICE9PSB1bmRlZmluZWQgJiYgZW50cnkubW9kZWwuZXF1YWxzKG1vZGVsKTtcbiAgICAgIGNvbnN0IGJ5Q2lkID1cbiAgICAgICAgY2lkICE9PSB1bmRlZmluZWQgJiYgKDxhbnk+ZW50cnkubW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSA9PT0gY2lkO1xuICAgICAgY29uc3QgYnlLZXkgPVxuICAgICAgICBrZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBlbnRyeS5rZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBUeXBlcy5pc0VxdWFsKGVudHJ5LmtleSwga2V5KTtcbiAgICAgIHJldHVybiBieU1vZGVsIHx8IGJ5Q2lkIHx8IGJ5S2V5O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQ29sbGVjdGlvbiBmdW5jdGlvbnNcbiAgZXF1YWxzKG90aGVyOiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcyA9PT0gb3RoZXI7XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdDb2xsZWN0aW9uJztcbiAgfVxuXG4gIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICBsZXQgcG9pbnRlciA9IDA7XG4gICAgbGV0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQoKTogSXRlcmF0b3JSZXN1bHQ8TT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRvbmU6IHBvaW50ZXIgPT09IG1vZGVscy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWU6IG1vZGVsc1twb2ludGVyKytdLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZmlsdGVyKFxuICAgIHByZWRpY2F0ZTogKHZhbHVlOiBNLCBpbmRleDogbnVtYmVyLCBhcnJheTogTVtdKSA9PiB1bmtub3duLFxuICAgIHRoaXNBcmc/OiBhbnlcbiAgKTogTVtdIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxuXG4gIG1hcDxVPihcbiAgICBjYWxsYmFja2ZuOiAodmFsdWU6IE0sIGluZGV4OiBudW1iZXIsIGFycmF5OiBNW10pID0+IFUsXG4gICAgdGhpc0FyZz86IGFueVxuICApOiBVW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLm1hcChjYWxsYmFja2ZuLCB0aGlzQXJnKTtcbiAgfVxuXG4gIGZpbmQoXG4gICAgcHJlZGljYXRlOiAodmFsdWU6IE0sIGluZGV4OiBudW1iZXIsIG9iajogTVtdKSA9PiB1bmtub3duLFxuICAgIHRoaXNBcmc/OiBhbnlcbiAgKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuZmluZChwcmVkaWNhdGUpO1xuICB9XG5cbiAgcmVkdWNlPFU+KFxuICAgIGNhbGxiYWNrZm46IChcbiAgICAgIHByZXZpb3VzVmFsdWU6IFUsXG4gICAgICBjdXJyZW50VmFsdWU6IE0sXG4gICAgICBjdXJyZW50SW5kZXg6IG51bWJlcixcbiAgICAgIGFycmF5OiBNW11cbiAgICApID0+IFUsXG4gICAgaW5pdGlhbFZhbHVlOiBVXG4gICk6IFUge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLnJlZHVjZShjYWxsYmFja2ZuLCBpbml0aWFsVmFsdWUpO1xuICB9XG5cbiAgZmlyc3QoKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKClbMF07XG4gIH1cblxuICBsYXN0KCk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgcmV0dXJuIG1vZGVsc1ttb2RlbHMubGVuZ3RoIC0gMV07XG4gIH1cblxuICBuZXh0KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA9PT0gLTEgfHwgaW5kZXggPT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGluZGV4ICsgMSk7XG4gIH1cblxuICBwcmV2KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA8PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXQoaW5kZXggLSAxKTtcbiAgfVxuXG4gIGV2ZXJ5KHByZWRpY2F0ZTogKG06IE0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5ldmVyeShwcmVkaWNhdGUpO1xuICB9XG5cbiAgc29tZShwcmVkaWNhdGU6IChtOiBNLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuc29tZShwcmVkaWNhdGUpO1xuICB9XG5cbiAgY29udGFpbnMobW9kZWw6IE0pIHtcbiAgICByZXR1cm4gdGhpcy5zb21lKChtKSA9PiBtLmVxdWFscyhtb2RlbCkpO1xuICB9XG5cbiAgaW5kZXhPZihtb2RlbDogTSk6IG51bWJlciB7XG4gICAgY29uc3QgbW9kZWxzID0gdGhpcy5tb2RlbHMoKTtcbiAgICBjb25zdCBtID0gbW9kZWxzLmZpbmQoKG0pID0+IG0uZXF1YWxzKG1vZGVsKSk7XG4gICAgcmV0dXJuIG0gPT09IHVuZGVmaW5lZCA/IC0xIDogbW9kZWxzLmluZGV4T2YobSk7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIC8vIExvY2FsIGxlbmd0aCBhbmQgaWYgZXhpc3RzIHJlbW90ZSBsZW5ndGhcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sZW5ndGggPT09IDAgJiZcbiAgICAgIHRoaXMuYW5ub3RzKCkuY291bnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5hbm5vdHMoKS5jb3VudCA9PT0gMFxuICAgICk7XG4gIH1cblxuICAvLyNyZWdpb24gU29ydFxuICBwcml2YXRlIF9iaXNlY3QobW9kZWw6IE0pIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBpZiAodGhpcy5fc29ydEJ5ICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9lbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBpZiAodGhpcy5fY29tcGFyZShtb2RlbCwgdGhpcy5fZW50cmllc1tpbmRleF0sIHRoaXMuX3NvcnRCeSwgMCkgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBhcmUoXG4gICAgZTE6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgZTI6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgYnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSxcbiAgICBpbmRleDogbnVtYmVyXG4gICk6IG51bWJlciB7XG4gICAgbGV0IG0xID0gT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChlMSlcbiAgICAgID8gKGUxIGFzIE0pXG4gICAgICA6IChlMSBhcyBPRGF0YU1vZGVsRW50cnk8VCwgTT4pLm1vZGVsO1xuICAgIGxldCBtMiA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoZTIpXG4gICAgICA/IChlMiBhcyBNKVxuICAgICAgOiAoZTIgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+KS5tb2RlbDtcbiAgICBsZXQgdmFsdWUxID0gbTEuZ2V0KGJ5W2luZGV4XS5maWVsZCBhcyBzdHJpbmcpO1xuICAgIGxldCB2YWx1ZTIgPSBtMi5nZXQoYnlbaW5kZXhdLmZpZWxkIGFzIHN0cmluZyk7XG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gMDtcblxuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgIT0gbnVsbCkgcmVzdWx0ID0gLTE7XG4gICAgZWxzZSBpZiAodmFsdWUxICE9IG51bGwgJiYgdmFsdWUyID09IG51bGwpIHJlc3VsdCA9IDE7XG4gICAgZWxzZSBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyID09IG51bGwpIHJlc3VsdCA9IDA7XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlMSA9PSAnc3RyaW5nJyB8fCB2YWx1ZTEgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIGlmICh2YWx1ZTEubG9jYWxlQ29tcGFyZSAmJiB2YWx1ZTEgIT0gdmFsdWUyKSB7XG4gICAgICAgIHJldHVybiAoYnlbaW5kZXhdLm9yZGVyIHx8IDEpICogdmFsdWUxLmxvY2FsZUNvbXBhcmUodmFsdWUyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdmFsdWUxIDwgdmFsdWUyID8gLTEgOiAxO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZTEgPT0gdmFsdWUyKSB7XG4gICAgICByZXR1cm4gYnkubGVuZ3RoIC0gMSA+IGluZGV4ID8gdGhpcy5fY29tcGFyZShlMSwgZTIsIGJ5LCBpbmRleCArIDEpIDogMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKGJ5W2luZGV4XS5vcmRlciB8fCAxKSAqIHJlc3VsdDtcbiAgfVxuXG4gIF9zb3J0Qnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSB8IG51bGwgPSBudWxsO1xuICBpc1NvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydEJ5ICE9PSBudWxsO1xuICB9XG5cbiAgc29ydChcbiAgICBieTogeyBmaWVsZDogc3RyaW5nIHwga2V5b2YgVDsgb3JkZXI/OiAxIHwgLTEgfVtdLFxuICAgIHsgc2lsZW50IH06IHsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5fc29ydEJ5ID0gYnk7XG4gICAgdGhpcy5fZW50cmllcyA9IHRoaXMuX2VudHJpZXMuc29ydChcbiAgICAgIChlMTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+LCBlMjogT0RhdGFNb2RlbEVudHJ5PFQsIE0+KSA9PlxuICAgICAgICB0aGlzLl9jb21wYXJlKGUxLCBlMiwgYnksIDApXG4gICAgKTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG4iXX0=
|