@ondewo/csi-client-angular 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +27 -0
- package/api/google/api/annotations.pb.d.ts +1 -0
- package/api/google/api/http.pb.d.ts +275 -0
- package/api/google/rpc/status.pb.d.ts +82 -0
- package/api/google/type/latlng.pb.d.ts +76 -0
- package/api/ondewo/csi/conversation.pb.d.ts +1312 -0
- package/api/ondewo/csi/conversation.pbconf.d.ts +6 -0
- package/api/ondewo/csi/conversation.pbsc.d.ts +167 -0
- package/api/ondewo/nlu/agent.pb.d.ts +3536 -0
- package/api/ondewo/nlu/agent.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/agent.pbsc.d.ts +472 -0
- package/api/ondewo/nlu/aiservices.pb.d.ts +2472 -0
- package/api/ondewo/nlu/aiservices.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/aiservices.pbsc.d.ts +150 -0
- package/api/ondewo/nlu/common.pb.d.ts +75 -0
- package/api/ondewo/nlu/context.pb.d.ts +756 -0
- package/api/ondewo/nlu/context.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/context.pbsc.d.ts +119 -0
- package/api/ondewo/nlu/entity-type.pb.d.ts +2014 -0
- package/api/ondewo/nlu/entity-type.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/entity-type.pbsc.d.ts +216 -0
- package/api/ondewo/nlu/intent.pb.d.ts +6236 -0
- package/api/ondewo/nlu/intent.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/intent.pbsc.d.ts +456 -0
- package/api/ondewo/nlu/operation-metadata.pb.d.ts +166 -0
- package/api/ondewo/nlu/operations.pb.d.ts +578 -0
- package/api/ondewo/nlu/operations.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/operations.pbsc.d.ts +87 -0
- package/api/ondewo/nlu/project-role.pb.d.ts +576 -0
- package/api/ondewo/nlu/project-role.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/project-role.pbsc.d.ts +103 -0
- package/api/ondewo/nlu/project-statistics.pb.d.ts +295 -0
- package/api/ondewo/nlu/project-statistics.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/project-statistics.pbsc.d.ts +151 -0
- package/api/ondewo/nlu/server-statistics.pb.d.ts +71 -0
- package/api/ondewo/nlu/server-statistics.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/server-statistics.pbsc.d.ts +72 -0
- package/api/ondewo/nlu/session.pb.d.ts +2892 -0
- package/api/ondewo/nlu/session.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/session.pbsc.d.ts +247 -0
- package/api/ondewo/nlu/user.pb.d.ts +1577 -0
- package/api/ondewo/nlu/user.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/user.pbsc.d.ts +263 -0
- package/api/ondewo/nlu/utility.pb.d.ts +1814 -0
- package/api/ondewo/nlu/utility.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/utility.pbsc.d.ts +150 -0
- package/api/ondewo/nlu/webhook.pb.d.ts +401 -0
- package/api/ondewo/nlu/webhook.pbconf.d.ts +6 -0
- package/api/ondewo/nlu/webhook.pbsc.d.ts +70 -0
- package/api/ondewo/s2t/speech-to-text.pb.d.ts +3710 -0
- package/api/ondewo/s2t/speech-to-text.pbconf.d.ts +6 -0
- package/api/ondewo/s2t/speech-to-text.pbsc.d.ts +263 -0
- package/api/ondewo/t2s/text-to-speech.pb.d.ts +3302 -0
- package/api/ondewo/t2s/text-to-speech.pbconf.d.ts +11 -0
- package/api/ondewo/t2s/text-to-speech.pbsc.d.ts +296 -0
- package/esm2020/api/google/api/annotations.pb.mjs +2 -0
- package/esm2020/api/google/api/http.pb.mjs +524 -0
- package/esm2020/api/google/rpc/status.pb.mjs +138 -0
- package/esm2020/api/google/type/latlng.pb.mjs +119 -0
- package/esm2020/api/ondewo/csi/conversation.pb.mjs +2232 -0
- package/esm2020/api/ondewo/csi/conversation.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/csi/conversation.pbsc.mjs +315 -0
- package/esm2020/api/ondewo/nlu/agent.pb.mjs +6077 -0
- package/esm2020/api/ondewo/nlu/agent.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/agent.pbsc.mjs +886 -0
- package/esm2020/api/ondewo/nlu/aiservices.pb.mjs +4371 -0
- package/esm2020/api/ondewo/nlu/aiservices.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/aiservices.pbsc.mjs +284 -0
- package/esm2020/api/ondewo/nlu/common.pb.mjs +108 -0
- package/esm2020/api/ondewo/nlu/context.pb.mjs +1233 -0
- package/esm2020/api/ondewo/nlu/context.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/context.pbsc.mjs +225 -0
- package/esm2020/api/ondewo/nlu/entity-type.pb.mjs +3466 -0
- package/esm2020/api/ondewo/nlu/entity-type.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/entity-type.pbsc.mjs +406 -0
- package/esm2020/api/ondewo/nlu/intent.pb.mjs +10809 -0
- package/esm2020/api/ondewo/nlu/intent.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/intent.pbsc.mjs +856 -0
- package/esm2020/api/ondewo/nlu/operation-metadata.pb.mjs +382 -0
- package/esm2020/api/ondewo/nlu/operations.pb.mjs +1003 -0
- package/esm2020/api/ondewo/nlu/operations.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/operations.pbsc.mjs +165 -0
- package/esm2020/api/ondewo/nlu/project-role.pb.mjs +988 -0
- package/esm2020/api/ondewo/nlu/project-role.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/project-role.pbsc.mjs +195 -0
- package/esm2020/api/ondewo/nlu/project-statistics.pb.mjs +460 -0
- package/esm2020/api/ondewo/nlu/project-statistics.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/project-statistics.pbsc.mjs +285 -0
- package/esm2020/api/ondewo/nlu/server-statistics.pb.mjs +103 -0
- package/esm2020/api/ondewo/nlu/server-statistics.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/server-statistics.pbsc.mjs +136 -0
- package/esm2020/api/ondewo/nlu/session.pb.mjs +5351 -0
- package/esm2020/api/ondewo/nlu/session.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/session.pbsc.mjs +465 -0
- package/esm2020/api/ondewo/nlu/user.pb.mjs +2536 -0
- package/esm2020/api/ondewo/nlu/user.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/user.pbsc.mjs +495 -0
- package/esm2020/api/ondewo/nlu/utility.pb.mjs +3302 -0
- package/esm2020/api/ondewo/nlu/utility.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/utility.pbsc.mjs +284 -0
- package/esm2020/api/ondewo/nlu/webhook.pb.mjs +705 -0
- package/esm2020/api/ondewo/nlu/webhook.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/nlu/webhook.pbsc.mjs +134 -0
- package/esm2020/api/ondewo/s2t/speech-to-text.pb.mjs +6452 -0
- package/esm2020/api/ondewo/s2t/speech-to-text.pbconf.mjs +13 -0
- package/esm2020/api/ondewo/s2t/speech-to-text.pbsc.mjs +495 -0
- package/esm2020/api/ondewo/t2s/text-to-speech.pb.mjs +5779 -0
- package/esm2020/api/ondewo/t2s/text-to-speech.pbconf.mjs +18 -0
- package/esm2020/api/ondewo/t2s/text-to-speech.pbsc.mjs +555 -0
- package/esm2020/ondewo-csi-client-angular.mjs +5 -0
- package/esm2020/public-api.mjs +55 -0
- package/fesm2015/ondewo-csi-client-angular.mjs +62142 -0
- package/fesm2015/ondewo-csi-client-angular.mjs.map +1 -0
- package/fesm2020/ondewo-csi-client-angular.mjs +62135 -0
- package/fesm2020/ondewo-csi-client-angular.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/ondewo-csi-api/README.md +91 -0
- package/ondewo-csi-api/google/ads/googleads/README.md +21 -0
- package/ondewo-csi-api/google/api/README.md +5 -0
- package/ondewo-csi-api/google/api/servicecontrol/README.md +126 -0
- package/ondewo-csi-api/google/api/servicemanagement/README.md +102 -0
- package/ondewo-csi-api/google/appengine/README.md +12 -0
- package/ondewo-csi-api/google/assistant/embedded/README.md +3 -0
- package/ondewo-csi-api/google/cloud/functions/README.md +2 -0
- package/ondewo-csi-api/google/cloud/language/README.md +0 -0
- package/ondewo-csi-api/google/cloud/runtimeconfig/README.md +39 -0
- package/ondewo-csi-api/google/cloud/speech/README.md +3 -0
- package/ondewo-csi-api/google/container/README.md +0 -0
- package/ondewo-csi-api/google/datastore/README.md +0 -0
- package/ondewo-csi-api/google/devtools/cloudbuild/README.md +1 -0
- package/ondewo-csi-api/google/devtools/clouderrorreporting/README.md +1 -0
- package/ondewo-csi-api/google/example/library/README.md +4 -0
- package/ondewo-csi-api/google/firestore/README.md +0 -0
- package/ondewo-csi-api/google/genomics/README.md +14 -0
- package/ondewo-csi-api/google/iam/README.md +14 -0
- package/ondewo-csi-api/google/logging/README.md +3 -0
- package/ondewo-csi-api/google/longrunning/README.md +5 -0
- package/ondewo-csi-api/google/privacy/dlp/README.md +7 -0
- package/ondewo-csi-api/google/pubsub/v1beta2/README.md +136 -0
- package/ondewo-csi-api/google/rpc/README.md +5 -0
- package/ondewo-csi-api/google/streetview/publish/README.md +1 -0
- package/ondewo-csi-api/google/type/README.md +16 -0
- package/ondewo-csi-api/googleapis/README.md +87 -0
- package/ondewo-csi-api/googleapis/google/ads/googleads/README.md +21 -0
- package/ondewo-csi-api/googleapis/google/api/README.md +5 -0
- package/ondewo-csi-api/googleapis/google/api/servicecontrol/README.md +126 -0
- package/ondewo-csi-api/googleapis/google/api/servicemanagement/README.md +102 -0
- package/ondewo-csi-api/googleapis/google/appengine/README.md +12 -0
- package/ondewo-csi-api/googleapis/google/assistant/embedded/README.md +3 -0
- package/ondewo-csi-api/googleapis/google/cloud/functions/README.md +2 -0
- package/ondewo-csi-api/googleapis/google/cloud/language/README.md +0 -0
- package/ondewo-csi-api/googleapis/google/cloud/runtimeconfig/README.md +39 -0
- package/ondewo-csi-api/googleapis/google/cloud/speech/README.md +3 -0
- package/ondewo-csi-api/googleapis/google/container/README.md +0 -0
- package/ondewo-csi-api/googleapis/google/datastore/README.md +0 -0
- package/ondewo-csi-api/googleapis/google/devtools/cloudbuild/README.md +1 -0
- package/ondewo-csi-api/googleapis/google/devtools/clouderrorreporting/README.md +1 -0
- package/ondewo-csi-api/googleapis/google/example/library/README.md +4 -0
- package/ondewo-csi-api/googleapis/google/firestore/README.md +0 -0
- package/ondewo-csi-api/googleapis/google/genomics/README.md +14 -0
- package/ondewo-csi-api/googleapis/google/iam/README.md +14 -0
- package/ondewo-csi-api/googleapis/google/logging/README.md +3 -0
- package/ondewo-csi-api/googleapis/google/longrunning/README.md +5 -0
- package/ondewo-csi-api/googleapis/google/privacy/dlp/README.md +7 -0
- package/ondewo-csi-api/googleapis/google/pubsub/v1beta2/README.md +136 -0
- package/ondewo-csi-api/googleapis/google/rpc/README.md +5 -0
- package/ondewo-csi-api/googleapis/google/streetview/publish/README.md +1 -0
- package/ondewo-csi-api/googleapis/google/type/README.md +16 -0
- package/ondewo-csi-api/ondewo-nlu-api/README.md +117 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/README.md +87 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/ads/googleads/README.md +21 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/api/README.md +5 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/api/servicecontrol/README.md +126 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/api/servicemanagement/README.md +102 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/appengine/README.md +12 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/assistant/embedded/README.md +3 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/cloud/functions/README.md +2 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/cloud/language/README.md +0 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/cloud/runtimeconfig/README.md +39 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/cloud/speech/README.md +3 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/container/README.md +0 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/datastore/README.md +0 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/devtools/cloudbuild/README.md +1 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/devtools/clouderrorreporting/README.md +1 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/example/library/README.md +4 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/firestore/README.md +0 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/genomics/README.md +14 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/iam/README.md +14 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/logging/README.md +3 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/longrunning/README.md +5 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/privacy/dlp/README.md +7 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/pubsub/v1beta2/README.md +136 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/rpc/README.md +5 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/streetview/publish/README.md +1 -0
- package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/type/README.md +16 -0
- package/ondewo-csi-api/ondewo-s2t-api/README.md +89 -0
- package/ondewo-csi-api/ondewo-t2s-api/README.md +89 -0
- package/package.json +49 -0
- package/public-api.d.ts +54 -0
|
@@ -0,0 +1,3302 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// @ts-nocheck
|
|
4
|
+
//
|
|
5
|
+
// THIS IS A GENERATED FILE
|
|
6
|
+
// DO NOT MODIFY IT! YOUR CHANGES WILL BE LOST
|
|
7
|
+
import { uint8ArrayToBase64 } from '@ngx-grpc/common';
|
|
8
|
+
import { BinaryReader, BinaryWriter } from 'google-protobuf';
|
|
9
|
+
import * as ondewoNlu008 from '../../ondewo/nlu/intent.pb';
|
|
10
|
+
import * as ondewoNlu009 from '../../ondewo/nlu/entity-type.pb';
|
|
11
|
+
export var ReannotateEntitiesOptions;
|
|
12
|
+
(function (ReannotateEntitiesOptions) {
|
|
13
|
+
ReannotateEntitiesOptions[ReannotateEntitiesOptions["REANNOTATE_NEVER"] = 0] = "REANNOTATE_NEVER";
|
|
14
|
+
ReannotateEntitiesOptions[ReannotateEntitiesOptions["REANNOTATE_ALWAYS"] = 1] = "REANNOTATE_ALWAYS";
|
|
15
|
+
ReannotateEntitiesOptions[ReannotateEntitiesOptions["REANNOTATE_IF_EMPTY"] = 2] = "REANNOTATE_IF_EMPTY";
|
|
16
|
+
ReannotateEntitiesOptions[ReannotateEntitiesOptions["REANNOTATE_AFTER_DELETION"] = 3] = "REANNOTATE_AFTER_DELETION";
|
|
17
|
+
ReannotateEntitiesOptions[ReannotateEntitiesOptions["REANNOTATE_IF_EMPTY_OR_AFTER_DELETION"] = 4] = "REANNOTATE_IF_EMPTY_OR_AFTER_DELETION";
|
|
18
|
+
})(ReannotateEntitiesOptions || (ReannotateEntitiesOptions = {}));
|
|
19
|
+
/**
|
|
20
|
+
* Message implementation for ondewo.nlu.ValidateRegexRequest
|
|
21
|
+
*/
|
|
22
|
+
export class ValidateRegexRequest {
|
|
23
|
+
/**
|
|
24
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
25
|
+
* @param _value initial values object or instance of ValidateRegexRequest to deeply clone from
|
|
26
|
+
*/
|
|
27
|
+
constructor(_value) {
|
|
28
|
+
_value = _value || {};
|
|
29
|
+
this.regex = _value.regex;
|
|
30
|
+
ValidateRegexRequest.refineValues(this);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Deserialize binary data to message
|
|
34
|
+
* @param instance message instance
|
|
35
|
+
*/
|
|
36
|
+
static deserializeBinary(bytes) {
|
|
37
|
+
const instance = new ValidateRegexRequest();
|
|
38
|
+
ValidateRegexRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
39
|
+
return instance;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check all the properties and set default protobuf values if necessary
|
|
43
|
+
* @param _instance message instance
|
|
44
|
+
*/
|
|
45
|
+
static refineValues(_instance) {
|
|
46
|
+
_instance.regex = _instance.regex || '';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
50
|
+
* @param _instance message instance
|
|
51
|
+
* @param _reader binary reader instance
|
|
52
|
+
*/
|
|
53
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
54
|
+
while (_reader.nextField()) {
|
|
55
|
+
if (_reader.isEndGroup())
|
|
56
|
+
break;
|
|
57
|
+
switch (_reader.getFieldNumber()) {
|
|
58
|
+
case 1:
|
|
59
|
+
_instance.regex = _reader.readString();
|
|
60
|
+
break;
|
|
61
|
+
default:
|
|
62
|
+
_reader.skipField();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
ValidateRegexRequest.refineValues(_instance);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Serializes a message to binary format using provided binary reader
|
|
69
|
+
* @param _instance message instance
|
|
70
|
+
* @param _writer binary writer instance
|
|
71
|
+
*/
|
|
72
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
73
|
+
if (_instance.regex) {
|
|
74
|
+
_writer.writeString(1, _instance.regex);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
get regex() {
|
|
78
|
+
return this._regex;
|
|
79
|
+
}
|
|
80
|
+
set regex(value) {
|
|
81
|
+
this._regex = value;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Serialize message to binary data
|
|
85
|
+
* @param instance message instance
|
|
86
|
+
*/
|
|
87
|
+
serializeBinary() {
|
|
88
|
+
const writer = new BinaryWriter();
|
|
89
|
+
ValidateRegexRequest.serializeBinaryToWriter(this, writer);
|
|
90
|
+
return writer.getResultBuffer();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
94
|
+
*/
|
|
95
|
+
toObject() {
|
|
96
|
+
return {
|
|
97
|
+
regex: this.regex
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
102
|
+
*/
|
|
103
|
+
toJSON() {
|
|
104
|
+
return this.toObject();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
108
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
109
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
110
|
+
*/
|
|
111
|
+
toProtobufJSON(
|
|
112
|
+
// @ts-ignore
|
|
113
|
+
options) {
|
|
114
|
+
return {
|
|
115
|
+
regex: this.regex
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
ValidateRegexRequest.id = 'ondewo.nlu.ValidateRegexRequest';
|
|
120
|
+
/**
|
|
121
|
+
* Message implementation for ondewo.nlu.ValidateRegexResponse
|
|
122
|
+
*/
|
|
123
|
+
export class ValidateRegexResponse {
|
|
124
|
+
/**
|
|
125
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
126
|
+
* @param _value initial values object or instance of ValidateRegexResponse to deeply clone from
|
|
127
|
+
*/
|
|
128
|
+
constructor(_value) {
|
|
129
|
+
_value = _value || {};
|
|
130
|
+
this.errorMessages = (_value.errorMessages || []).slice();
|
|
131
|
+
ValidateRegexResponse.refineValues(this);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Deserialize binary data to message
|
|
135
|
+
* @param instance message instance
|
|
136
|
+
*/
|
|
137
|
+
static deserializeBinary(bytes) {
|
|
138
|
+
const instance = new ValidateRegexResponse();
|
|
139
|
+
ValidateRegexResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
140
|
+
return instance;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Check all the properties and set default protobuf values if necessary
|
|
144
|
+
* @param _instance message instance
|
|
145
|
+
*/
|
|
146
|
+
static refineValues(_instance) {
|
|
147
|
+
_instance.errorMessages = _instance.errorMessages || [];
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
151
|
+
* @param _instance message instance
|
|
152
|
+
* @param _reader binary reader instance
|
|
153
|
+
*/
|
|
154
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
155
|
+
while (_reader.nextField()) {
|
|
156
|
+
if (_reader.isEndGroup())
|
|
157
|
+
break;
|
|
158
|
+
switch (_reader.getFieldNumber()) {
|
|
159
|
+
case 1:
|
|
160
|
+
(_instance.errorMessages = _instance.errorMessages || []).push(_reader.readString());
|
|
161
|
+
break;
|
|
162
|
+
default:
|
|
163
|
+
_reader.skipField();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
ValidateRegexResponse.refineValues(_instance);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Serializes a message to binary format using provided binary reader
|
|
170
|
+
* @param _instance message instance
|
|
171
|
+
* @param _writer binary writer instance
|
|
172
|
+
*/
|
|
173
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
174
|
+
if (_instance.errorMessages && _instance.errorMessages.length) {
|
|
175
|
+
_writer.writeRepeatedString(1, _instance.errorMessages);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
get errorMessages() {
|
|
179
|
+
return this._errorMessages;
|
|
180
|
+
}
|
|
181
|
+
set errorMessages(value) {
|
|
182
|
+
this._errorMessages = value;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Serialize message to binary data
|
|
186
|
+
* @param instance message instance
|
|
187
|
+
*/
|
|
188
|
+
serializeBinary() {
|
|
189
|
+
const writer = new BinaryWriter();
|
|
190
|
+
ValidateRegexResponse.serializeBinaryToWriter(this, writer);
|
|
191
|
+
return writer.getResultBuffer();
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
195
|
+
*/
|
|
196
|
+
toObject() {
|
|
197
|
+
return {
|
|
198
|
+
errorMessages: (this.errorMessages || []).slice()
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
203
|
+
*/
|
|
204
|
+
toJSON() {
|
|
205
|
+
return this.toObject();
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
209
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
210
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
211
|
+
*/
|
|
212
|
+
toProtobufJSON(
|
|
213
|
+
// @ts-ignore
|
|
214
|
+
options) {
|
|
215
|
+
return {
|
|
216
|
+
errorMessages: (this.errorMessages || []).slice()
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
ValidateRegexResponse.id = 'ondewo.nlu.ValidateRegexResponse';
|
|
221
|
+
/**
|
|
222
|
+
* Message implementation for ondewo.nlu.ValidateEmbeddedRegexRequest
|
|
223
|
+
*/
|
|
224
|
+
export class ValidateEmbeddedRegexRequest {
|
|
225
|
+
/**
|
|
226
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
227
|
+
* @param _value initial values object or instance of ValidateEmbeddedRegexRequest to deeply clone from
|
|
228
|
+
*/
|
|
229
|
+
constructor(_value) {
|
|
230
|
+
_value = _value || {};
|
|
231
|
+
this.entityType = _value.entityType
|
|
232
|
+
? new ondewoNlu009.EntityType.Entity(_value.entityType)
|
|
233
|
+
: undefined;
|
|
234
|
+
ValidateEmbeddedRegexRequest.refineValues(this);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Deserialize binary data to message
|
|
238
|
+
* @param instance message instance
|
|
239
|
+
*/
|
|
240
|
+
static deserializeBinary(bytes) {
|
|
241
|
+
const instance = new ValidateEmbeddedRegexRequest();
|
|
242
|
+
ValidateEmbeddedRegexRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
243
|
+
return instance;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Check all the properties and set default protobuf values if necessary
|
|
247
|
+
* @param _instance message instance
|
|
248
|
+
*/
|
|
249
|
+
static refineValues(_instance) {
|
|
250
|
+
_instance.entityType = _instance.entityType || undefined;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
254
|
+
* @param _instance message instance
|
|
255
|
+
* @param _reader binary reader instance
|
|
256
|
+
*/
|
|
257
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
258
|
+
while (_reader.nextField()) {
|
|
259
|
+
if (_reader.isEndGroup())
|
|
260
|
+
break;
|
|
261
|
+
switch (_reader.getFieldNumber()) {
|
|
262
|
+
case 1:
|
|
263
|
+
_instance.entityType = new ondewoNlu009.EntityType.Entity();
|
|
264
|
+
_reader.readMessage(_instance.entityType, ondewoNlu009.EntityType.Entity.deserializeBinaryFromReader);
|
|
265
|
+
break;
|
|
266
|
+
default:
|
|
267
|
+
_reader.skipField();
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
ValidateEmbeddedRegexRequest.refineValues(_instance);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Serializes a message to binary format using provided binary reader
|
|
274
|
+
* @param _instance message instance
|
|
275
|
+
* @param _writer binary writer instance
|
|
276
|
+
*/
|
|
277
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
278
|
+
if (_instance.entityType) {
|
|
279
|
+
_writer.writeMessage(1, _instance.entityType, ondewoNlu009.EntityType.Entity.serializeBinaryToWriter);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
get entityType() {
|
|
283
|
+
return this._entityType;
|
|
284
|
+
}
|
|
285
|
+
set entityType(value) {
|
|
286
|
+
this._entityType = value;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Serialize message to binary data
|
|
290
|
+
* @param instance message instance
|
|
291
|
+
*/
|
|
292
|
+
serializeBinary() {
|
|
293
|
+
const writer = new BinaryWriter();
|
|
294
|
+
ValidateEmbeddedRegexRequest.serializeBinaryToWriter(this, writer);
|
|
295
|
+
return writer.getResultBuffer();
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
299
|
+
*/
|
|
300
|
+
toObject() {
|
|
301
|
+
return {
|
|
302
|
+
entityType: this.entityType ? this.entityType.toObject() : undefined
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
307
|
+
*/
|
|
308
|
+
toJSON() {
|
|
309
|
+
return this.toObject();
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
313
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
314
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
315
|
+
*/
|
|
316
|
+
toProtobufJSON(
|
|
317
|
+
// @ts-ignore
|
|
318
|
+
options) {
|
|
319
|
+
return {
|
|
320
|
+
entityType: this.entityType
|
|
321
|
+
? this.entityType.toProtobufJSON(options)
|
|
322
|
+
: null
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
ValidateEmbeddedRegexRequest.id = 'ondewo.nlu.ValidateEmbeddedRegexRequest';
|
|
327
|
+
/**
|
|
328
|
+
* Message implementation for ondewo.nlu.ValidateEmbeddedRegexResponse
|
|
329
|
+
*/
|
|
330
|
+
export class ValidateEmbeddedRegexResponse {
|
|
331
|
+
/**
|
|
332
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
333
|
+
* @param _value initial values object or instance of ValidateEmbeddedRegexResponse to deeply clone from
|
|
334
|
+
*/
|
|
335
|
+
constructor(_value) {
|
|
336
|
+
_value = _value || {};
|
|
337
|
+
this.errorMessages = (_value.errorMessages || []).slice();
|
|
338
|
+
ValidateEmbeddedRegexResponse.refineValues(this);
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Deserialize binary data to message
|
|
342
|
+
* @param instance message instance
|
|
343
|
+
*/
|
|
344
|
+
static deserializeBinary(bytes) {
|
|
345
|
+
const instance = new ValidateEmbeddedRegexResponse();
|
|
346
|
+
ValidateEmbeddedRegexResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
347
|
+
return instance;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Check all the properties and set default protobuf values if necessary
|
|
351
|
+
* @param _instance message instance
|
|
352
|
+
*/
|
|
353
|
+
static refineValues(_instance) {
|
|
354
|
+
_instance.errorMessages = _instance.errorMessages || [];
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
358
|
+
* @param _instance message instance
|
|
359
|
+
* @param _reader binary reader instance
|
|
360
|
+
*/
|
|
361
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
362
|
+
while (_reader.nextField()) {
|
|
363
|
+
if (_reader.isEndGroup())
|
|
364
|
+
break;
|
|
365
|
+
switch (_reader.getFieldNumber()) {
|
|
366
|
+
case 1:
|
|
367
|
+
(_instance.errorMessages = _instance.errorMessages || []).push(_reader.readString());
|
|
368
|
+
break;
|
|
369
|
+
default:
|
|
370
|
+
_reader.skipField();
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
ValidateEmbeddedRegexResponse.refineValues(_instance);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Serializes a message to binary format using provided binary reader
|
|
377
|
+
* @param _instance message instance
|
|
378
|
+
* @param _writer binary writer instance
|
|
379
|
+
*/
|
|
380
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
381
|
+
if (_instance.errorMessages && _instance.errorMessages.length) {
|
|
382
|
+
_writer.writeRepeatedString(1, _instance.errorMessages);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
get errorMessages() {
|
|
386
|
+
return this._errorMessages;
|
|
387
|
+
}
|
|
388
|
+
set errorMessages(value) {
|
|
389
|
+
this._errorMessages = value;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Serialize message to binary data
|
|
393
|
+
* @param instance message instance
|
|
394
|
+
*/
|
|
395
|
+
serializeBinary() {
|
|
396
|
+
const writer = new BinaryWriter();
|
|
397
|
+
ValidateEmbeddedRegexResponse.serializeBinaryToWriter(this, writer);
|
|
398
|
+
return writer.getResultBuffer();
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
402
|
+
*/
|
|
403
|
+
toObject() {
|
|
404
|
+
return {
|
|
405
|
+
errorMessages: (this.errorMessages || []).slice()
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
410
|
+
*/
|
|
411
|
+
toJSON() {
|
|
412
|
+
return this.toObject();
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
416
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
417
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
418
|
+
*/
|
|
419
|
+
toProtobufJSON(
|
|
420
|
+
// @ts-ignore
|
|
421
|
+
options) {
|
|
422
|
+
return {
|
|
423
|
+
errorMessages: (this.errorMessages || []).slice()
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
ValidateEmbeddedRegexResponse.id = 'ondewo.nlu.ValidateEmbeddedRegexResponse';
|
|
428
|
+
/**
|
|
429
|
+
* Message implementation for ondewo.nlu.CleanAllIntentsRequest
|
|
430
|
+
*/
|
|
431
|
+
export class CleanAllIntentsRequest {
|
|
432
|
+
/**
|
|
433
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
434
|
+
* @param _value initial values object or instance of CleanAllIntentsRequest to deeply clone from
|
|
435
|
+
*/
|
|
436
|
+
constructor(_value) {
|
|
437
|
+
_value = _value || {};
|
|
438
|
+
this.parent = _value.parent;
|
|
439
|
+
this.languageCode = _value.languageCode;
|
|
440
|
+
this.specialCharacters = _value.specialCharacters;
|
|
441
|
+
this.substringWhiteList = (_value.substringWhiteList || []).slice();
|
|
442
|
+
this.dryRun = _value.dryRun;
|
|
443
|
+
this.trainingPhraseCleanerOptions = _value.trainingPhraseCleanerOptions
|
|
444
|
+
? new TrainingPhraseCleanerOptions(_value.trainingPhraseCleanerOptions)
|
|
445
|
+
: undefined;
|
|
446
|
+
this.reannotateEntitiesOptions = _value.reannotateEntitiesOptions;
|
|
447
|
+
this.numberOfWorkers = _value.numberOfWorkers;
|
|
448
|
+
CleanAllIntentsRequest.refineValues(this);
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Deserialize binary data to message
|
|
452
|
+
* @param instance message instance
|
|
453
|
+
*/
|
|
454
|
+
static deserializeBinary(bytes) {
|
|
455
|
+
const instance = new CleanAllIntentsRequest();
|
|
456
|
+
CleanAllIntentsRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
457
|
+
return instance;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Check all the properties and set default protobuf values if necessary
|
|
461
|
+
* @param _instance message instance
|
|
462
|
+
*/
|
|
463
|
+
static refineValues(_instance) {
|
|
464
|
+
_instance.parent = _instance.parent || '';
|
|
465
|
+
_instance.languageCode = _instance.languageCode || '';
|
|
466
|
+
_instance.specialCharacters = _instance.specialCharacters || '';
|
|
467
|
+
_instance.substringWhiteList = _instance.substringWhiteList || [];
|
|
468
|
+
_instance.dryRun = _instance.dryRun || false;
|
|
469
|
+
_instance.trainingPhraseCleanerOptions =
|
|
470
|
+
_instance.trainingPhraseCleanerOptions || undefined;
|
|
471
|
+
_instance.reannotateEntitiesOptions =
|
|
472
|
+
_instance.reannotateEntitiesOptions || 0;
|
|
473
|
+
_instance.numberOfWorkers = _instance.numberOfWorkers || 0;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
477
|
+
* @param _instance message instance
|
|
478
|
+
* @param _reader binary reader instance
|
|
479
|
+
*/
|
|
480
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
481
|
+
while (_reader.nextField()) {
|
|
482
|
+
if (_reader.isEndGroup())
|
|
483
|
+
break;
|
|
484
|
+
switch (_reader.getFieldNumber()) {
|
|
485
|
+
case 1:
|
|
486
|
+
_instance.parent = _reader.readString();
|
|
487
|
+
break;
|
|
488
|
+
case 2:
|
|
489
|
+
_instance.languageCode = _reader.readString();
|
|
490
|
+
break;
|
|
491
|
+
case 3:
|
|
492
|
+
_instance.specialCharacters = _reader.readString();
|
|
493
|
+
break;
|
|
494
|
+
case 4:
|
|
495
|
+
(_instance.substringWhiteList =
|
|
496
|
+
_instance.substringWhiteList || []).push(_reader.readString());
|
|
497
|
+
break;
|
|
498
|
+
case 5:
|
|
499
|
+
_instance.dryRun = _reader.readBool();
|
|
500
|
+
break;
|
|
501
|
+
case 6:
|
|
502
|
+
_instance.trainingPhraseCleanerOptions = new TrainingPhraseCleanerOptions();
|
|
503
|
+
_reader.readMessage(_instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.deserializeBinaryFromReader);
|
|
504
|
+
break;
|
|
505
|
+
case 7:
|
|
506
|
+
_instance.reannotateEntitiesOptions = _reader.readEnum();
|
|
507
|
+
break;
|
|
508
|
+
case 8:
|
|
509
|
+
_instance.numberOfWorkers = _reader.readInt32();
|
|
510
|
+
break;
|
|
511
|
+
default:
|
|
512
|
+
_reader.skipField();
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
CleanAllIntentsRequest.refineValues(_instance);
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Serializes a message to binary format using provided binary reader
|
|
519
|
+
* @param _instance message instance
|
|
520
|
+
* @param _writer binary writer instance
|
|
521
|
+
*/
|
|
522
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
523
|
+
if (_instance.parent) {
|
|
524
|
+
_writer.writeString(1, _instance.parent);
|
|
525
|
+
}
|
|
526
|
+
if (_instance.languageCode) {
|
|
527
|
+
_writer.writeString(2, _instance.languageCode);
|
|
528
|
+
}
|
|
529
|
+
if (_instance.specialCharacters) {
|
|
530
|
+
_writer.writeString(3, _instance.specialCharacters);
|
|
531
|
+
}
|
|
532
|
+
if (_instance.substringWhiteList && _instance.substringWhiteList.length) {
|
|
533
|
+
_writer.writeRepeatedString(4, _instance.substringWhiteList);
|
|
534
|
+
}
|
|
535
|
+
if (_instance.dryRun) {
|
|
536
|
+
_writer.writeBool(5, _instance.dryRun);
|
|
537
|
+
}
|
|
538
|
+
if (_instance.trainingPhraseCleanerOptions) {
|
|
539
|
+
_writer.writeMessage(6, _instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.serializeBinaryToWriter);
|
|
540
|
+
}
|
|
541
|
+
if (_instance.reannotateEntitiesOptions) {
|
|
542
|
+
_writer.writeEnum(7, _instance.reannotateEntitiesOptions);
|
|
543
|
+
}
|
|
544
|
+
if (_instance.numberOfWorkers) {
|
|
545
|
+
_writer.writeInt32(8, _instance.numberOfWorkers);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
get parent() {
|
|
549
|
+
return this._parent;
|
|
550
|
+
}
|
|
551
|
+
set parent(value) {
|
|
552
|
+
this._parent = value;
|
|
553
|
+
}
|
|
554
|
+
get languageCode() {
|
|
555
|
+
return this._languageCode;
|
|
556
|
+
}
|
|
557
|
+
set languageCode(value) {
|
|
558
|
+
this._languageCode = value;
|
|
559
|
+
}
|
|
560
|
+
get specialCharacters() {
|
|
561
|
+
return this._specialCharacters;
|
|
562
|
+
}
|
|
563
|
+
set specialCharacters(value) {
|
|
564
|
+
this._specialCharacters = value;
|
|
565
|
+
}
|
|
566
|
+
get substringWhiteList() {
|
|
567
|
+
return this._substringWhiteList;
|
|
568
|
+
}
|
|
569
|
+
set substringWhiteList(value) {
|
|
570
|
+
this._substringWhiteList = value;
|
|
571
|
+
}
|
|
572
|
+
get dryRun() {
|
|
573
|
+
return this._dryRun;
|
|
574
|
+
}
|
|
575
|
+
set dryRun(value) {
|
|
576
|
+
this._dryRun = value;
|
|
577
|
+
}
|
|
578
|
+
get trainingPhraseCleanerOptions() {
|
|
579
|
+
return this._trainingPhraseCleanerOptions;
|
|
580
|
+
}
|
|
581
|
+
set trainingPhraseCleanerOptions(value) {
|
|
582
|
+
this._trainingPhraseCleanerOptions = value;
|
|
583
|
+
}
|
|
584
|
+
get reannotateEntitiesOptions() {
|
|
585
|
+
return this._reannotateEntitiesOptions;
|
|
586
|
+
}
|
|
587
|
+
set reannotateEntitiesOptions(value) {
|
|
588
|
+
this._reannotateEntitiesOptions = value;
|
|
589
|
+
}
|
|
590
|
+
get numberOfWorkers() {
|
|
591
|
+
return this._numberOfWorkers;
|
|
592
|
+
}
|
|
593
|
+
set numberOfWorkers(value) {
|
|
594
|
+
this._numberOfWorkers = value;
|
|
595
|
+
}
|
|
596
|
+
/**
|
|
597
|
+
* Serialize message to binary data
|
|
598
|
+
* @param instance message instance
|
|
599
|
+
*/
|
|
600
|
+
serializeBinary() {
|
|
601
|
+
const writer = new BinaryWriter();
|
|
602
|
+
CleanAllIntentsRequest.serializeBinaryToWriter(this, writer);
|
|
603
|
+
return writer.getResultBuffer();
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
607
|
+
*/
|
|
608
|
+
toObject() {
|
|
609
|
+
return {
|
|
610
|
+
parent: this.parent,
|
|
611
|
+
languageCode: this.languageCode,
|
|
612
|
+
specialCharacters: this.specialCharacters,
|
|
613
|
+
substringWhiteList: (this.substringWhiteList || []).slice(),
|
|
614
|
+
dryRun: this.dryRun,
|
|
615
|
+
trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
|
|
616
|
+
? this.trainingPhraseCleanerOptions.toObject()
|
|
617
|
+
: undefined,
|
|
618
|
+
reannotateEntitiesOptions: this.reannotateEntitiesOptions,
|
|
619
|
+
numberOfWorkers: this.numberOfWorkers
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
624
|
+
*/
|
|
625
|
+
toJSON() {
|
|
626
|
+
return this.toObject();
|
|
627
|
+
}
|
|
628
|
+
/**
|
|
629
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
630
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
631
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
632
|
+
*/
|
|
633
|
+
toProtobufJSON(
|
|
634
|
+
// @ts-ignore
|
|
635
|
+
options) {
|
|
636
|
+
return {
|
|
637
|
+
parent: this.parent,
|
|
638
|
+
languageCode: this.languageCode,
|
|
639
|
+
specialCharacters: this.specialCharacters,
|
|
640
|
+
substringWhiteList: (this.substringWhiteList || []).slice(),
|
|
641
|
+
dryRun: this.dryRun,
|
|
642
|
+
trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
|
|
643
|
+
? this.trainingPhraseCleanerOptions.toProtobufJSON(options)
|
|
644
|
+
: null,
|
|
645
|
+
reannotateEntitiesOptions: ReannotateEntitiesOptions[this.reannotateEntitiesOptions === null ||
|
|
646
|
+
this.reannotateEntitiesOptions === undefined
|
|
647
|
+
? 0
|
|
648
|
+
: this.reannotateEntitiesOptions],
|
|
649
|
+
numberOfWorkers: this.numberOfWorkers
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
CleanAllIntentsRequest.id = 'ondewo.nlu.CleanAllIntentsRequest';
|
|
654
|
+
/**
|
|
655
|
+
* Message implementation for ondewo.nlu.CleanAllIntentsResponse
|
|
656
|
+
*/
|
|
657
|
+
export class CleanAllIntentsResponse {
|
|
658
|
+
/**
|
|
659
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
660
|
+
* @param _value initial values object or instance of CleanAllIntentsResponse to deeply clone from
|
|
661
|
+
*/
|
|
662
|
+
constructor(_value) {
|
|
663
|
+
_value = _value || {};
|
|
664
|
+
this.cleanedIntents = (_value.cleanedIntents || []).map(m => new ondewoNlu008.Intent(m));
|
|
665
|
+
this.intentUpdateList = (_value.intentUpdateList || []).map(m => new IntentUpdate(m));
|
|
666
|
+
CleanAllIntentsResponse.refineValues(this);
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* Deserialize binary data to message
|
|
670
|
+
* @param instance message instance
|
|
671
|
+
*/
|
|
672
|
+
static deserializeBinary(bytes) {
|
|
673
|
+
const instance = new CleanAllIntentsResponse();
|
|
674
|
+
CleanAllIntentsResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
675
|
+
return instance;
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Check all the properties and set default protobuf values if necessary
|
|
679
|
+
* @param _instance message instance
|
|
680
|
+
*/
|
|
681
|
+
static refineValues(_instance) {
|
|
682
|
+
_instance.cleanedIntents = _instance.cleanedIntents || [];
|
|
683
|
+
_instance.intentUpdateList = _instance.intentUpdateList || [];
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
687
|
+
* @param _instance message instance
|
|
688
|
+
* @param _reader binary reader instance
|
|
689
|
+
*/
|
|
690
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
691
|
+
while (_reader.nextField()) {
|
|
692
|
+
if (_reader.isEndGroup())
|
|
693
|
+
break;
|
|
694
|
+
switch (_reader.getFieldNumber()) {
|
|
695
|
+
case 1:
|
|
696
|
+
const messageInitializer1 = new ondewoNlu008.Intent();
|
|
697
|
+
_reader.readMessage(messageInitializer1, ondewoNlu008.Intent.deserializeBinaryFromReader);
|
|
698
|
+
(_instance.cleanedIntents = _instance.cleanedIntents || []).push(messageInitializer1);
|
|
699
|
+
break;
|
|
700
|
+
case 2:
|
|
701
|
+
const messageInitializer2 = new IntentUpdate();
|
|
702
|
+
_reader.readMessage(messageInitializer2, IntentUpdate.deserializeBinaryFromReader);
|
|
703
|
+
(_instance.intentUpdateList = _instance.intentUpdateList || []).push(messageInitializer2);
|
|
704
|
+
break;
|
|
705
|
+
default:
|
|
706
|
+
_reader.skipField();
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
CleanAllIntentsResponse.refineValues(_instance);
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* Serializes a message to binary format using provided binary reader
|
|
713
|
+
* @param _instance message instance
|
|
714
|
+
* @param _writer binary writer instance
|
|
715
|
+
*/
|
|
716
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
717
|
+
if (_instance.cleanedIntents && _instance.cleanedIntents.length) {
|
|
718
|
+
_writer.writeRepeatedMessage(1, _instance.cleanedIntents, ondewoNlu008.Intent.serializeBinaryToWriter);
|
|
719
|
+
}
|
|
720
|
+
if (_instance.intentUpdateList && _instance.intentUpdateList.length) {
|
|
721
|
+
_writer.writeRepeatedMessage(2, _instance.intentUpdateList, IntentUpdate.serializeBinaryToWriter);
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
get cleanedIntents() {
|
|
725
|
+
return this._cleanedIntents;
|
|
726
|
+
}
|
|
727
|
+
set cleanedIntents(value) {
|
|
728
|
+
this._cleanedIntents = value;
|
|
729
|
+
}
|
|
730
|
+
get intentUpdateList() {
|
|
731
|
+
return this._intentUpdateList;
|
|
732
|
+
}
|
|
733
|
+
set intentUpdateList(value) {
|
|
734
|
+
this._intentUpdateList = value;
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* Serialize message to binary data
|
|
738
|
+
* @param instance message instance
|
|
739
|
+
*/
|
|
740
|
+
serializeBinary() {
|
|
741
|
+
const writer = new BinaryWriter();
|
|
742
|
+
CleanAllIntentsResponse.serializeBinaryToWriter(this, writer);
|
|
743
|
+
return writer.getResultBuffer();
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
747
|
+
*/
|
|
748
|
+
toObject() {
|
|
749
|
+
return {
|
|
750
|
+
cleanedIntents: (this.cleanedIntents || []).map(m => m.toObject()),
|
|
751
|
+
intentUpdateList: (this.intentUpdateList || []).map(m => m.toObject())
|
|
752
|
+
};
|
|
753
|
+
}
|
|
754
|
+
/**
|
|
755
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
756
|
+
*/
|
|
757
|
+
toJSON() {
|
|
758
|
+
return this.toObject();
|
|
759
|
+
}
|
|
760
|
+
/**
|
|
761
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
762
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
763
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
764
|
+
*/
|
|
765
|
+
toProtobufJSON(
|
|
766
|
+
// @ts-ignore
|
|
767
|
+
options) {
|
|
768
|
+
return {
|
|
769
|
+
cleanedIntents: (this.cleanedIntents || []).map(m => m.toProtobufJSON(options)),
|
|
770
|
+
intentUpdateList: (this.intentUpdateList || []).map(m => m.toProtobufJSON(options))
|
|
771
|
+
};
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
CleanAllIntentsResponse.id = 'ondewo.nlu.CleanAllIntentsResponse';
|
|
775
|
+
/**
|
|
776
|
+
* Message implementation for ondewo.nlu.CleanIntentRequest
|
|
777
|
+
*/
|
|
778
|
+
export class CleanIntentRequest {
|
|
779
|
+
/**
|
|
780
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
781
|
+
* @param _value initial values object or instance of CleanIntentRequest to deeply clone from
|
|
782
|
+
*/
|
|
783
|
+
constructor(_value) {
|
|
784
|
+
_value = _value || {};
|
|
785
|
+
this.parent = _value.parent;
|
|
786
|
+
this.intentName = _value.intentName;
|
|
787
|
+
this.languageCode = _value.languageCode;
|
|
788
|
+
this.specialCharacters = _value.specialCharacters;
|
|
789
|
+
this.substringWhiteList = (_value.substringWhiteList || []).slice();
|
|
790
|
+
this.dryRun = _value.dryRun;
|
|
791
|
+
this.trainingPhraseCleanerOptions = _value.trainingPhraseCleanerOptions
|
|
792
|
+
? new TrainingPhraseCleanerOptions(_value.trainingPhraseCleanerOptions)
|
|
793
|
+
: undefined;
|
|
794
|
+
this.reannotateEntitiesOptions = _value.reannotateEntitiesOptions;
|
|
795
|
+
CleanIntentRequest.refineValues(this);
|
|
796
|
+
}
|
|
797
|
+
/**
|
|
798
|
+
* Deserialize binary data to message
|
|
799
|
+
* @param instance message instance
|
|
800
|
+
*/
|
|
801
|
+
static deserializeBinary(bytes) {
|
|
802
|
+
const instance = new CleanIntentRequest();
|
|
803
|
+
CleanIntentRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
804
|
+
return instance;
|
|
805
|
+
}
|
|
806
|
+
/**
|
|
807
|
+
* Check all the properties and set default protobuf values if necessary
|
|
808
|
+
* @param _instance message instance
|
|
809
|
+
*/
|
|
810
|
+
static refineValues(_instance) {
|
|
811
|
+
_instance.parent = _instance.parent || '';
|
|
812
|
+
_instance.intentName = _instance.intentName || '';
|
|
813
|
+
_instance.languageCode = _instance.languageCode || '';
|
|
814
|
+
_instance.specialCharacters = _instance.specialCharacters || '';
|
|
815
|
+
_instance.substringWhiteList = _instance.substringWhiteList || [];
|
|
816
|
+
_instance.dryRun = _instance.dryRun || false;
|
|
817
|
+
_instance.trainingPhraseCleanerOptions =
|
|
818
|
+
_instance.trainingPhraseCleanerOptions || undefined;
|
|
819
|
+
_instance.reannotateEntitiesOptions =
|
|
820
|
+
_instance.reannotateEntitiesOptions || 0;
|
|
821
|
+
}
|
|
822
|
+
/**
|
|
823
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
824
|
+
* @param _instance message instance
|
|
825
|
+
* @param _reader binary reader instance
|
|
826
|
+
*/
|
|
827
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
828
|
+
while (_reader.nextField()) {
|
|
829
|
+
if (_reader.isEndGroup())
|
|
830
|
+
break;
|
|
831
|
+
switch (_reader.getFieldNumber()) {
|
|
832
|
+
case 1:
|
|
833
|
+
_instance.parent = _reader.readString();
|
|
834
|
+
break;
|
|
835
|
+
case 2:
|
|
836
|
+
_instance.intentName = _reader.readString();
|
|
837
|
+
break;
|
|
838
|
+
case 3:
|
|
839
|
+
_instance.languageCode = _reader.readString();
|
|
840
|
+
break;
|
|
841
|
+
case 4:
|
|
842
|
+
_instance.specialCharacters = _reader.readString();
|
|
843
|
+
break;
|
|
844
|
+
case 5:
|
|
845
|
+
(_instance.substringWhiteList =
|
|
846
|
+
_instance.substringWhiteList || []).push(_reader.readString());
|
|
847
|
+
break;
|
|
848
|
+
case 6:
|
|
849
|
+
_instance.dryRun = _reader.readBool();
|
|
850
|
+
break;
|
|
851
|
+
case 7:
|
|
852
|
+
_instance.trainingPhraseCleanerOptions = new TrainingPhraseCleanerOptions();
|
|
853
|
+
_reader.readMessage(_instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.deserializeBinaryFromReader);
|
|
854
|
+
break;
|
|
855
|
+
case 8:
|
|
856
|
+
_instance.reannotateEntitiesOptions = _reader.readEnum();
|
|
857
|
+
break;
|
|
858
|
+
default:
|
|
859
|
+
_reader.skipField();
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
CleanIntentRequest.refineValues(_instance);
|
|
863
|
+
}
|
|
864
|
+
/**
|
|
865
|
+
* Serializes a message to binary format using provided binary reader
|
|
866
|
+
* @param _instance message instance
|
|
867
|
+
* @param _writer binary writer instance
|
|
868
|
+
*/
|
|
869
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
870
|
+
if (_instance.parent) {
|
|
871
|
+
_writer.writeString(1, _instance.parent);
|
|
872
|
+
}
|
|
873
|
+
if (_instance.intentName) {
|
|
874
|
+
_writer.writeString(2, _instance.intentName);
|
|
875
|
+
}
|
|
876
|
+
if (_instance.languageCode) {
|
|
877
|
+
_writer.writeString(3, _instance.languageCode);
|
|
878
|
+
}
|
|
879
|
+
if (_instance.specialCharacters) {
|
|
880
|
+
_writer.writeString(4, _instance.specialCharacters);
|
|
881
|
+
}
|
|
882
|
+
if (_instance.substringWhiteList && _instance.substringWhiteList.length) {
|
|
883
|
+
_writer.writeRepeatedString(5, _instance.substringWhiteList);
|
|
884
|
+
}
|
|
885
|
+
if (_instance.dryRun) {
|
|
886
|
+
_writer.writeBool(6, _instance.dryRun);
|
|
887
|
+
}
|
|
888
|
+
if (_instance.trainingPhraseCleanerOptions) {
|
|
889
|
+
_writer.writeMessage(7, _instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.serializeBinaryToWriter);
|
|
890
|
+
}
|
|
891
|
+
if (_instance.reannotateEntitiesOptions) {
|
|
892
|
+
_writer.writeEnum(8, _instance.reannotateEntitiesOptions);
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
get parent() {
|
|
896
|
+
return this._parent;
|
|
897
|
+
}
|
|
898
|
+
set parent(value) {
|
|
899
|
+
this._parent = value;
|
|
900
|
+
}
|
|
901
|
+
get intentName() {
|
|
902
|
+
return this._intentName;
|
|
903
|
+
}
|
|
904
|
+
set intentName(value) {
|
|
905
|
+
this._intentName = value;
|
|
906
|
+
}
|
|
907
|
+
get languageCode() {
|
|
908
|
+
return this._languageCode;
|
|
909
|
+
}
|
|
910
|
+
set languageCode(value) {
|
|
911
|
+
this._languageCode = value;
|
|
912
|
+
}
|
|
913
|
+
get specialCharacters() {
|
|
914
|
+
return this._specialCharacters;
|
|
915
|
+
}
|
|
916
|
+
set specialCharacters(value) {
|
|
917
|
+
this._specialCharacters = value;
|
|
918
|
+
}
|
|
919
|
+
get substringWhiteList() {
|
|
920
|
+
return this._substringWhiteList;
|
|
921
|
+
}
|
|
922
|
+
set substringWhiteList(value) {
|
|
923
|
+
this._substringWhiteList = value;
|
|
924
|
+
}
|
|
925
|
+
get dryRun() {
|
|
926
|
+
return this._dryRun;
|
|
927
|
+
}
|
|
928
|
+
set dryRun(value) {
|
|
929
|
+
this._dryRun = value;
|
|
930
|
+
}
|
|
931
|
+
get trainingPhraseCleanerOptions() {
|
|
932
|
+
return this._trainingPhraseCleanerOptions;
|
|
933
|
+
}
|
|
934
|
+
set trainingPhraseCleanerOptions(value) {
|
|
935
|
+
this._trainingPhraseCleanerOptions = value;
|
|
936
|
+
}
|
|
937
|
+
get reannotateEntitiesOptions() {
|
|
938
|
+
return this._reannotateEntitiesOptions;
|
|
939
|
+
}
|
|
940
|
+
set reannotateEntitiesOptions(value) {
|
|
941
|
+
this._reannotateEntitiesOptions = value;
|
|
942
|
+
}
|
|
943
|
+
/**
|
|
944
|
+
* Serialize message to binary data
|
|
945
|
+
* @param instance message instance
|
|
946
|
+
*/
|
|
947
|
+
serializeBinary() {
|
|
948
|
+
const writer = new BinaryWriter();
|
|
949
|
+
CleanIntentRequest.serializeBinaryToWriter(this, writer);
|
|
950
|
+
return writer.getResultBuffer();
|
|
951
|
+
}
|
|
952
|
+
/**
|
|
953
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
954
|
+
*/
|
|
955
|
+
toObject() {
|
|
956
|
+
return {
|
|
957
|
+
parent: this.parent,
|
|
958
|
+
intentName: this.intentName,
|
|
959
|
+
languageCode: this.languageCode,
|
|
960
|
+
specialCharacters: this.specialCharacters,
|
|
961
|
+
substringWhiteList: (this.substringWhiteList || []).slice(),
|
|
962
|
+
dryRun: this.dryRun,
|
|
963
|
+
trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
|
|
964
|
+
? this.trainingPhraseCleanerOptions.toObject()
|
|
965
|
+
: undefined,
|
|
966
|
+
reannotateEntitiesOptions: this.reannotateEntitiesOptions
|
|
967
|
+
};
|
|
968
|
+
}
|
|
969
|
+
/**
|
|
970
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
971
|
+
*/
|
|
972
|
+
toJSON() {
|
|
973
|
+
return this.toObject();
|
|
974
|
+
}
|
|
975
|
+
/**
|
|
976
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
977
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
978
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
979
|
+
*/
|
|
980
|
+
toProtobufJSON(
|
|
981
|
+
// @ts-ignore
|
|
982
|
+
options) {
|
|
983
|
+
return {
|
|
984
|
+
parent: this.parent,
|
|
985
|
+
intentName: this.intentName,
|
|
986
|
+
languageCode: this.languageCode,
|
|
987
|
+
specialCharacters: this.specialCharacters,
|
|
988
|
+
substringWhiteList: (this.substringWhiteList || []).slice(),
|
|
989
|
+
dryRun: this.dryRun,
|
|
990
|
+
trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
|
|
991
|
+
? this.trainingPhraseCleanerOptions.toProtobufJSON(options)
|
|
992
|
+
: null,
|
|
993
|
+
reannotateEntitiesOptions: ReannotateEntitiesOptions[this.reannotateEntitiesOptions === null ||
|
|
994
|
+
this.reannotateEntitiesOptions === undefined
|
|
995
|
+
? 0
|
|
996
|
+
: this.reannotateEntitiesOptions]
|
|
997
|
+
};
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
CleanIntentRequest.id = 'ondewo.nlu.CleanIntentRequest';
|
|
1001
|
+
/**
|
|
1002
|
+
* Message implementation for ondewo.nlu.CleanIntentResponse
|
|
1003
|
+
*/
|
|
1004
|
+
export class CleanIntentResponse {
|
|
1005
|
+
/**
|
|
1006
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1007
|
+
* @param _value initial values object or instance of CleanIntentResponse to deeply clone from
|
|
1008
|
+
*/
|
|
1009
|
+
constructor(_value) {
|
|
1010
|
+
_value = _value || {};
|
|
1011
|
+
this.cleanedIntent = _value.cleanedIntent
|
|
1012
|
+
? new ondewoNlu008.Intent(_value.cleanedIntent)
|
|
1013
|
+
: undefined;
|
|
1014
|
+
this.intentUpdate = _value.intentUpdate
|
|
1015
|
+
? new IntentUpdate(_value.intentUpdate)
|
|
1016
|
+
: undefined;
|
|
1017
|
+
CleanIntentResponse.refineValues(this);
|
|
1018
|
+
}
|
|
1019
|
+
/**
|
|
1020
|
+
* Deserialize binary data to message
|
|
1021
|
+
* @param instance message instance
|
|
1022
|
+
*/
|
|
1023
|
+
static deserializeBinary(bytes) {
|
|
1024
|
+
const instance = new CleanIntentResponse();
|
|
1025
|
+
CleanIntentResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1026
|
+
return instance;
|
|
1027
|
+
}
|
|
1028
|
+
/**
|
|
1029
|
+
* Check all the properties and set default protobuf values if necessary
|
|
1030
|
+
* @param _instance message instance
|
|
1031
|
+
*/
|
|
1032
|
+
static refineValues(_instance) {
|
|
1033
|
+
_instance.cleanedIntent = _instance.cleanedIntent || undefined;
|
|
1034
|
+
_instance.intentUpdate = _instance.intentUpdate || undefined;
|
|
1035
|
+
}
|
|
1036
|
+
/**
|
|
1037
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1038
|
+
* @param _instance message instance
|
|
1039
|
+
* @param _reader binary reader instance
|
|
1040
|
+
*/
|
|
1041
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1042
|
+
while (_reader.nextField()) {
|
|
1043
|
+
if (_reader.isEndGroup())
|
|
1044
|
+
break;
|
|
1045
|
+
switch (_reader.getFieldNumber()) {
|
|
1046
|
+
case 1:
|
|
1047
|
+
_instance.cleanedIntent = new ondewoNlu008.Intent();
|
|
1048
|
+
_reader.readMessage(_instance.cleanedIntent, ondewoNlu008.Intent.deserializeBinaryFromReader);
|
|
1049
|
+
break;
|
|
1050
|
+
case 2:
|
|
1051
|
+
_instance.intentUpdate = new IntentUpdate();
|
|
1052
|
+
_reader.readMessage(_instance.intentUpdate, IntentUpdate.deserializeBinaryFromReader);
|
|
1053
|
+
break;
|
|
1054
|
+
default:
|
|
1055
|
+
_reader.skipField();
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
CleanIntentResponse.refineValues(_instance);
|
|
1059
|
+
}
|
|
1060
|
+
/**
|
|
1061
|
+
* Serializes a message to binary format using provided binary reader
|
|
1062
|
+
* @param _instance message instance
|
|
1063
|
+
* @param _writer binary writer instance
|
|
1064
|
+
*/
|
|
1065
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
1066
|
+
if (_instance.cleanedIntent) {
|
|
1067
|
+
_writer.writeMessage(1, _instance.cleanedIntent, ondewoNlu008.Intent.serializeBinaryToWriter);
|
|
1068
|
+
}
|
|
1069
|
+
if (_instance.intentUpdate) {
|
|
1070
|
+
_writer.writeMessage(2, _instance.intentUpdate, IntentUpdate.serializeBinaryToWriter);
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
get cleanedIntent() {
|
|
1074
|
+
return this._cleanedIntent;
|
|
1075
|
+
}
|
|
1076
|
+
set cleanedIntent(value) {
|
|
1077
|
+
this._cleanedIntent = value;
|
|
1078
|
+
}
|
|
1079
|
+
get intentUpdate() {
|
|
1080
|
+
return this._intentUpdate;
|
|
1081
|
+
}
|
|
1082
|
+
set intentUpdate(value) {
|
|
1083
|
+
this._intentUpdate = value;
|
|
1084
|
+
}
|
|
1085
|
+
/**
|
|
1086
|
+
* Serialize message to binary data
|
|
1087
|
+
* @param instance message instance
|
|
1088
|
+
*/
|
|
1089
|
+
serializeBinary() {
|
|
1090
|
+
const writer = new BinaryWriter();
|
|
1091
|
+
CleanIntentResponse.serializeBinaryToWriter(this, writer);
|
|
1092
|
+
return writer.getResultBuffer();
|
|
1093
|
+
}
|
|
1094
|
+
/**
|
|
1095
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1096
|
+
*/
|
|
1097
|
+
toObject() {
|
|
1098
|
+
return {
|
|
1099
|
+
cleanedIntent: this.cleanedIntent
|
|
1100
|
+
? this.cleanedIntent.toObject()
|
|
1101
|
+
: undefined,
|
|
1102
|
+
intentUpdate: this.intentUpdate ? this.intentUpdate.toObject() : undefined
|
|
1103
|
+
};
|
|
1104
|
+
}
|
|
1105
|
+
/**
|
|
1106
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1107
|
+
*/
|
|
1108
|
+
toJSON() {
|
|
1109
|
+
return this.toObject();
|
|
1110
|
+
}
|
|
1111
|
+
/**
|
|
1112
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1113
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1114
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
1115
|
+
*/
|
|
1116
|
+
toProtobufJSON(
|
|
1117
|
+
// @ts-ignore
|
|
1118
|
+
options) {
|
|
1119
|
+
return {
|
|
1120
|
+
cleanedIntent: this.cleanedIntent
|
|
1121
|
+
? this.cleanedIntent.toProtobufJSON(options)
|
|
1122
|
+
: null,
|
|
1123
|
+
intentUpdate: this.intentUpdate
|
|
1124
|
+
? this.intentUpdate.toProtobufJSON(options)
|
|
1125
|
+
: null
|
|
1126
|
+
};
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
CleanIntentResponse.id = 'ondewo.nlu.CleanIntentResponse';
|
|
1130
|
+
/**
|
|
1131
|
+
* Message implementation for ondewo.nlu.TrainingPhraseCleanerOptions
|
|
1132
|
+
*/
|
|
1133
|
+
export class TrainingPhraseCleanerOptions {
|
|
1134
|
+
/**
|
|
1135
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1136
|
+
* @param _value initial values object or instance of TrainingPhraseCleanerOptions to deeply clone from
|
|
1137
|
+
*/
|
|
1138
|
+
constructor(_value) {
|
|
1139
|
+
_value = _value || {};
|
|
1140
|
+
this.deleteRepeatedWhitespaces = _value.deleteRepeatedWhitespaces;
|
|
1141
|
+
this.deleteLeadingSpecialCharacters = _value.deleteLeadingSpecialCharacters;
|
|
1142
|
+
this.deleteTrailingSpecialCharacters =
|
|
1143
|
+
_value.deleteTrailingSpecialCharacters;
|
|
1144
|
+
TrainingPhraseCleanerOptions.refineValues(this);
|
|
1145
|
+
}
|
|
1146
|
+
/**
|
|
1147
|
+
* Deserialize binary data to message
|
|
1148
|
+
* @param instance message instance
|
|
1149
|
+
*/
|
|
1150
|
+
static deserializeBinary(bytes) {
|
|
1151
|
+
const instance = new TrainingPhraseCleanerOptions();
|
|
1152
|
+
TrainingPhraseCleanerOptions.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1153
|
+
return instance;
|
|
1154
|
+
}
|
|
1155
|
+
/**
|
|
1156
|
+
* Check all the properties and set default protobuf values if necessary
|
|
1157
|
+
* @param _instance message instance
|
|
1158
|
+
*/
|
|
1159
|
+
static refineValues(_instance) {
|
|
1160
|
+
_instance.deleteRepeatedWhitespaces =
|
|
1161
|
+
_instance.deleteRepeatedWhitespaces || false;
|
|
1162
|
+
_instance.deleteLeadingSpecialCharacters =
|
|
1163
|
+
_instance.deleteLeadingSpecialCharacters || false;
|
|
1164
|
+
_instance.deleteTrailingSpecialCharacters =
|
|
1165
|
+
_instance.deleteTrailingSpecialCharacters || false;
|
|
1166
|
+
}
|
|
1167
|
+
/**
|
|
1168
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1169
|
+
* @param _instance message instance
|
|
1170
|
+
* @param _reader binary reader instance
|
|
1171
|
+
*/
|
|
1172
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1173
|
+
while (_reader.nextField()) {
|
|
1174
|
+
if (_reader.isEndGroup())
|
|
1175
|
+
break;
|
|
1176
|
+
switch (_reader.getFieldNumber()) {
|
|
1177
|
+
case 1:
|
|
1178
|
+
_instance.deleteRepeatedWhitespaces = _reader.readBool();
|
|
1179
|
+
break;
|
|
1180
|
+
case 2:
|
|
1181
|
+
_instance.deleteLeadingSpecialCharacters = _reader.readBool();
|
|
1182
|
+
break;
|
|
1183
|
+
case 3:
|
|
1184
|
+
_instance.deleteTrailingSpecialCharacters = _reader.readBool();
|
|
1185
|
+
break;
|
|
1186
|
+
default:
|
|
1187
|
+
_reader.skipField();
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
TrainingPhraseCleanerOptions.refineValues(_instance);
|
|
1191
|
+
}
|
|
1192
|
+
/**
|
|
1193
|
+
* Serializes a message to binary format using provided binary reader
|
|
1194
|
+
* @param _instance message instance
|
|
1195
|
+
* @param _writer binary writer instance
|
|
1196
|
+
*/
|
|
1197
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
1198
|
+
if (_instance.deleteRepeatedWhitespaces) {
|
|
1199
|
+
_writer.writeBool(1, _instance.deleteRepeatedWhitespaces);
|
|
1200
|
+
}
|
|
1201
|
+
if (_instance.deleteLeadingSpecialCharacters) {
|
|
1202
|
+
_writer.writeBool(2, _instance.deleteLeadingSpecialCharacters);
|
|
1203
|
+
}
|
|
1204
|
+
if (_instance.deleteTrailingSpecialCharacters) {
|
|
1205
|
+
_writer.writeBool(3, _instance.deleteTrailingSpecialCharacters);
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
get deleteRepeatedWhitespaces() {
|
|
1209
|
+
return this._deleteRepeatedWhitespaces;
|
|
1210
|
+
}
|
|
1211
|
+
set deleteRepeatedWhitespaces(value) {
|
|
1212
|
+
this._deleteRepeatedWhitespaces = value;
|
|
1213
|
+
}
|
|
1214
|
+
get deleteLeadingSpecialCharacters() {
|
|
1215
|
+
return this._deleteLeadingSpecialCharacters;
|
|
1216
|
+
}
|
|
1217
|
+
set deleteLeadingSpecialCharacters(value) {
|
|
1218
|
+
this._deleteLeadingSpecialCharacters = value;
|
|
1219
|
+
}
|
|
1220
|
+
get deleteTrailingSpecialCharacters() {
|
|
1221
|
+
return this._deleteTrailingSpecialCharacters;
|
|
1222
|
+
}
|
|
1223
|
+
set deleteTrailingSpecialCharacters(value) {
|
|
1224
|
+
this._deleteTrailingSpecialCharacters = value;
|
|
1225
|
+
}
|
|
1226
|
+
/**
|
|
1227
|
+
* Serialize message to binary data
|
|
1228
|
+
* @param instance message instance
|
|
1229
|
+
*/
|
|
1230
|
+
serializeBinary() {
|
|
1231
|
+
const writer = new BinaryWriter();
|
|
1232
|
+
TrainingPhraseCleanerOptions.serializeBinaryToWriter(this, writer);
|
|
1233
|
+
return writer.getResultBuffer();
|
|
1234
|
+
}
|
|
1235
|
+
/**
|
|
1236
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1237
|
+
*/
|
|
1238
|
+
toObject() {
|
|
1239
|
+
return {
|
|
1240
|
+
deleteRepeatedWhitespaces: this.deleteRepeatedWhitespaces,
|
|
1241
|
+
deleteLeadingSpecialCharacters: this.deleteLeadingSpecialCharacters,
|
|
1242
|
+
deleteTrailingSpecialCharacters: this.deleteTrailingSpecialCharacters
|
|
1243
|
+
};
|
|
1244
|
+
}
|
|
1245
|
+
/**
|
|
1246
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1247
|
+
*/
|
|
1248
|
+
toJSON() {
|
|
1249
|
+
return this.toObject();
|
|
1250
|
+
}
|
|
1251
|
+
/**
|
|
1252
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1253
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1254
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
1255
|
+
*/
|
|
1256
|
+
toProtobufJSON(
|
|
1257
|
+
// @ts-ignore
|
|
1258
|
+
options) {
|
|
1259
|
+
return {
|
|
1260
|
+
deleteRepeatedWhitespaces: this.deleteRepeatedWhitespaces,
|
|
1261
|
+
deleteLeadingSpecialCharacters: this.deleteLeadingSpecialCharacters,
|
|
1262
|
+
deleteTrailingSpecialCharacters: this.deleteTrailingSpecialCharacters
|
|
1263
|
+
};
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
TrainingPhraseCleanerOptions.id = 'ondewo.nlu.TrainingPhraseCleanerOptions';
|
|
1267
|
+
/**
|
|
1268
|
+
* Message implementation for ondewo.nlu.StringUpdate
|
|
1269
|
+
*/
|
|
1270
|
+
export class StringUpdate {
|
|
1271
|
+
/**
|
|
1272
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1273
|
+
* @param _value initial values object or instance of StringUpdate to deeply clone from
|
|
1274
|
+
*/
|
|
1275
|
+
constructor(_value) {
|
|
1276
|
+
_value = _value || {};
|
|
1277
|
+
this.new = _value.new;
|
|
1278
|
+
this.old = _value.old;
|
|
1279
|
+
StringUpdate.refineValues(this);
|
|
1280
|
+
}
|
|
1281
|
+
/**
|
|
1282
|
+
* Deserialize binary data to message
|
|
1283
|
+
* @param instance message instance
|
|
1284
|
+
*/
|
|
1285
|
+
static deserializeBinary(bytes) {
|
|
1286
|
+
const instance = new StringUpdate();
|
|
1287
|
+
StringUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1288
|
+
return instance;
|
|
1289
|
+
}
|
|
1290
|
+
/**
|
|
1291
|
+
* Check all the properties and set default protobuf values if necessary
|
|
1292
|
+
* @param _instance message instance
|
|
1293
|
+
*/
|
|
1294
|
+
static refineValues(_instance) {
|
|
1295
|
+
_instance.new = _instance.new || '';
|
|
1296
|
+
_instance.old = _instance.old || '';
|
|
1297
|
+
}
|
|
1298
|
+
/**
|
|
1299
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1300
|
+
* @param _instance message instance
|
|
1301
|
+
* @param _reader binary reader instance
|
|
1302
|
+
*/
|
|
1303
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1304
|
+
while (_reader.nextField()) {
|
|
1305
|
+
if (_reader.isEndGroup())
|
|
1306
|
+
break;
|
|
1307
|
+
switch (_reader.getFieldNumber()) {
|
|
1308
|
+
case 1:
|
|
1309
|
+
_instance.new = _reader.readString();
|
|
1310
|
+
break;
|
|
1311
|
+
case 2:
|
|
1312
|
+
_instance.old = _reader.readString();
|
|
1313
|
+
break;
|
|
1314
|
+
default:
|
|
1315
|
+
_reader.skipField();
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
StringUpdate.refineValues(_instance);
|
|
1319
|
+
}
|
|
1320
|
+
/**
|
|
1321
|
+
* Serializes a message to binary format using provided binary reader
|
|
1322
|
+
* @param _instance message instance
|
|
1323
|
+
* @param _writer binary writer instance
|
|
1324
|
+
*/
|
|
1325
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
1326
|
+
if (_instance.new) {
|
|
1327
|
+
_writer.writeString(1, _instance.new);
|
|
1328
|
+
}
|
|
1329
|
+
if (_instance.old) {
|
|
1330
|
+
_writer.writeString(2, _instance.old);
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
get new() {
|
|
1334
|
+
return this._new;
|
|
1335
|
+
}
|
|
1336
|
+
set new(value) {
|
|
1337
|
+
this._new = value;
|
|
1338
|
+
}
|
|
1339
|
+
get old() {
|
|
1340
|
+
return this._old;
|
|
1341
|
+
}
|
|
1342
|
+
set old(value) {
|
|
1343
|
+
this._old = value;
|
|
1344
|
+
}
|
|
1345
|
+
/**
|
|
1346
|
+
* Serialize message to binary data
|
|
1347
|
+
* @param instance message instance
|
|
1348
|
+
*/
|
|
1349
|
+
serializeBinary() {
|
|
1350
|
+
const writer = new BinaryWriter();
|
|
1351
|
+
StringUpdate.serializeBinaryToWriter(this, writer);
|
|
1352
|
+
return writer.getResultBuffer();
|
|
1353
|
+
}
|
|
1354
|
+
/**
|
|
1355
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1356
|
+
*/
|
|
1357
|
+
toObject() {
|
|
1358
|
+
return {
|
|
1359
|
+
new: this.new,
|
|
1360
|
+
old: this.old
|
|
1361
|
+
};
|
|
1362
|
+
}
|
|
1363
|
+
/**
|
|
1364
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1365
|
+
*/
|
|
1366
|
+
toJSON() {
|
|
1367
|
+
return this.toObject();
|
|
1368
|
+
}
|
|
1369
|
+
/**
|
|
1370
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1371
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1372
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
1373
|
+
*/
|
|
1374
|
+
toProtobufJSON(
|
|
1375
|
+
// @ts-ignore
|
|
1376
|
+
options) {
|
|
1377
|
+
return {
|
|
1378
|
+
new: this.new,
|
|
1379
|
+
old: this.old
|
|
1380
|
+
};
|
|
1381
|
+
}
|
|
1382
|
+
}
|
|
1383
|
+
StringUpdate.id = 'ondewo.nlu.StringUpdate';
|
|
1384
|
+
/**
|
|
1385
|
+
* Message implementation for ondewo.nlu.IntentUpdate
|
|
1386
|
+
*/
|
|
1387
|
+
export class IntentUpdate {
|
|
1388
|
+
/**
|
|
1389
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1390
|
+
* @param _value initial values object or instance of IntentUpdate to deeply clone from
|
|
1391
|
+
*/
|
|
1392
|
+
constructor(_value) {
|
|
1393
|
+
_value = _value || {};
|
|
1394
|
+
this.intentDisplayName = _value.intentDisplayName;
|
|
1395
|
+
this.trainingPhraseUpdateList = (_value.trainingPhraseUpdateList || []).map(m => new IntentUpdate.TrainingPhraseUpdate(m));
|
|
1396
|
+
this.deletedParameters = (_value.deletedParameters || []).slice();
|
|
1397
|
+
IntentUpdate.refineValues(this);
|
|
1398
|
+
}
|
|
1399
|
+
/**
|
|
1400
|
+
* Deserialize binary data to message
|
|
1401
|
+
* @param instance message instance
|
|
1402
|
+
*/
|
|
1403
|
+
static deserializeBinary(bytes) {
|
|
1404
|
+
const instance = new IntentUpdate();
|
|
1405
|
+
IntentUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1406
|
+
return instance;
|
|
1407
|
+
}
|
|
1408
|
+
/**
|
|
1409
|
+
* Check all the properties and set default protobuf values if necessary
|
|
1410
|
+
* @param _instance message instance
|
|
1411
|
+
*/
|
|
1412
|
+
static refineValues(_instance) {
|
|
1413
|
+
_instance.intentDisplayName = _instance.intentDisplayName || '';
|
|
1414
|
+
_instance.trainingPhraseUpdateList =
|
|
1415
|
+
_instance.trainingPhraseUpdateList || [];
|
|
1416
|
+
_instance.deletedParameters = _instance.deletedParameters || [];
|
|
1417
|
+
}
|
|
1418
|
+
/**
|
|
1419
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1420
|
+
* @param _instance message instance
|
|
1421
|
+
* @param _reader binary reader instance
|
|
1422
|
+
*/
|
|
1423
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1424
|
+
while (_reader.nextField()) {
|
|
1425
|
+
if (_reader.isEndGroup())
|
|
1426
|
+
break;
|
|
1427
|
+
switch (_reader.getFieldNumber()) {
|
|
1428
|
+
case 1:
|
|
1429
|
+
_instance.intentDisplayName = _reader.readString();
|
|
1430
|
+
break;
|
|
1431
|
+
case 2:
|
|
1432
|
+
const messageInitializer2 = new IntentUpdate.TrainingPhraseUpdate();
|
|
1433
|
+
_reader.readMessage(messageInitializer2, IntentUpdate.TrainingPhraseUpdate.deserializeBinaryFromReader);
|
|
1434
|
+
(_instance.trainingPhraseUpdateList =
|
|
1435
|
+
_instance.trainingPhraseUpdateList || []).push(messageInitializer2);
|
|
1436
|
+
break;
|
|
1437
|
+
case 3:
|
|
1438
|
+
(_instance.deletedParameters =
|
|
1439
|
+
_instance.deletedParameters || []).push(_reader.readString());
|
|
1440
|
+
break;
|
|
1441
|
+
default:
|
|
1442
|
+
_reader.skipField();
|
|
1443
|
+
}
|
|
1444
|
+
}
|
|
1445
|
+
IntentUpdate.refineValues(_instance);
|
|
1446
|
+
}
|
|
1447
|
+
/**
|
|
1448
|
+
* Serializes a message to binary format using provided binary reader
|
|
1449
|
+
* @param _instance message instance
|
|
1450
|
+
* @param _writer binary writer instance
|
|
1451
|
+
*/
|
|
1452
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
1453
|
+
if (_instance.intentDisplayName) {
|
|
1454
|
+
_writer.writeString(1, _instance.intentDisplayName);
|
|
1455
|
+
}
|
|
1456
|
+
if (_instance.trainingPhraseUpdateList &&
|
|
1457
|
+
_instance.trainingPhraseUpdateList.length) {
|
|
1458
|
+
_writer.writeRepeatedMessage(2, _instance.trainingPhraseUpdateList, IntentUpdate.TrainingPhraseUpdate.serializeBinaryToWriter);
|
|
1459
|
+
}
|
|
1460
|
+
if (_instance.deletedParameters && _instance.deletedParameters.length) {
|
|
1461
|
+
_writer.writeRepeatedString(3, _instance.deletedParameters);
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
get intentDisplayName() {
|
|
1465
|
+
return this._intentDisplayName;
|
|
1466
|
+
}
|
|
1467
|
+
set intentDisplayName(value) {
|
|
1468
|
+
this._intentDisplayName = value;
|
|
1469
|
+
}
|
|
1470
|
+
get trainingPhraseUpdateList() {
|
|
1471
|
+
return this._trainingPhraseUpdateList;
|
|
1472
|
+
}
|
|
1473
|
+
set trainingPhraseUpdateList(value) {
|
|
1474
|
+
this._trainingPhraseUpdateList = value;
|
|
1475
|
+
}
|
|
1476
|
+
get deletedParameters() {
|
|
1477
|
+
return this._deletedParameters;
|
|
1478
|
+
}
|
|
1479
|
+
set deletedParameters(value) {
|
|
1480
|
+
this._deletedParameters = value;
|
|
1481
|
+
}
|
|
1482
|
+
/**
|
|
1483
|
+
* Serialize message to binary data
|
|
1484
|
+
* @param instance message instance
|
|
1485
|
+
*/
|
|
1486
|
+
serializeBinary() {
|
|
1487
|
+
const writer = new BinaryWriter();
|
|
1488
|
+
IntentUpdate.serializeBinaryToWriter(this, writer);
|
|
1489
|
+
return writer.getResultBuffer();
|
|
1490
|
+
}
|
|
1491
|
+
/**
|
|
1492
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1493
|
+
*/
|
|
1494
|
+
toObject() {
|
|
1495
|
+
return {
|
|
1496
|
+
intentDisplayName: this.intentDisplayName,
|
|
1497
|
+
trainingPhraseUpdateList: (this.trainingPhraseUpdateList || []).map(m => m.toObject()),
|
|
1498
|
+
deletedParameters: (this.deletedParameters || []).slice()
|
|
1499
|
+
};
|
|
1500
|
+
}
|
|
1501
|
+
/**
|
|
1502
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1503
|
+
*/
|
|
1504
|
+
toJSON() {
|
|
1505
|
+
return this.toObject();
|
|
1506
|
+
}
|
|
1507
|
+
/**
|
|
1508
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1509
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1510
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
1511
|
+
*/
|
|
1512
|
+
toProtobufJSON(
|
|
1513
|
+
// @ts-ignore
|
|
1514
|
+
options) {
|
|
1515
|
+
return {
|
|
1516
|
+
intentDisplayName: this.intentDisplayName,
|
|
1517
|
+
trainingPhraseUpdateList: (this.trainingPhraseUpdateList || []).map(m => m.toProtobufJSON(options)),
|
|
1518
|
+
deletedParameters: (this.deletedParameters || []).slice()
|
|
1519
|
+
};
|
|
1520
|
+
}
|
|
1521
|
+
}
|
|
1522
|
+
IntentUpdate.id = 'ondewo.nlu.IntentUpdate';
|
|
1523
|
+
(function (IntentUpdate) {
|
|
1524
|
+
/**
|
|
1525
|
+
* Message implementation for ondewo.nlu.TrainingPhraseUpdate
|
|
1526
|
+
*/
|
|
1527
|
+
class TrainingPhraseUpdate {
|
|
1528
|
+
/**
|
|
1529
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1530
|
+
* @param _value initial values object or instance of TrainingPhraseUpdate to deeply clone from
|
|
1531
|
+
*/
|
|
1532
|
+
constructor(_value) {
|
|
1533
|
+
_value = _value || {};
|
|
1534
|
+
this.trainingPhraseUpdate = _value.trainingPhraseUpdate
|
|
1535
|
+
? new StringUpdate(_value.trainingPhraseUpdate)
|
|
1536
|
+
: undefined;
|
|
1537
|
+
this.entityUpdates = (_value.entityUpdates || []).map(m => new StringUpdate(m));
|
|
1538
|
+
this.entitiesReannotated = (_value.entitiesReannotated || []).slice();
|
|
1539
|
+
this.containsUpdateVariable = _value.containsUpdateVariable;
|
|
1540
|
+
TrainingPhraseUpdate.refineValues(this);
|
|
1541
|
+
}
|
|
1542
|
+
/**
|
|
1543
|
+
* Deserialize binary data to message
|
|
1544
|
+
* @param instance message instance
|
|
1545
|
+
*/
|
|
1546
|
+
static deserializeBinary(bytes) {
|
|
1547
|
+
const instance = new TrainingPhraseUpdate();
|
|
1548
|
+
TrainingPhraseUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1549
|
+
return instance;
|
|
1550
|
+
}
|
|
1551
|
+
/**
|
|
1552
|
+
* Check all the properties and set default protobuf values if necessary
|
|
1553
|
+
* @param _instance message instance
|
|
1554
|
+
*/
|
|
1555
|
+
static refineValues(_instance) {
|
|
1556
|
+
_instance.trainingPhraseUpdate =
|
|
1557
|
+
_instance.trainingPhraseUpdate || undefined;
|
|
1558
|
+
_instance.entityUpdates = _instance.entityUpdates || [];
|
|
1559
|
+
_instance.entitiesReannotated = _instance.entitiesReannotated || [];
|
|
1560
|
+
_instance.containsUpdateVariable =
|
|
1561
|
+
_instance.containsUpdateVariable || false;
|
|
1562
|
+
}
|
|
1563
|
+
/**
|
|
1564
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1565
|
+
* @param _instance message instance
|
|
1566
|
+
* @param _reader binary reader instance
|
|
1567
|
+
*/
|
|
1568
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1569
|
+
while (_reader.nextField()) {
|
|
1570
|
+
if (_reader.isEndGroup())
|
|
1571
|
+
break;
|
|
1572
|
+
switch (_reader.getFieldNumber()) {
|
|
1573
|
+
case 1:
|
|
1574
|
+
_instance.trainingPhraseUpdate = new StringUpdate();
|
|
1575
|
+
_reader.readMessage(_instance.trainingPhraseUpdate, StringUpdate.deserializeBinaryFromReader);
|
|
1576
|
+
break;
|
|
1577
|
+
case 2:
|
|
1578
|
+
const messageInitializer2 = new StringUpdate();
|
|
1579
|
+
_reader.readMessage(messageInitializer2, StringUpdate.deserializeBinaryFromReader);
|
|
1580
|
+
(_instance.entityUpdates = _instance.entityUpdates || []).push(messageInitializer2);
|
|
1581
|
+
break;
|
|
1582
|
+
case 3:
|
|
1583
|
+
(_instance.entitiesReannotated =
|
|
1584
|
+
_instance.entitiesReannotated || []).push(_reader.readString());
|
|
1585
|
+
break;
|
|
1586
|
+
case 4:
|
|
1587
|
+
_instance.containsUpdateVariable = _reader.readBool();
|
|
1588
|
+
break;
|
|
1589
|
+
default:
|
|
1590
|
+
_reader.skipField();
|
|
1591
|
+
}
|
|
1592
|
+
}
|
|
1593
|
+
TrainingPhraseUpdate.refineValues(_instance);
|
|
1594
|
+
}
|
|
1595
|
+
/**
|
|
1596
|
+
* Serializes a message to binary format using provided binary reader
|
|
1597
|
+
* @param _instance message instance
|
|
1598
|
+
* @param _writer binary writer instance
|
|
1599
|
+
*/
|
|
1600
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
1601
|
+
if (_instance.trainingPhraseUpdate) {
|
|
1602
|
+
_writer.writeMessage(1, _instance.trainingPhraseUpdate, StringUpdate.serializeBinaryToWriter);
|
|
1603
|
+
}
|
|
1604
|
+
if (_instance.entityUpdates && _instance.entityUpdates.length) {
|
|
1605
|
+
_writer.writeRepeatedMessage(2, _instance.entityUpdates, StringUpdate.serializeBinaryToWriter);
|
|
1606
|
+
}
|
|
1607
|
+
if (_instance.entitiesReannotated &&
|
|
1608
|
+
_instance.entitiesReannotated.length) {
|
|
1609
|
+
_writer.writeRepeatedString(3, _instance.entitiesReannotated);
|
|
1610
|
+
}
|
|
1611
|
+
if (_instance.containsUpdateVariable) {
|
|
1612
|
+
_writer.writeBool(4, _instance.containsUpdateVariable);
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
get trainingPhraseUpdate() {
|
|
1616
|
+
return this._trainingPhraseUpdate;
|
|
1617
|
+
}
|
|
1618
|
+
set trainingPhraseUpdate(value) {
|
|
1619
|
+
this._trainingPhraseUpdate = value;
|
|
1620
|
+
}
|
|
1621
|
+
get entityUpdates() {
|
|
1622
|
+
return this._entityUpdates;
|
|
1623
|
+
}
|
|
1624
|
+
set entityUpdates(value) {
|
|
1625
|
+
this._entityUpdates = value;
|
|
1626
|
+
}
|
|
1627
|
+
get entitiesReannotated() {
|
|
1628
|
+
return this._entitiesReannotated;
|
|
1629
|
+
}
|
|
1630
|
+
set entitiesReannotated(value) {
|
|
1631
|
+
this._entitiesReannotated = value;
|
|
1632
|
+
}
|
|
1633
|
+
get containsUpdateVariable() {
|
|
1634
|
+
return this._containsUpdateVariable;
|
|
1635
|
+
}
|
|
1636
|
+
set containsUpdateVariable(value) {
|
|
1637
|
+
this._containsUpdateVariable = value;
|
|
1638
|
+
}
|
|
1639
|
+
/**
|
|
1640
|
+
* Serialize message to binary data
|
|
1641
|
+
* @param instance message instance
|
|
1642
|
+
*/
|
|
1643
|
+
serializeBinary() {
|
|
1644
|
+
const writer = new BinaryWriter();
|
|
1645
|
+
TrainingPhraseUpdate.serializeBinaryToWriter(this, writer);
|
|
1646
|
+
return writer.getResultBuffer();
|
|
1647
|
+
}
|
|
1648
|
+
/**
|
|
1649
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1650
|
+
*/
|
|
1651
|
+
toObject() {
|
|
1652
|
+
return {
|
|
1653
|
+
trainingPhraseUpdate: this.trainingPhraseUpdate
|
|
1654
|
+
? this.trainingPhraseUpdate.toObject()
|
|
1655
|
+
: undefined,
|
|
1656
|
+
entityUpdates: (this.entityUpdates || []).map(m => m.toObject()),
|
|
1657
|
+
entitiesReannotated: (this.entitiesReannotated || []).slice(),
|
|
1658
|
+
containsUpdateVariable: this.containsUpdateVariable
|
|
1659
|
+
};
|
|
1660
|
+
}
|
|
1661
|
+
/**
|
|
1662
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1663
|
+
*/
|
|
1664
|
+
toJSON() {
|
|
1665
|
+
return this.toObject();
|
|
1666
|
+
}
|
|
1667
|
+
/**
|
|
1668
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1669
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1670
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
1671
|
+
*/
|
|
1672
|
+
toProtobufJSON(
|
|
1673
|
+
// @ts-ignore
|
|
1674
|
+
options) {
|
|
1675
|
+
return {
|
|
1676
|
+
trainingPhraseUpdate: this.trainingPhraseUpdate
|
|
1677
|
+
? this.trainingPhraseUpdate.toProtobufJSON(options)
|
|
1678
|
+
: null,
|
|
1679
|
+
entityUpdates: (this.entityUpdates || []).map(m => m.toProtobufJSON(options)),
|
|
1680
|
+
entitiesReannotated: (this.entitiesReannotated || []).slice(),
|
|
1681
|
+
containsUpdateVariable: this.containsUpdateVariable
|
|
1682
|
+
};
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
TrainingPhraseUpdate.id = 'ondewo.nlu.TrainingPhraseUpdate';
|
|
1686
|
+
IntentUpdate.TrainingPhraseUpdate = TrainingPhraseUpdate;
|
|
1687
|
+
})(IntentUpdate || (IntentUpdate = {}));
|
|
1688
|
+
/**
|
|
1689
|
+
* Message implementation for ondewo.nlu.EntityTypeUpdate
|
|
1690
|
+
*/
|
|
1691
|
+
export class EntityTypeUpdate {
|
|
1692
|
+
/**
|
|
1693
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1694
|
+
* @param _value initial values object or instance of EntityTypeUpdate to deeply clone from
|
|
1695
|
+
*/
|
|
1696
|
+
constructor(_value) {
|
|
1697
|
+
_value = _value || {};
|
|
1698
|
+
this.entityTypeName = _value.entityTypeName;
|
|
1699
|
+
this.valuesUpdateList = (_value.valuesUpdateList || []).map(m => new EntityTypeUpdate.EntityUpdate(m));
|
|
1700
|
+
EntityTypeUpdate.refineValues(this);
|
|
1701
|
+
}
|
|
1702
|
+
/**
|
|
1703
|
+
* Deserialize binary data to message
|
|
1704
|
+
* @param instance message instance
|
|
1705
|
+
*/
|
|
1706
|
+
static deserializeBinary(bytes) {
|
|
1707
|
+
const instance = new EntityTypeUpdate();
|
|
1708
|
+
EntityTypeUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1709
|
+
return instance;
|
|
1710
|
+
}
|
|
1711
|
+
/**
|
|
1712
|
+
* Check all the properties and set default protobuf values if necessary
|
|
1713
|
+
* @param _instance message instance
|
|
1714
|
+
*/
|
|
1715
|
+
static refineValues(_instance) {
|
|
1716
|
+
_instance.entityTypeName = _instance.entityTypeName || '';
|
|
1717
|
+
_instance.valuesUpdateList = _instance.valuesUpdateList || [];
|
|
1718
|
+
}
|
|
1719
|
+
/**
|
|
1720
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1721
|
+
* @param _instance message instance
|
|
1722
|
+
* @param _reader binary reader instance
|
|
1723
|
+
*/
|
|
1724
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1725
|
+
while (_reader.nextField()) {
|
|
1726
|
+
if (_reader.isEndGroup())
|
|
1727
|
+
break;
|
|
1728
|
+
switch (_reader.getFieldNumber()) {
|
|
1729
|
+
case 1:
|
|
1730
|
+
_instance.entityTypeName = _reader.readString();
|
|
1731
|
+
break;
|
|
1732
|
+
case 2:
|
|
1733
|
+
const messageInitializer2 = new EntityTypeUpdate.EntityUpdate();
|
|
1734
|
+
_reader.readMessage(messageInitializer2, EntityTypeUpdate.EntityUpdate.deserializeBinaryFromReader);
|
|
1735
|
+
(_instance.valuesUpdateList = _instance.valuesUpdateList || []).push(messageInitializer2);
|
|
1736
|
+
break;
|
|
1737
|
+
default:
|
|
1738
|
+
_reader.skipField();
|
|
1739
|
+
}
|
|
1740
|
+
}
|
|
1741
|
+
EntityTypeUpdate.refineValues(_instance);
|
|
1742
|
+
}
|
|
1743
|
+
/**
|
|
1744
|
+
* Serializes a message to binary format using provided binary reader
|
|
1745
|
+
* @param _instance message instance
|
|
1746
|
+
* @param _writer binary writer instance
|
|
1747
|
+
*/
|
|
1748
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
1749
|
+
if (_instance.entityTypeName) {
|
|
1750
|
+
_writer.writeString(1, _instance.entityTypeName);
|
|
1751
|
+
}
|
|
1752
|
+
if (_instance.valuesUpdateList && _instance.valuesUpdateList.length) {
|
|
1753
|
+
_writer.writeRepeatedMessage(2, _instance.valuesUpdateList, EntityTypeUpdate.EntityUpdate.serializeBinaryToWriter);
|
|
1754
|
+
}
|
|
1755
|
+
}
|
|
1756
|
+
get entityTypeName() {
|
|
1757
|
+
return this._entityTypeName;
|
|
1758
|
+
}
|
|
1759
|
+
set entityTypeName(value) {
|
|
1760
|
+
this._entityTypeName = value;
|
|
1761
|
+
}
|
|
1762
|
+
get valuesUpdateList() {
|
|
1763
|
+
return this._valuesUpdateList;
|
|
1764
|
+
}
|
|
1765
|
+
set valuesUpdateList(value) {
|
|
1766
|
+
this._valuesUpdateList = value;
|
|
1767
|
+
}
|
|
1768
|
+
/**
|
|
1769
|
+
* Serialize message to binary data
|
|
1770
|
+
* @param instance message instance
|
|
1771
|
+
*/
|
|
1772
|
+
serializeBinary() {
|
|
1773
|
+
const writer = new BinaryWriter();
|
|
1774
|
+
EntityTypeUpdate.serializeBinaryToWriter(this, writer);
|
|
1775
|
+
return writer.getResultBuffer();
|
|
1776
|
+
}
|
|
1777
|
+
/**
|
|
1778
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1779
|
+
*/
|
|
1780
|
+
toObject() {
|
|
1781
|
+
return {
|
|
1782
|
+
entityTypeName: this.entityTypeName,
|
|
1783
|
+
valuesUpdateList: (this.valuesUpdateList || []).map(m => m.toObject())
|
|
1784
|
+
};
|
|
1785
|
+
}
|
|
1786
|
+
/**
|
|
1787
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1788
|
+
*/
|
|
1789
|
+
toJSON() {
|
|
1790
|
+
return this.toObject();
|
|
1791
|
+
}
|
|
1792
|
+
/**
|
|
1793
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1794
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1795
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
1796
|
+
*/
|
|
1797
|
+
toProtobufJSON(
|
|
1798
|
+
// @ts-ignore
|
|
1799
|
+
options) {
|
|
1800
|
+
return {
|
|
1801
|
+
entityTypeName: this.entityTypeName,
|
|
1802
|
+
valuesUpdateList: (this.valuesUpdateList || []).map(m => m.toProtobufJSON(options))
|
|
1803
|
+
};
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1806
|
+
EntityTypeUpdate.id = 'ondewo.nlu.EntityTypeUpdate';
|
|
1807
|
+
(function (EntityTypeUpdate) {
|
|
1808
|
+
/**
|
|
1809
|
+
* Message implementation for ondewo.nlu.EntityUpdate
|
|
1810
|
+
*/
|
|
1811
|
+
class EntityUpdate {
|
|
1812
|
+
/**
|
|
1813
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1814
|
+
* @param _value initial values object or instance of EntityUpdate to deeply clone from
|
|
1815
|
+
*/
|
|
1816
|
+
constructor(_value) {
|
|
1817
|
+
_value = _value || {};
|
|
1818
|
+
this.entityValueUpdate = _value.entityValueUpdate
|
|
1819
|
+
? new StringUpdate(_value.entityValueUpdate)
|
|
1820
|
+
: undefined;
|
|
1821
|
+
this.entitySynonymUpdates = (_value.entitySynonymUpdates || []).map(m => new StringUpdate(m));
|
|
1822
|
+
EntityUpdate.refineValues(this);
|
|
1823
|
+
}
|
|
1824
|
+
/**
|
|
1825
|
+
* Deserialize binary data to message
|
|
1826
|
+
* @param instance message instance
|
|
1827
|
+
*/
|
|
1828
|
+
static deserializeBinary(bytes) {
|
|
1829
|
+
const instance = new EntityUpdate();
|
|
1830
|
+
EntityUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1831
|
+
return instance;
|
|
1832
|
+
}
|
|
1833
|
+
/**
|
|
1834
|
+
* Check all the properties and set default protobuf values if necessary
|
|
1835
|
+
* @param _instance message instance
|
|
1836
|
+
*/
|
|
1837
|
+
static refineValues(_instance) {
|
|
1838
|
+
_instance.entityValueUpdate = _instance.entityValueUpdate || undefined;
|
|
1839
|
+
_instance.entitySynonymUpdates = _instance.entitySynonymUpdates || [];
|
|
1840
|
+
}
|
|
1841
|
+
/**
|
|
1842
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1843
|
+
* @param _instance message instance
|
|
1844
|
+
* @param _reader binary reader instance
|
|
1845
|
+
*/
|
|
1846
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1847
|
+
while (_reader.nextField()) {
|
|
1848
|
+
if (_reader.isEndGroup())
|
|
1849
|
+
break;
|
|
1850
|
+
switch (_reader.getFieldNumber()) {
|
|
1851
|
+
case 1:
|
|
1852
|
+
_instance.entityValueUpdate = new StringUpdate();
|
|
1853
|
+
_reader.readMessage(_instance.entityValueUpdate, StringUpdate.deserializeBinaryFromReader);
|
|
1854
|
+
break;
|
|
1855
|
+
case 2:
|
|
1856
|
+
const messageInitializer2 = new StringUpdate();
|
|
1857
|
+
_reader.readMessage(messageInitializer2, StringUpdate.deserializeBinaryFromReader);
|
|
1858
|
+
(_instance.entitySynonymUpdates =
|
|
1859
|
+
_instance.entitySynonymUpdates || []).push(messageInitializer2);
|
|
1860
|
+
break;
|
|
1861
|
+
default:
|
|
1862
|
+
_reader.skipField();
|
|
1863
|
+
}
|
|
1864
|
+
}
|
|
1865
|
+
EntityUpdate.refineValues(_instance);
|
|
1866
|
+
}
|
|
1867
|
+
/**
|
|
1868
|
+
* Serializes a message to binary format using provided binary reader
|
|
1869
|
+
* @param _instance message instance
|
|
1870
|
+
* @param _writer binary writer instance
|
|
1871
|
+
*/
|
|
1872
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
1873
|
+
if (_instance.entityValueUpdate) {
|
|
1874
|
+
_writer.writeMessage(1, _instance.entityValueUpdate, StringUpdate.serializeBinaryToWriter);
|
|
1875
|
+
}
|
|
1876
|
+
if (_instance.entitySynonymUpdates &&
|
|
1877
|
+
_instance.entitySynonymUpdates.length) {
|
|
1878
|
+
_writer.writeRepeatedMessage(2, _instance.entitySynonymUpdates, StringUpdate.serializeBinaryToWriter);
|
|
1879
|
+
}
|
|
1880
|
+
}
|
|
1881
|
+
get entityValueUpdate() {
|
|
1882
|
+
return this._entityValueUpdate;
|
|
1883
|
+
}
|
|
1884
|
+
set entityValueUpdate(value) {
|
|
1885
|
+
this._entityValueUpdate = value;
|
|
1886
|
+
}
|
|
1887
|
+
get entitySynonymUpdates() {
|
|
1888
|
+
return this._entitySynonymUpdates;
|
|
1889
|
+
}
|
|
1890
|
+
set entitySynonymUpdates(value) {
|
|
1891
|
+
this._entitySynonymUpdates = value;
|
|
1892
|
+
}
|
|
1893
|
+
/**
|
|
1894
|
+
* Serialize message to binary data
|
|
1895
|
+
* @param instance message instance
|
|
1896
|
+
*/
|
|
1897
|
+
serializeBinary() {
|
|
1898
|
+
const writer = new BinaryWriter();
|
|
1899
|
+
EntityUpdate.serializeBinaryToWriter(this, writer);
|
|
1900
|
+
return writer.getResultBuffer();
|
|
1901
|
+
}
|
|
1902
|
+
/**
|
|
1903
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1904
|
+
*/
|
|
1905
|
+
toObject() {
|
|
1906
|
+
return {
|
|
1907
|
+
entityValueUpdate: this.entityValueUpdate
|
|
1908
|
+
? this.entityValueUpdate.toObject()
|
|
1909
|
+
: undefined,
|
|
1910
|
+
entitySynonymUpdates: (this.entitySynonymUpdates || []).map(m => m.toObject())
|
|
1911
|
+
};
|
|
1912
|
+
}
|
|
1913
|
+
/**
|
|
1914
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1915
|
+
*/
|
|
1916
|
+
toJSON() {
|
|
1917
|
+
return this.toObject();
|
|
1918
|
+
}
|
|
1919
|
+
/**
|
|
1920
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1921
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1922
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
1923
|
+
*/
|
|
1924
|
+
toProtobufJSON(
|
|
1925
|
+
// @ts-ignore
|
|
1926
|
+
options) {
|
|
1927
|
+
return {
|
|
1928
|
+
entityValueUpdate: this.entityValueUpdate
|
|
1929
|
+
? this.entityValueUpdate.toProtobufJSON(options)
|
|
1930
|
+
: null,
|
|
1931
|
+
entitySynonymUpdates: (this.entitySynonymUpdates || []).map(m => m.toProtobufJSON(options))
|
|
1932
|
+
};
|
|
1933
|
+
}
|
|
1934
|
+
}
|
|
1935
|
+
EntityUpdate.id = 'ondewo.nlu.EntityUpdate';
|
|
1936
|
+
EntityTypeUpdate.EntityUpdate = EntityUpdate;
|
|
1937
|
+
})(EntityTypeUpdate || (EntityTypeUpdate = {}));
|
|
1938
|
+
/**
|
|
1939
|
+
* Message implementation for ondewo.nlu.CleanAllEntityTypesRequest
|
|
1940
|
+
*/
|
|
1941
|
+
export class CleanAllEntityTypesRequest {
|
|
1942
|
+
/**
|
|
1943
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1944
|
+
* @param _value initial values object or instance of CleanAllEntityTypesRequest to deeply clone from
|
|
1945
|
+
*/
|
|
1946
|
+
constructor(_value) {
|
|
1947
|
+
_value = _value || {};
|
|
1948
|
+
this.parent = _value.parent;
|
|
1949
|
+
this.languageCode = _value.languageCode;
|
|
1950
|
+
this.specialCharacters = _value.specialCharacters;
|
|
1951
|
+
this.substringWhiteList = (_value.substringWhiteList || []).slice();
|
|
1952
|
+
this.maxEntityCountUpdate = _value.maxEntityCountUpdate;
|
|
1953
|
+
this.forbiddenEntityTypePatterns = (_value.forbiddenEntityTypePatterns || []).slice();
|
|
1954
|
+
this.dryRun = _value.dryRun;
|
|
1955
|
+
this.numberOfWorkers = _value.numberOfWorkers;
|
|
1956
|
+
CleanAllEntityTypesRequest.refineValues(this);
|
|
1957
|
+
}
|
|
1958
|
+
/**
|
|
1959
|
+
* Deserialize binary data to message
|
|
1960
|
+
* @param instance message instance
|
|
1961
|
+
*/
|
|
1962
|
+
static deserializeBinary(bytes) {
|
|
1963
|
+
const instance = new CleanAllEntityTypesRequest();
|
|
1964
|
+
CleanAllEntityTypesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1965
|
+
return instance;
|
|
1966
|
+
}
|
|
1967
|
+
/**
|
|
1968
|
+
* Check all the properties and set default protobuf values if necessary
|
|
1969
|
+
* @param _instance message instance
|
|
1970
|
+
*/
|
|
1971
|
+
static refineValues(_instance) {
|
|
1972
|
+
_instance.parent = _instance.parent || '';
|
|
1973
|
+
_instance.languageCode = _instance.languageCode || '';
|
|
1974
|
+
_instance.specialCharacters = _instance.specialCharacters || '';
|
|
1975
|
+
_instance.substringWhiteList = _instance.substringWhiteList || [];
|
|
1976
|
+
_instance.maxEntityCountUpdate = _instance.maxEntityCountUpdate || 0;
|
|
1977
|
+
_instance.forbiddenEntityTypePatterns =
|
|
1978
|
+
_instance.forbiddenEntityTypePatterns || [];
|
|
1979
|
+
_instance.dryRun = _instance.dryRun || false;
|
|
1980
|
+
_instance.numberOfWorkers = _instance.numberOfWorkers || 0;
|
|
1981
|
+
}
|
|
1982
|
+
/**
|
|
1983
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1984
|
+
* @param _instance message instance
|
|
1985
|
+
* @param _reader binary reader instance
|
|
1986
|
+
*/
|
|
1987
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1988
|
+
while (_reader.nextField()) {
|
|
1989
|
+
if (_reader.isEndGroup())
|
|
1990
|
+
break;
|
|
1991
|
+
switch (_reader.getFieldNumber()) {
|
|
1992
|
+
case 1:
|
|
1993
|
+
_instance.parent = _reader.readString();
|
|
1994
|
+
break;
|
|
1995
|
+
case 2:
|
|
1996
|
+
_instance.languageCode = _reader.readString();
|
|
1997
|
+
break;
|
|
1998
|
+
case 3:
|
|
1999
|
+
_instance.specialCharacters = _reader.readString();
|
|
2000
|
+
break;
|
|
2001
|
+
case 4:
|
|
2002
|
+
(_instance.substringWhiteList =
|
|
2003
|
+
_instance.substringWhiteList || []).push(_reader.readString());
|
|
2004
|
+
break;
|
|
2005
|
+
case 5:
|
|
2006
|
+
_instance.maxEntityCountUpdate = _reader.readInt32();
|
|
2007
|
+
break;
|
|
2008
|
+
case 6:
|
|
2009
|
+
(_instance.forbiddenEntityTypePatterns =
|
|
2010
|
+
_instance.forbiddenEntityTypePatterns || []).push(_reader.readString());
|
|
2011
|
+
break;
|
|
2012
|
+
case 7:
|
|
2013
|
+
_instance.dryRun = _reader.readBool();
|
|
2014
|
+
break;
|
|
2015
|
+
case 8:
|
|
2016
|
+
_instance.numberOfWorkers = _reader.readInt32();
|
|
2017
|
+
break;
|
|
2018
|
+
default:
|
|
2019
|
+
_reader.skipField();
|
|
2020
|
+
}
|
|
2021
|
+
}
|
|
2022
|
+
CleanAllEntityTypesRequest.refineValues(_instance);
|
|
2023
|
+
}
|
|
2024
|
+
/**
|
|
2025
|
+
* Serializes a message to binary format using provided binary reader
|
|
2026
|
+
* @param _instance message instance
|
|
2027
|
+
* @param _writer binary writer instance
|
|
2028
|
+
*/
|
|
2029
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
2030
|
+
if (_instance.parent) {
|
|
2031
|
+
_writer.writeString(1, _instance.parent);
|
|
2032
|
+
}
|
|
2033
|
+
if (_instance.languageCode) {
|
|
2034
|
+
_writer.writeString(2, _instance.languageCode);
|
|
2035
|
+
}
|
|
2036
|
+
if (_instance.specialCharacters) {
|
|
2037
|
+
_writer.writeString(3, _instance.specialCharacters);
|
|
2038
|
+
}
|
|
2039
|
+
if (_instance.substringWhiteList && _instance.substringWhiteList.length) {
|
|
2040
|
+
_writer.writeRepeatedString(4, _instance.substringWhiteList);
|
|
2041
|
+
}
|
|
2042
|
+
if (_instance.maxEntityCountUpdate) {
|
|
2043
|
+
_writer.writeInt32(5, _instance.maxEntityCountUpdate);
|
|
2044
|
+
}
|
|
2045
|
+
if (_instance.forbiddenEntityTypePatterns &&
|
|
2046
|
+
_instance.forbiddenEntityTypePatterns.length) {
|
|
2047
|
+
_writer.writeRepeatedString(6, _instance.forbiddenEntityTypePatterns);
|
|
2048
|
+
}
|
|
2049
|
+
if (_instance.dryRun) {
|
|
2050
|
+
_writer.writeBool(7, _instance.dryRun);
|
|
2051
|
+
}
|
|
2052
|
+
if (_instance.numberOfWorkers) {
|
|
2053
|
+
_writer.writeInt32(8, _instance.numberOfWorkers);
|
|
2054
|
+
}
|
|
2055
|
+
}
|
|
2056
|
+
get parent() {
|
|
2057
|
+
return this._parent;
|
|
2058
|
+
}
|
|
2059
|
+
set parent(value) {
|
|
2060
|
+
this._parent = value;
|
|
2061
|
+
}
|
|
2062
|
+
get languageCode() {
|
|
2063
|
+
return this._languageCode;
|
|
2064
|
+
}
|
|
2065
|
+
set languageCode(value) {
|
|
2066
|
+
this._languageCode = value;
|
|
2067
|
+
}
|
|
2068
|
+
get specialCharacters() {
|
|
2069
|
+
return this._specialCharacters;
|
|
2070
|
+
}
|
|
2071
|
+
set specialCharacters(value) {
|
|
2072
|
+
this._specialCharacters = value;
|
|
2073
|
+
}
|
|
2074
|
+
get substringWhiteList() {
|
|
2075
|
+
return this._substringWhiteList;
|
|
2076
|
+
}
|
|
2077
|
+
set substringWhiteList(value) {
|
|
2078
|
+
this._substringWhiteList = value;
|
|
2079
|
+
}
|
|
2080
|
+
get maxEntityCountUpdate() {
|
|
2081
|
+
return this._maxEntityCountUpdate;
|
|
2082
|
+
}
|
|
2083
|
+
set maxEntityCountUpdate(value) {
|
|
2084
|
+
this._maxEntityCountUpdate = value;
|
|
2085
|
+
}
|
|
2086
|
+
get forbiddenEntityTypePatterns() {
|
|
2087
|
+
return this._forbiddenEntityTypePatterns;
|
|
2088
|
+
}
|
|
2089
|
+
set forbiddenEntityTypePatterns(value) {
|
|
2090
|
+
this._forbiddenEntityTypePatterns = value;
|
|
2091
|
+
}
|
|
2092
|
+
get dryRun() {
|
|
2093
|
+
return this._dryRun;
|
|
2094
|
+
}
|
|
2095
|
+
set dryRun(value) {
|
|
2096
|
+
this._dryRun = value;
|
|
2097
|
+
}
|
|
2098
|
+
get numberOfWorkers() {
|
|
2099
|
+
return this._numberOfWorkers;
|
|
2100
|
+
}
|
|
2101
|
+
set numberOfWorkers(value) {
|
|
2102
|
+
this._numberOfWorkers = value;
|
|
2103
|
+
}
|
|
2104
|
+
/**
|
|
2105
|
+
* Serialize message to binary data
|
|
2106
|
+
* @param instance message instance
|
|
2107
|
+
*/
|
|
2108
|
+
serializeBinary() {
|
|
2109
|
+
const writer = new BinaryWriter();
|
|
2110
|
+
CleanAllEntityTypesRequest.serializeBinaryToWriter(this, writer);
|
|
2111
|
+
return writer.getResultBuffer();
|
|
2112
|
+
}
|
|
2113
|
+
/**
|
|
2114
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2115
|
+
*/
|
|
2116
|
+
toObject() {
|
|
2117
|
+
return {
|
|
2118
|
+
parent: this.parent,
|
|
2119
|
+
languageCode: this.languageCode,
|
|
2120
|
+
specialCharacters: this.specialCharacters,
|
|
2121
|
+
substringWhiteList: (this.substringWhiteList || []).slice(),
|
|
2122
|
+
maxEntityCountUpdate: this.maxEntityCountUpdate,
|
|
2123
|
+
forbiddenEntityTypePatterns: (this.forbiddenEntityTypePatterns || []).slice(),
|
|
2124
|
+
dryRun: this.dryRun,
|
|
2125
|
+
numberOfWorkers: this.numberOfWorkers
|
|
2126
|
+
};
|
|
2127
|
+
}
|
|
2128
|
+
/**
|
|
2129
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2130
|
+
*/
|
|
2131
|
+
toJSON() {
|
|
2132
|
+
return this.toObject();
|
|
2133
|
+
}
|
|
2134
|
+
/**
|
|
2135
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2136
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2137
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
2138
|
+
*/
|
|
2139
|
+
toProtobufJSON(
|
|
2140
|
+
// @ts-ignore
|
|
2141
|
+
options) {
|
|
2142
|
+
return {
|
|
2143
|
+
parent: this.parent,
|
|
2144
|
+
languageCode: this.languageCode,
|
|
2145
|
+
specialCharacters: this.specialCharacters,
|
|
2146
|
+
substringWhiteList: (this.substringWhiteList || []).slice(),
|
|
2147
|
+
maxEntityCountUpdate: this.maxEntityCountUpdate,
|
|
2148
|
+
forbiddenEntityTypePatterns: (this.forbiddenEntityTypePatterns || []).slice(),
|
|
2149
|
+
dryRun: this.dryRun,
|
|
2150
|
+
numberOfWorkers: this.numberOfWorkers
|
|
2151
|
+
};
|
|
2152
|
+
}
|
|
2153
|
+
}
|
|
2154
|
+
CleanAllEntityTypesRequest.id = 'ondewo.nlu.CleanAllEntityTypesRequest';
|
|
2155
|
+
/**
|
|
2156
|
+
* Message implementation for ondewo.nlu.CleanAllEntityTypesResponse
|
|
2157
|
+
*/
|
|
2158
|
+
export class CleanAllEntityTypesResponse {
|
|
2159
|
+
/**
|
|
2160
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2161
|
+
* @param _value initial values object or instance of CleanAllEntityTypesResponse to deeply clone from
|
|
2162
|
+
*/
|
|
2163
|
+
constructor(_value) {
|
|
2164
|
+
_value = _value || {};
|
|
2165
|
+
this.cleanedEntityTypes = (_value.cleanedEntityTypes || []).map(m => new ondewoNlu009.EntityType(m));
|
|
2166
|
+
this.deletedEntityTypes = (_value.deletedEntityTypes || []).map(m => new ondewoNlu009.EntityType(m));
|
|
2167
|
+
this.entityTypeUpdates = (_value.entityTypeUpdates || []).map(m => new EntityTypeUpdate(m));
|
|
2168
|
+
this.entityTypeDeletions = (_value.entityTypeDeletions || []).map(m => new EntityTypeUpdate(m));
|
|
2169
|
+
CleanAllEntityTypesResponse.refineValues(this);
|
|
2170
|
+
}
|
|
2171
|
+
/**
|
|
2172
|
+
* Deserialize binary data to message
|
|
2173
|
+
* @param instance message instance
|
|
2174
|
+
*/
|
|
2175
|
+
static deserializeBinary(bytes) {
|
|
2176
|
+
const instance = new CleanAllEntityTypesResponse();
|
|
2177
|
+
CleanAllEntityTypesResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2178
|
+
return instance;
|
|
2179
|
+
}
|
|
2180
|
+
/**
|
|
2181
|
+
* Check all the properties and set default protobuf values if necessary
|
|
2182
|
+
* @param _instance message instance
|
|
2183
|
+
*/
|
|
2184
|
+
static refineValues(_instance) {
|
|
2185
|
+
_instance.cleanedEntityTypes = _instance.cleanedEntityTypes || [];
|
|
2186
|
+
_instance.deletedEntityTypes = _instance.deletedEntityTypes || [];
|
|
2187
|
+
_instance.entityTypeUpdates = _instance.entityTypeUpdates || [];
|
|
2188
|
+
_instance.entityTypeDeletions = _instance.entityTypeDeletions || [];
|
|
2189
|
+
}
|
|
2190
|
+
/**
|
|
2191
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2192
|
+
* @param _instance message instance
|
|
2193
|
+
* @param _reader binary reader instance
|
|
2194
|
+
*/
|
|
2195
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2196
|
+
while (_reader.nextField()) {
|
|
2197
|
+
if (_reader.isEndGroup())
|
|
2198
|
+
break;
|
|
2199
|
+
switch (_reader.getFieldNumber()) {
|
|
2200
|
+
case 1:
|
|
2201
|
+
const messageInitializer1 = new ondewoNlu009.EntityType();
|
|
2202
|
+
_reader.readMessage(messageInitializer1, ondewoNlu009.EntityType.deserializeBinaryFromReader);
|
|
2203
|
+
(_instance.cleanedEntityTypes =
|
|
2204
|
+
_instance.cleanedEntityTypes || []).push(messageInitializer1);
|
|
2205
|
+
break;
|
|
2206
|
+
case 2:
|
|
2207
|
+
const messageInitializer2 = new ondewoNlu009.EntityType();
|
|
2208
|
+
_reader.readMessage(messageInitializer2, ondewoNlu009.EntityType.deserializeBinaryFromReader);
|
|
2209
|
+
(_instance.deletedEntityTypes =
|
|
2210
|
+
_instance.deletedEntityTypes || []).push(messageInitializer2);
|
|
2211
|
+
break;
|
|
2212
|
+
case 3:
|
|
2213
|
+
const messageInitializer3 = new EntityTypeUpdate();
|
|
2214
|
+
_reader.readMessage(messageInitializer3, EntityTypeUpdate.deserializeBinaryFromReader);
|
|
2215
|
+
(_instance.entityTypeUpdates =
|
|
2216
|
+
_instance.entityTypeUpdates || []).push(messageInitializer3);
|
|
2217
|
+
break;
|
|
2218
|
+
case 4:
|
|
2219
|
+
const messageInitializer4 = new EntityTypeUpdate();
|
|
2220
|
+
_reader.readMessage(messageInitializer4, EntityTypeUpdate.deserializeBinaryFromReader);
|
|
2221
|
+
(_instance.entityTypeDeletions =
|
|
2222
|
+
_instance.entityTypeDeletions || []).push(messageInitializer4);
|
|
2223
|
+
break;
|
|
2224
|
+
default:
|
|
2225
|
+
_reader.skipField();
|
|
2226
|
+
}
|
|
2227
|
+
}
|
|
2228
|
+
CleanAllEntityTypesResponse.refineValues(_instance);
|
|
2229
|
+
}
|
|
2230
|
+
/**
|
|
2231
|
+
* Serializes a message to binary format using provided binary reader
|
|
2232
|
+
* @param _instance message instance
|
|
2233
|
+
* @param _writer binary writer instance
|
|
2234
|
+
*/
|
|
2235
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
2236
|
+
if (_instance.cleanedEntityTypes && _instance.cleanedEntityTypes.length) {
|
|
2237
|
+
_writer.writeRepeatedMessage(1, _instance.cleanedEntityTypes, ondewoNlu009.EntityType.serializeBinaryToWriter);
|
|
2238
|
+
}
|
|
2239
|
+
if (_instance.deletedEntityTypes && _instance.deletedEntityTypes.length) {
|
|
2240
|
+
_writer.writeRepeatedMessage(2, _instance.deletedEntityTypes, ondewoNlu009.EntityType.serializeBinaryToWriter);
|
|
2241
|
+
}
|
|
2242
|
+
if (_instance.entityTypeUpdates && _instance.entityTypeUpdates.length) {
|
|
2243
|
+
_writer.writeRepeatedMessage(3, _instance.entityTypeUpdates, EntityTypeUpdate.serializeBinaryToWriter);
|
|
2244
|
+
}
|
|
2245
|
+
if (_instance.entityTypeDeletions && _instance.entityTypeDeletions.length) {
|
|
2246
|
+
_writer.writeRepeatedMessage(4, _instance.entityTypeDeletions, EntityTypeUpdate.serializeBinaryToWriter);
|
|
2247
|
+
}
|
|
2248
|
+
}
|
|
2249
|
+
get cleanedEntityTypes() {
|
|
2250
|
+
return this._cleanedEntityTypes;
|
|
2251
|
+
}
|
|
2252
|
+
set cleanedEntityTypes(value) {
|
|
2253
|
+
this._cleanedEntityTypes = value;
|
|
2254
|
+
}
|
|
2255
|
+
get deletedEntityTypes() {
|
|
2256
|
+
return this._deletedEntityTypes;
|
|
2257
|
+
}
|
|
2258
|
+
set deletedEntityTypes(value) {
|
|
2259
|
+
this._deletedEntityTypes = value;
|
|
2260
|
+
}
|
|
2261
|
+
get entityTypeUpdates() {
|
|
2262
|
+
return this._entityTypeUpdates;
|
|
2263
|
+
}
|
|
2264
|
+
set entityTypeUpdates(value) {
|
|
2265
|
+
this._entityTypeUpdates = value;
|
|
2266
|
+
}
|
|
2267
|
+
get entityTypeDeletions() {
|
|
2268
|
+
return this._entityTypeDeletions;
|
|
2269
|
+
}
|
|
2270
|
+
set entityTypeDeletions(value) {
|
|
2271
|
+
this._entityTypeDeletions = value;
|
|
2272
|
+
}
|
|
2273
|
+
/**
|
|
2274
|
+
* Serialize message to binary data
|
|
2275
|
+
* @param instance message instance
|
|
2276
|
+
*/
|
|
2277
|
+
serializeBinary() {
|
|
2278
|
+
const writer = new BinaryWriter();
|
|
2279
|
+
CleanAllEntityTypesResponse.serializeBinaryToWriter(this, writer);
|
|
2280
|
+
return writer.getResultBuffer();
|
|
2281
|
+
}
|
|
2282
|
+
/**
|
|
2283
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2284
|
+
*/
|
|
2285
|
+
toObject() {
|
|
2286
|
+
return {
|
|
2287
|
+
cleanedEntityTypes: (this.cleanedEntityTypes || []).map(m => m.toObject()),
|
|
2288
|
+
deletedEntityTypes: (this.deletedEntityTypes || []).map(m => m.toObject()),
|
|
2289
|
+
entityTypeUpdates: (this.entityTypeUpdates || []).map(m => m.toObject()),
|
|
2290
|
+
entityTypeDeletions: (this.entityTypeDeletions || []).map(m => m.toObject())
|
|
2291
|
+
};
|
|
2292
|
+
}
|
|
2293
|
+
/**
|
|
2294
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2295
|
+
*/
|
|
2296
|
+
toJSON() {
|
|
2297
|
+
return this.toObject();
|
|
2298
|
+
}
|
|
2299
|
+
/**
|
|
2300
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2301
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2302
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
2303
|
+
*/
|
|
2304
|
+
toProtobufJSON(
|
|
2305
|
+
// @ts-ignore
|
|
2306
|
+
options) {
|
|
2307
|
+
return {
|
|
2308
|
+
cleanedEntityTypes: (this.cleanedEntityTypes || []).map(m => m.toProtobufJSON(options)),
|
|
2309
|
+
deletedEntityTypes: (this.deletedEntityTypes || []).map(m => m.toProtobufJSON(options)),
|
|
2310
|
+
entityTypeUpdates: (this.entityTypeUpdates || []).map(m => m.toProtobufJSON(options)),
|
|
2311
|
+
entityTypeDeletions: (this.entityTypeDeletions || []).map(m => m.toProtobufJSON(options))
|
|
2312
|
+
};
|
|
2313
|
+
}
|
|
2314
|
+
}
|
|
2315
|
+
CleanAllEntityTypesResponse.id = 'ondewo.nlu.CleanAllEntityTypesResponse';
|
|
2316
|
+
/**
|
|
2317
|
+
* Message implementation for ondewo.nlu.CleanEntityTypeRequest
|
|
2318
|
+
*/
|
|
2319
|
+
export class CleanEntityTypeRequest {
|
|
2320
|
+
/**
|
|
2321
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2322
|
+
* @param _value initial values object or instance of CleanEntityTypeRequest to deeply clone from
|
|
2323
|
+
*/
|
|
2324
|
+
constructor(_value) {
|
|
2325
|
+
_value = _value || {};
|
|
2326
|
+
this.parent = _value.parent;
|
|
2327
|
+
this.entityTypeName = _value.entityTypeName;
|
|
2328
|
+
this.languageCode = _value.languageCode;
|
|
2329
|
+
this.specialCharacters = _value.specialCharacters;
|
|
2330
|
+
this.substringWhiteList = (_value.substringWhiteList || []).slice();
|
|
2331
|
+
this.maxEntityCountUpdate = _value.maxEntityCountUpdate;
|
|
2332
|
+
this.dryRun = _value.dryRun;
|
|
2333
|
+
CleanEntityTypeRequest.refineValues(this);
|
|
2334
|
+
}
|
|
2335
|
+
/**
|
|
2336
|
+
* Deserialize binary data to message
|
|
2337
|
+
* @param instance message instance
|
|
2338
|
+
*/
|
|
2339
|
+
static deserializeBinary(bytes) {
|
|
2340
|
+
const instance = new CleanEntityTypeRequest();
|
|
2341
|
+
CleanEntityTypeRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2342
|
+
return instance;
|
|
2343
|
+
}
|
|
2344
|
+
/**
|
|
2345
|
+
* Check all the properties and set default protobuf values if necessary
|
|
2346
|
+
* @param _instance message instance
|
|
2347
|
+
*/
|
|
2348
|
+
static refineValues(_instance) {
|
|
2349
|
+
_instance.parent = _instance.parent || '';
|
|
2350
|
+
_instance.entityTypeName = _instance.entityTypeName || '';
|
|
2351
|
+
_instance.languageCode = _instance.languageCode || '';
|
|
2352
|
+
_instance.specialCharacters = _instance.specialCharacters || '';
|
|
2353
|
+
_instance.substringWhiteList = _instance.substringWhiteList || [];
|
|
2354
|
+
_instance.maxEntityCountUpdate = _instance.maxEntityCountUpdate || 0;
|
|
2355
|
+
_instance.dryRun = _instance.dryRun || false;
|
|
2356
|
+
}
|
|
2357
|
+
/**
|
|
2358
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2359
|
+
* @param _instance message instance
|
|
2360
|
+
* @param _reader binary reader instance
|
|
2361
|
+
*/
|
|
2362
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2363
|
+
while (_reader.nextField()) {
|
|
2364
|
+
if (_reader.isEndGroup())
|
|
2365
|
+
break;
|
|
2366
|
+
switch (_reader.getFieldNumber()) {
|
|
2367
|
+
case 1:
|
|
2368
|
+
_instance.parent = _reader.readString();
|
|
2369
|
+
break;
|
|
2370
|
+
case 2:
|
|
2371
|
+
_instance.entityTypeName = _reader.readString();
|
|
2372
|
+
break;
|
|
2373
|
+
case 3:
|
|
2374
|
+
_instance.languageCode = _reader.readString();
|
|
2375
|
+
break;
|
|
2376
|
+
case 4:
|
|
2377
|
+
_instance.specialCharacters = _reader.readString();
|
|
2378
|
+
break;
|
|
2379
|
+
case 5:
|
|
2380
|
+
(_instance.substringWhiteList =
|
|
2381
|
+
_instance.substringWhiteList || []).push(_reader.readString());
|
|
2382
|
+
break;
|
|
2383
|
+
case 6:
|
|
2384
|
+
_instance.maxEntityCountUpdate = _reader.readInt32();
|
|
2385
|
+
break;
|
|
2386
|
+
case 7:
|
|
2387
|
+
_instance.dryRun = _reader.readBool();
|
|
2388
|
+
break;
|
|
2389
|
+
default:
|
|
2390
|
+
_reader.skipField();
|
|
2391
|
+
}
|
|
2392
|
+
}
|
|
2393
|
+
CleanEntityTypeRequest.refineValues(_instance);
|
|
2394
|
+
}
|
|
2395
|
+
/**
|
|
2396
|
+
* Serializes a message to binary format using provided binary reader
|
|
2397
|
+
* @param _instance message instance
|
|
2398
|
+
* @param _writer binary writer instance
|
|
2399
|
+
*/
|
|
2400
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
2401
|
+
if (_instance.parent) {
|
|
2402
|
+
_writer.writeString(1, _instance.parent);
|
|
2403
|
+
}
|
|
2404
|
+
if (_instance.entityTypeName) {
|
|
2405
|
+
_writer.writeString(2, _instance.entityTypeName);
|
|
2406
|
+
}
|
|
2407
|
+
if (_instance.languageCode) {
|
|
2408
|
+
_writer.writeString(3, _instance.languageCode);
|
|
2409
|
+
}
|
|
2410
|
+
if (_instance.specialCharacters) {
|
|
2411
|
+
_writer.writeString(4, _instance.specialCharacters);
|
|
2412
|
+
}
|
|
2413
|
+
if (_instance.substringWhiteList && _instance.substringWhiteList.length) {
|
|
2414
|
+
_writer.writeRepeatedString(5, _instance.substringWhiteList);
|
|
2415
|
+
}
|
|
2416
|
+
if (_instance.maxEntityCountUpdate) {
|
|
2417
|
+
_writer.writeInt32(6, _instance.maxEntityCountUpdate);
|
|
2418
|
+
}
|
|
2419
|
+
if (_instance.dryRun) {
|
|
2420
|
+
_writer.writeBool(7, _instance.dryRun);
|
|
2421
|
+
}
|
|
2422
|
+
}
|
|
2423
|
+
get parent() {
|
|
2424
|
+
return this._parent;
|
|
2425
|
+
}
|
|
2426
|
+
set parent(value) {
|
|
2427
|
+
this._parent = value;
|
|
2428
|
+
}
|
|
2429
|
+
get entityTypeName() {
|
|
2430
|
+
return this._entityTypeName;
|
|
2431
|
+
}
|
|
2432
|
+
set entityTypeName(value) {
|
|
2433
|
+
this._entityTypeName = value;
|
|
2434
|
+
}
|
|
2435
|
+
get languageCode() {
|
|
2436
|
+
return this._languageCode;
|
|
2437
|
+
}
|
|
2438
|
+
set languageCode(value) {
|
|
2439
|
+
this._languageCode = value;
|
|
2440
|
+
}
|
|
2441
|
+
get specialCharacters() {
|
|
2442
|
+
return this._specialCharacters;
|
|
2443
|
+
}
|
|
2444
|
+
set specialCharacters(value) {
|
|
2445
|
+
this._specialCharacters = value;
|
|
2446
|
+
}
|
|
2447
|
+
get substringWhiteList() {
|
|
2448
|
+
return this._substringWhiteList;
|
|
2449
|
+
}
|
|
2450
|
+
set substringWhiteList(value) {
|
|
2451
|
+
this._substringWhiteList = value;
|
|
2452
|
+
}
|
|
2453
|
+
get maxEntityCountUpdate() {
|
|
2454
|
+
return this._maxEntityCountUpdate;
|
|
2455
|
+
}
|
|
2456
|
+
set maxEntityCountUpdate(value) {
|
|
2457
|
+
this._maxEntityCountUpdate = value;
|
|
2458
|
+
}
|
|
2459
|
+
get dryRun() {
|
|
2460
|
+
return this._dryRun;
|
|
2461
|
+
}
|
|
2462
|
+
set dryRun(value) {
|
|
2463
|
+
this._dryRun = value;
|
|
2464
|
+
}
|
|
2465
|
+
/**
|
|
2466
|
+
* Serialize message to binary data
|
|
2467
|
+
* @param instance message instance
|
|
2468
|
+
*/
|
|
2469
|
+
serializeBinary() {
|
|
2470
|
+
const writer = new BinaryWriter();
|
|
2471
|
+
CleanEntityTypeRequest.serializeBinaryToWriter(this, writer);
|
|
2472
|
+
return writer.getResultBuffer();
|
|
2473
|
+
}
|
|
2474
|
+
/**
|
|
2475
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2476
|
+
*/
|
|
2477
|
+
toObject() {
|
|
2478
|
+
return {
|
|
2479
|
+
parent: this.parent,
|
|
2480
|
+
entityTypeName: this.entityTypeName,
|
|
2481
|
+
languageCode: this.languageCode,
|
|
2482
|
+
specialCharacters: this.specialCharacters,
|
|
2483
|
+
substringWhiteList: (this.substringWhiteList || []).slice(),
|
|
2484
|
+
maxEntityCountUpdate: this.maxEntityCountUpdate,
|
|
2485
|
+
dryRun: this.dryRun
|
|
2486
|
+
};
|
|
2487
|
+
}
|
|
2488
|
+
/**
|
|
2489
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2490
|
+
*/
|
|
2491
|
+
toJSON() {
|
|
2492
|
+
return this.toObject();
|
|
2493
|
+
}
|
|
2494
|
+
/**
|
|
2495
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2496
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2497
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
2498
|
+
*/
|
|
2499
|
+
toProtobufJSON(
|
|
2500
|
+
// @ts-ignore
|
|
2501
|
+
options) {
|
|
2502
|
+
return {
|
|
2503
|
+
parent: this.parent,
|
|
2504
|
+
entityTypeName: this.entityTypeName,
|
|
2505
|
+
languageCode: this.languageCode,
|
|
2506
|
+
specialCharacters: this.specialCharacters,
|
|
2507
|
+
substringWhiteList: (this.substringWhiteList || []).slice(),
|
|
2508
|
+
maxEntityCountUpdate: this.maxEntityCountUpdate,
|
|
2509
|
+
dryRun: this.dryRun
|
|
2510
|
+
};
|
|
2511
|
+
}
|
|
2512
|
+
}
|
|
2513
|
+
CleanEntityTypeRequest.id = 'ondewo.nlu.CleanEntityTypeRequest';
|
|
2514
|
+
/**
|
|
2515
|
+
* Message implementation for ondewo.nlu.CleanEntityTypeResponse
|
|
2516
|
+
*/
|
|
2517
|
+
export class CleanEntityTypeResponse {
|
|
2518
|
+
/**
|
|
2519
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2520
|
+
* @param _value initial values object or instance of CleanEntityTypeResponse to deeply clone from
|
|
2521
|
+
*/
|
|
2522
|
+
constructor(_value) {
|
|
2523
|
+
_value = _value || {};
|
|
2524
|
+
this.cleanedEntityType = _value.cleanedEntityType
|
|
2525
|
+
? new ondewoNlu009.EntityType(_value.cleanedEntityType)
|
|
2526
|
+
: undefined;
|
|
2527
|
+
this.entityTypeUpdate = _value.entityTypeUpdate
|
|
2528
|
+
? new EntityTypeUpdate(_value.entityTypeUpdate)
|
|
2529
|
+
: undefined;
|
|
2530
|
+
CleanEntityTypeResponse.refineValues(this);
|
|
2531
|
+
}
|
|
2532
|
+
/**
|
|
2533
|
+
* Deserialize binary data to message
|
|
2534
|
+
* @param instance message instance
|
|
2535
|
+
*/
|
|
2536
|
+
static deserializeBinary(bytes) {
|
|
2537
|
+
const instance = new CleanEntityTypeResponse();
|
|
2538
|
+
CleanEntityTypeResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2539
|
+
return instance;
|
|
2540
|
+
}
|
|
2541
|
+
/**
|
|
2542
|
+
* Check all the properties and set default protobuf values if necessary
|
|
2543
|
+
* @param _instance message instance
|
|
2544
|
+
*/
|
|
2545
|
+
static refineValues(_instance) {
|
|
2546
|
+
_instance.cleanedEntityType = _instance.cleanedEntityType || undefined;
|
|
2547
|
+
_instance.entityTypeUpdate = _instance.entityTypeUpdate || undefined;
|
|
2548
|
+
}
|
|
2549
|
+
/**
|
|
2550
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2551
|
+
* @param _instance message instance
|
|
2552
|
+
* @param _reader binary reader instance
|
|
2553
|
+
*/
|
|
2554
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2555
|
+
while (_reader.nextField()) {
|
|
2556
|
+
if (_reader.isEndGroup())
|
|
2557
|
+
break;
|
|
2558
|
+
switch (_reader.getFieldNumber()) {
|
|
2559
|
+
case 1:
|
|
2560
|
+
_instance.cleanedEntityType = new ondewoNlu009.EntityType();
|
|
2561
|
+
_reader.readMessage(_instance.cleanedEntityType, ondewoNlu009.EntityType.deserializeBinaryFromReader);
|
|
2562
|
+
break;
|
|
2563
|
+
case 2:
|
|
2564
|
+
_instance.entityTypeUpdate = new EntityTypeUpdate();
|
|
2565
|
+
_reader.readMessage(_instance.entityTypeUpdate, EntityTypeUpdate.deserializeBinaryFromReader);
|
|
2566
|
+
break;
|
|
2567
|
+
default:
|
|
2568
|
+
_reader.skipField();
|
|
2569
|
+
}
|
|
2570
|
+
}
|
|
2571
|
+
CleanEntityTypeResponse.refineValues(_instance);
|
|
2572
|
+
}
|
|
2573
|
+
/**
|
|
2574
|
+
* Serializes a message to binary format using provided binary reader
|
|
2575
|
+
* @param _instance message instance
|
|
2576
|
+
* @param _writer binary writer instance
|
|
2577
|
+
*/
|
|
2578
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
2579
|
+
if (_instance.cleanedEntityType) {
|
|
2580
|
+
_writer.writeMessage(1, _instance.cleanedEntityType, ondewoNlu009.EntityType.serializeBinaryToWriter);
|
|
2581
|
+
}
|
|
2582
|
+
if (_instance.entityTypeUpdate) {
|
|
2583
|
+
_writer.writeMessage(2, _instance.entityTypeUpdate, EntityTypeUpdate.serializeBinaryToWriter);
|
|
2584
|
+
}
|
|
2585
|
+
}
|
|
2586
|
+
get cleanedEntityType() {
|
|
2587
|
+
return this._cleanedEntityType;
|
|
2588
|
+
}
|
|
2589
|
+
set cleanedEntityType(value) {
|
|
2590
|
+
this._cleanedEntityType = value;
|
|
2591
|
+
}
|
|
2592
|
+
get entityTypeUpdate() {
|
|
2593
|
+
return this._entityTypeUpdate;
|
|
2594
|
+
}
|
|
2595
|
+
set entityTypeUpdate(value) {
|
|
2596
|
+
this._entityTypeUpdate = value;
|
|
2597
|
+
}
|
|
2598
|
+
/**
|
|
2599
|
+
* Serialize message to binary data
|
|
2600
|
+
* @param instance message instance
|
|
2601
|
+
*/
|
|
2602
|
+
serializeBinary() {
|
|
2603
|
+
const writer = new BinaryWriter();
|
|
2604
|
+
CleanEntityTypeResponse.serializeBinaryToWriter(this, writer);
|
|
2605
|
+
return writer.getResultBuffer();
|
|
2606
|
+
}
|
|
2607
|
+
/**
|
|
2608
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2609
|
+
*/
|
|
2610
|
+
toObject() {
|
|
2611
|
+
return {
|
|
2612
|
+
cleanedEntityType: this.cleanedEntityType
|
|
2613
|
+
? this.cleanedEntityType.toObject()
|
|
2614
|
+
: undefined,
|
|
2615
|
+
entityTypeUpdate: this.entityTypeUpdate
|
|
2616
|
+
? this.entityTypeUpdate.toObject()
|
|
2617
|
+
: undefined
|
|
2618
|
+
};
|
|
2619
|
+
}
|
|
2620
|
+
/**
|
|
2621
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2622
|
+
*/
|
|
2623
|
+
toJSON() {
|
|
2624
|
+
return this.toObject();
|
|
2625
|
+
}
|
|
2626
|
+
/**
|
|
2627
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2628
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2629
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
2630
|
+
*/
|
|
2631
|
+
toProtobufJSON(
|
|
2632
|
+
// @ts-ignore
|
|
2633
|
+
options) {
|
|
2634
|
+
return {
|
|
2635
|
+
cleanedEntityType: this.cleanedEntityType
|
|
2636
|
+
? this.cleanedEntityType.toProtobufJSON(options)
|
|
2637
|
+
: null,
|
|
2638
|
+
entityTypeUpdate: this.entityTypeUpdate
|
|
2639
|
+
? this.entityTypeUpdate.toProtobufJSON(options)
|
|
2640
|
+
: null
|
|
2641
|
+
};
|
|
2642
|
+
}
|
|
2643
|
+
}
|
|
2644
|
+
CleanEntityTypeResponse.id = 'ondewo.nlu.CleanEntityTypeResponse';
|
|
2645
|
+
/**
|
|
2646
|
+
* Message implementation for ondewo.nlu.AddTrainingPhrasesRequest
|
|
2647
|
+
*/
|
|
2648
|
+
export class AddTrainingPhrasesRequest {
|
|
2649
|
+
/**
|
|
2650
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2651
|
+
* @param _value initial values object or instance of AddTrainingPhrasesRequest to deeply clone from
|
|
2652
|
+
*/
|
|
2653
|
+
constructor(_value) {
|
|
2654
|
+
_value = _value || {};
|
|
2655
|
+
this.parent = _value.parent;
|
|
2656
|
+
this.languageCode = _value.languageCode;
|
|
2657
|
+
this.trainingPhraseList = (_value.trainingPhraseList || []).map(m => new AddTrainingPhrasesRequest.TrainingPhraseForIntent(m));
|
|
2658
|
+
this.extractEntities = _value.extractEntities;
|
|
2659
|
+
this.specialCharacters = _value.specialCharacters;
|
|
2660
|
+
this.trainingPhraseCleanerOptions = _value.trainingPhraseCleanerOptions
|
|
2661
|
+
? new TrainingPhraseCleanerOptions(_value.trainingPhraseCleanerOptions)
|
|
2662
|
+
: undefined;
|
|
2663
|
+
this.numberOfWorkers = _value.numberOfWorkers;
|
|
2664
|
+
AddTrainingPhrasesRequest.refineValues(this);
|
|
2665
|
+
}
|
|
2666
|
+
/**
|
|
2667
|
+
* Deserialize binary data to message
|
|
2668
|
+
* @param instance message instance
|
|
2669
|
+
*/
|
|
2670
|
+
static deserializeBinary(bytes) {
|
|
2671
|
+
const instance = new AddTrainingPhrasesRequest();
|
|
2672
|
+
AddTrainingPhrasesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2673
|
+
return instance;
|
|
2674
|
+
}
|
|
2675
|
+
/**
|
|
2676
|
+
* Check all the properties and set default protobuf values if necessary
|
|
2677
|
+
* @param _instance message instance
|
|
2678
|
+
*/
|
|
2679
|
+
static refineValues(_instance) {
|
|
2680
|
+
_instance.parent = _instance.parent || '';
|
|
2681
|
+
_instance.languageCode = _instance.languageCode || '';
|
|
2682
|
+
_instance.trainingPhraseList = _instance.trainingPhraseList || [];
|
|
2683
|
+
_instance.extractEntities = _instance.extractEntities || false;
|
|
2684
|
+
_instance.specialCharacters = _instance.specialCharacters || '';
|
|
2685
|
+
_instance.trainingPhraseCleanerOptions =
|
|
2686
|
+
_instance.trainingPhraseCleanerOptions || undefined;
|
|
2687
|
+
_instance.numberOfWorkers = _instance.numberOfWorkers || 0;
|
|
2688
|
+
}
|
|
2689
|
+
/**
|
|
2690
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2691
|
+
* @param _instance message instance
|
|
2692
|
+
* @param _reader binary reader instance
|
|
2693
|
+
*/
|
|
2694
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2695
|
+
while (_reader.nextField()) {
|
|
2696
|
+
if (_reader.isEndGroup())
|
|
2697
|
+
break;
|
|
2698
|
+
switch (_reader.getFieldNumber()) {
|
|
2699
|
+
case 1:
|
|
2700
|
+
_instance.parent = _reader.readString();
|
|
2701
|
+
break;
|
|
2702
|
+
case 2:
|
|
2703
|
+
_instance.languageCode = _reader.readString();
|
|
2704
|
+
break;
|
|
2705
|
+
case 3:
|
|
2706
|
+
const messageInitializer3 = new AddTrainingPhrasesRequest.TrainingPhraseForIntent();
|
|
2707
|
+
_reader.readMessage(messageInitializer3, AddTrainingPhrasesRequest.TrainingPhraseForIntent
|
|
2708
|
+
.deserializeBinaryFromReader);
|
|
2709
|
+
(_instance.trainingPhraseList =
|
|
2710
|
+
_instance.trainingPhraseList || []).push(messageInitializer3);
|
|
2711
|
+
break;
|
|
2712
|
+
case 4:
|
|
2713
|
+
_instance.extractEntities = _reader.readBool();
|
|
2714
|
+
break;
|
|
2715
|
+
case 5:
|
|
2716
|
+
_instance.specialCharacters = _reader.readString();
|
|
2717
|
+
break;
|
|
2718
|
+
case 6:
|
|
2719
|
+
_instance.trainingPhraseCleanerOptions = new TrainingPhraseCleanerOptions();
|
|
2720
|
+
_reader.readMessage(_instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.deserializeBinaryFromReader);
|
|
2721
|
+
break;
|
|
2722
|
+
case 7:
|
|
2723
|
+
_instance.numberOfWorkers = _reader.readInt32();
|
|
2724
|
+
break;
|
|
2725
|
+
default:
|
|
2726
|
+
_reader.skipField();
|
|
2727
|
+
}
|
|
2728
|
+
}
|
|
2729
|
+
AddTrainingPhrasesRequest.refineValues(_instance);
|
|
2730
|
+
}
|
|
2731
|
+
/**
|
|
2732
|
+
* Serializes a message to binary format using provided binary reader
|
|
2733
|
+
* @param _instance message instance
|
|
2734
|
+
* @param _writer binary writer instance
|
|
2735
|
+
*/
|
|
2736
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
2737
|
+
if (_instance.parent) {
|
|
2738
|
+
_writer.writeString(1, _instance.parent);
|
|
2739
|
+
}
|
|
2740
|
+
if (_instance.languageCode) {
|
|
2741
|
+
_writer.writeString(2, _instance.languageCode);
|
|
2742
|
+
}
|
|
2743
|
+
if (_instance.trainingPhraseList && _instance.trainingPhraseList.length) {
|
|
2744
|
+
_writer.writeRepeatedMessage(3, _instance.trainingPhraseList, AddTrainingPhrasesRequest.TrainingPhraseForIntent
|
|
2745
|
+
.serializeBinaryToWriter);
|
|
2746
|
+
}
|
|
2747
|
+
if (_instance.extractEntities) {
|
|
2748
|
+
_writer.writeBool(4, _instance.extractEntities);
|
|
2749
|
+
}
|
|
2750
|
+
if (_instance.specialCharacters) {
|
|
2751
|
+
_writer.writeString(5, _instance.specialCharacters);
|
|
2752
|
+
}
|
|
2753
|
+
if (_instance.trainingPhraseCleanerOptions) {
|
|
2754
|
+
_writer.writeMessage(6, _instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.serializeBinaryToWriter);
|
|
2755
|
+
}
|
|
2756
|
+
if (_instance.numberOfWorkers) {
|
|
2757
|
+
_writer.writeInt32(7, _instance.numberOfWorkers);
|
|
2758
|
+
}
|
|
2759
|
+
}
|
|
2760
|
+
get parent() {
|
|
2761
|
+
return this._parent;
|
|
2762
|
+
}
|
|
2763
|
+
set parent(value) {
|
|
2764
|
+
this._parent = value;
|
|
2765
|
+
}
|
|
2766
|
+
get languageCode() {
|
|
2767
|
+
return this._languageCode;
|
|
2768
|
+
}
|
|
2769
|
+
set languageCode(value) {
|
|
2770
|
+
this._languageCode = value;
|
|
2771
|
+
}
|
|
2772
|
+
get trainingPhraseList() {
|
|
2773
|
+
return this._trainingPhraseList;
|
|
2774
|
+
}
|
|
2775
|
+
set trainingPhraseList(value) {
|
|
2776
|
+
this._trainingPhraseList = value;
|
|
2777
|
+
}
|
|
2778
|
+
get extractEntities() {
|
|
2779
|
+
return this._extractEntities;
|
|
2780
|
+
}
|
|
2781
|
+
set extractEntities(value) {
|
|
2782
|
+
this._extractEntities = value;
|
|
2783
|
+
}
|
|
2784
|
+
get specialCharacters() {
|
|
2785
|
+
return this._specialCharacters;
|
|
2786
|
+
}
|
|
2787
|
+
set specialCharacters(value) {
|
|
2788
|
+
this._specialCharacters = value;
|
|
2789
|
+
}
|
|
2790
|
+
get trainingPhraseCleanerOptions() {
|
|
2791
|
+
return this._trainingPhraseCleanerOptions;
|
|
2792
|
+
}
|
|
2793
|
+
set trainingPhraseCleanerOptions(value) {
|
|
2794
|
+
this._trainingPhraseCleanerOptions = value;
|
|
2795
|
+
}
|
|
2796
|
+
get numberOfWorkers() {
|
|
2797
|
+
return this._numberOfWorkers;
|
|
2798
|
+
}
|
|
2799
|
+
set numberOfWorkers(value) {
|
|
2800
|
+
this._numberOfWorkers = value;
|
|
2801
|
+
}
|
|
2802
|
+
/**
|
|
2803
|
+
* Serialize message to binary data
|
|
2804
|
+
* @param instance message instance
|
|
2805
|
+
*/
|
|
2806
|
+
serializeBinary() {
|
|
2807
|
+
const writer = new BinaryWriter();
|
|
2808
|
+
AddTrainingPhrasesRequest.serializeBinaryToWriter(this, writer);
|
|
2809
|
+
return writer.getResultBuffer();
|
|
2810
|
+
}
|
|
2811
|
+
/**
|
|
2812
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2813
|
+
*/
|
|
2814
|
+
toObject() {
|
|
2815
|
+
return {
|
|
2816
|
+
parent: this.parent,
|
|
2817
|
+
languageCode: this.languageCode,
|
|
2818
|
+
trainingPhraseList: (this.trainingPhraseList || []).map(m => m.toObject()),
|
|
2819
|
+
extractEntities: this.extractEntities,
|
|
2820
|
+
specialCharacters: this.specialCharacters,
|
|
2821
|
+
trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
|
|
2822
|
+
? this.trainingPhraseCleanerOptions.toObject()
|
|
2823
|
+
: undefined,
|
|
2824
|
+
numberOfWorkers: this.numberOfWorkers
|
|
2825
|
+
};
|
|
2826
|
+
}
|
|
2827
|
+
/**
|
|
2828
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2829
|
+
*/
|
|
2830
|
+
toJSON() {
|
|
2831
|
+
return this.toObject();
|
|
2832
|
+
}
|
|
2833
|
+
/**
|
|
2834
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2835
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2836
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
2837
|
+
*/
|
|
2838
|
+
toProtobufJSON(
|
|
2839
|
+
// @ts-ignore
|
|
2840
|
+
options) {
|
|
2841
|
+
return {
|
|
2842
|
+
parent: this.parent,
|
|
2843
|
+
languageCode: this.languageCode,
|
|
2844
|
+
trainingPhraseList: (this.trainingPhraseList || []).map(m => m.toProtobufJSON(options)),
|
|
2845
|
+
extractEntities: this.extractEntities,
|
|
2846
|
+
specialCharacters: this.specialCharacters,
|
|
2847
|
+
trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
|
|
2848
|
+
? this.trainingPhraseCleanerOptions.toProtobufJSON(options)
|
|
2849
|
+
: null,
|
|
2850
|
+
numberOfWorkers: this.numberOfWorkers
|
|
2851
|
+
};
|
|
2852
|
+
}
|
|
2853
|
+
}
|
|
2854
|
+
AddTrainingPhrasesRequest.id = 'ondewo.nlu.AddTrainingPhrasesRequest';
|
|
2855
|
+
(function (AddTrainingPhrasesRequest) {
|
|
2856
|
+
/**
|
|
2857
|
+
* Message implementation for ondewo.nlu.TrainingPhraseForIntent
|
|
2858
|
+
*/
|
|
2859
|
+
class TrainingPhraseForIntent {
|
|
2860
|
+
/**
|
|
2861
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2862
|
+
* @param _value initial values object or instance of TrainingPhraseForIntent to deeply clone from
|
|
2863
|
+
*/
|
|
2864
|
+
constructor(_value) {
|
|
2865
|
+
_value = _value || {};
|
|
2866
|
+
this.trainingPhrase = _value.trainingPhrase;
|
|
2867
|
+
this.intentDisplayName = _value.intentDisplayName;
|
|
2868
|
+
this.entities = (_value.entities || []).map(m => new ondewoNlu008.Intent.TrainingPhrase.Entity(m));
|
|
2869
|
+
TrainingPhraseForIntent.refineValues(this);
|
|
2870
|
+
}
|
|
2871
|
+
/**
|
|
2872
|
+
* Deserialize binary data to message
|
|
2873
|
+
* @param instance message instance
|
|
2874
|
+
*/
|
|
2875
|
+
static deserializeBinary(bytes) {
|
|
2876
|
+
const instance = new TrainingPhraseForIntent();
|
|
2877
|
+
TrainingPhraseForIntent.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2878
|
+
return instance;
|
|
2879
|
+
}
|
|
2880
|
+
/**
|
|
2881
|
+
* Check all the properties and set default protobuf values if necessary
|
|
2882
|
+
* @param _instance message instance
|
|
2883
|
+
*/
|
|
2884
|
+
static refineValues(_instance) {
|
|
2885
|
+
_instance.trainingPhrase = _instance.trainingPhrase || '';
|
|
2886
|
+
_instance.intentDisplayName = _instance.intentDisplayName || '';
|
|
2887
|
+
_instance.entities = _instance.entities || [];
|
|
2888
|
+
}
|
|
2889
|
+
/**
|
|
2890
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2891
|
+
* @param _instance message instance
|
|
2892
|
+
* @param _reader binary reader instance
|
|
2893
|
+
*/
|
|
2894
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2895
|
+
while (_reader.nextField()) {
|
|
2896
|
+
if (_reader.isEndGroup())
|
|
2897
|
+
break;
|
|
2898
|
+
switch (_reader.getFieldNumber()) {
|
|
2899
|
+
case 1:
|
|
2900
|
+
_instance.trainingPhrase = _reader.readString();
|
|
2901
|
+
break;
|
|
2902
|
+
case 2:
|
|
2903
|
+
_instance.intentDisplayName = _reader.readString();
|
|
2904
|
+
break;
|
|
2905
|
+
case 3:
|
|
2906
|
+
const messageInitializer3 = new ondewoNlu008.Intent.TrainingPhrase.Entity();
|
|
2907
|
+
_reader.readMessage(messageInitializer3, ondewoNlu008.Intent.TrainingPhrase.Entity
|
|
2908
|
+
.deserializeBinaryFromReader);
|
|
2909
|
+
(_instance.entities = _instance.entities || []).push(messageInitializer3);
|
|
2910
|
+
break;
|
|
2911
|
+
default:
|
|
2912
|
+
_reader.skipField();
|
|
2913
|
+
}
|
|
2914
|
+
}
|
|
2915
|
+
TrainingPhraseForIntent.refineValues(_instance);
|
|
2916
|
+
}
|
|
2917
|
+
/**
|
|
2918
|
+
* Serializes a message to binary format using provided binary reader
|
|
2919
|
+
* @param _instance message instance
|
|
2920
|
+
* @param _writer binary writer instance
|
|
2921
|
+
*/
|
|
2922
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
2923
|
+
if (_instance.trainingPhrase) {
|
|
2924
|
+
_writer.writeString(1, _instance.trainingPhrase);
|
|
2925
|
+
}
|
|
2926
|
+
if (_instance.intentDisplayName) {
|
|
2927
|
+
_writer.writeString(2, _instance.intentDisplayName);
|
|
2928
|
+
}
|
|
2929
|
+
if (_instance.entities && _instance.entities.length) {
|
|
2930
|
+
_writer.writeRepeatedMessage(3, _instance.entities, ondewoNlu008.Intent.TrainingPhrase.Entity.serializeBinaryToWriter);
|
|
2931
|
+
}
|
|
2932
|
+
}
|
|
2933
|
+
get trainingPhrase() {
|
|
2934
|
+
return this._trainingPhrase;
|
|
2935
|
+
}
|
|
2936
|
+
set trainingPhrase(value) {
|
|
2937
|
+
this._trainingPhrase = value;
|
|
2938
|
+
}
|
|
2939
|
+
get intentDisplayName() {
|
|
2940
|
+
return this._intentDisplayName;
|
|
2941
|
+
}
|
|
2942
|
+
set intentDisplayName(value) {
|
|
2943
|
+
this._intentDisplayName = value;
|
|
2944
|
+
}
|
|
2945
|
+
get entities() {
|
|
2946
|
+
return this._entities;
|
|
2947
|
+
}
|
|
2948
|
+
set entities(value) {
|
|
2949
|
+
this._entities = value;
|
|
2950
|
+
}
|
|
2951
|
+
/**
|
|
2952
|
+
* Serialize message to binary data
|
|
2953
|
+
* @param instance message instance
|
|
2954
|
+
*/
|
|
2955
|
+
serializeBinary() {
|
|
2956
|
+
const writer = new BinaryWriter();
|
|
2957
|
+
TrainingPhraseForIntent.serializeBinaryToWriter(this, writer);
|
|
2958
|
+
return writer.getResultBuffer();
|
|
2959
|
+
}
|
|
2960
|
+
/**
|
|
2961
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2962
|
+
*/
|
|
2963
|
+
toObject() {
|
|
2964
|
+
return {
|
|
2965
|
+
trainingPhrase: this.trainingPhrase,
|
|
2966
|
+
intentDisplayName: this.intentDisplayName,
|
|
2967
|
+
entities: (this.entities || []).map(m => m.toObject())
|
|
2968
|
+
};
|
|
2969
|
+
}
|
|
2970
|
+
/**
|
|
2971
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2972
|
+
*/
|
|
2973
|
+
toJSON() {
|
|
2974
|
+
return this.toObject();
|
|
2975
|
+
}
|
|
2976
|
+
/**
|
|
2977
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2978
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2979
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
2980
|
+
*/
|
|
2981
|
+
toProtobufJSON(
|
|
2982
|
+
// @ts-ignore
|
|
2983
|
+
options) {
|
|
2984
|
+
return {
|
|
2985
|
+
trainingPhrase: this.trainingPhrase,
|
|
2986
|
+
intentDisplayName: this.intentDisplayName,
|
|
2987
|
+
entities: (this.entities || []).map(m => m.toProtobufJSON(options))
|
|
2988
|
+
};
|
|
2989
|
+
}
|
|
2990
|
+
}
|
|
2991
|
+
TrainingPhraseForIntent.id = 'ondewo.nlu.TrainingPhraseForIntent';
|
|
2992
|
+
AddTrainingPhrasesRequest.TrainingPhraseForIntent = TrainingPhraseForIntent;
|
|
2993
|
+
})(AddTrainingPhrasesRequest || (AddTrainingPhrasesRequest = {}));
|
|
2994
|
+
/**
|
|
2995
|
+
* Message implementation for ondewo.nlu.AddTrainingPhrasesResponse
|
|
2996
|
+
*/
|
|
2997
|
+
export class AddTrainingPhrasesResponse {
|
|
2998
|
+
/**
|
|
2999
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
3000
|
+
* @param _value initial values object or instance of AddTrainingPhrasesResponse to deeply clone from
|
|
3001
|
+
*/
|
|
3002
|
+
constructor(_value) {
|
|
3003
|
+
_value = _value || {};
|
|
3004
|
+
this.errorMessages = (_value.errorMessages || []).slice();
|
|
3005
|
+
AddTrainingPhrasesResponse.refineValues(this);
|
|
3006
|
+
}
|
|
3007
|
+
/**
|
|
3008
|
+
* Deserialize binary data to message
|
|
3009
|
+
* @param instance message instance
|
|
3010
|
+
*/
|
|
3011
|
+
static deserializeBinary(bytes) {
|
|
3012
|
+
const instance = new AddTrainingPhrasesResponse();
|
|
3013
|
+
AddTrainingPhrasesResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
3014
|
+
return instance;
|
|
3015
|
+
}
|
|
3016
|
+
/**
|
|
3017
|
+
* Check all the properties and set default protobuf values if necessary
|
|
3018
|
+
* @param _instance message instance
|
|
3019
|
+
*/
|
|
3020
|
+
static refineValues(_instance) {
|
|
3021
|
+
_instance.errorMessages = _instance.errorMessages || [];
|
|
3022
|
+
}
|
|
3023
|
+
/**
|
|
3024
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
3025
|
+
* @param _instance message instance
|
|
3026
|
+
* @param _reader binary reader instance
|
|
3027
|
+
*/
|
|
3028
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
3029
|
+
while (_reader.nextField()) {
|
|
3030
|
+
if (_reader.isEndGroup())
|
|
3031
|
+
break;
|
|
3032
|
+
switch (_reader.getFieldNumber()) {
|
|
3033
|
+
case 1:
|
|
3034
|
+
(_instance.errorMessages = _instance.errorMessages || []).push(_reader.readString());
|
|
3035
|
+
break;
|
|
3036
|
+
default:
|
|
3037
|
+
_reader.skipField();
|
|
3038
|
+
}
|
|
3039
|
+
}
|
|
3040
|
+
AddTrainingPhrasesResponse.refineValues(_instance);
|
|
3041
|
+
}
|
|
3042
|
+
/**
|
|
3043
|
+
* Serializes a message to binary format using provided binary reader
|
|
3044
|
+
* @param _instance message instance
|
|
3045
|
+
* @param _writer binary writer instance
|
|
3046
|
+
*/
|
|
3047
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
3048
|
+
if (_instance.errorMessages && _instance.errorMessages.length) {
|
|
3049
|
+
_writer.writeRepeatedString(1, _instance.errorMessages);
|
|
3050
|
+
}
|
|
3051
|
+
}
|
|
3052
|
+
get errorMessages() {
|
|
3053
|
+
return this._errorMessages;
|
|
3054
|
+
}
|
|
3055
|
+
set errorMessages(value) {
|
|
3056
|
+
this._errorMessages = value;
|
|
3057
|
+
}
|
|
3058
|
+
/**
|
|
3059
|
+
* Serialize message to binary data
|
|
3060
|
+
* @param instance message instance
|
|
3061
|
+
*/
|
|
3062
|
+
serializeBinary() {
|
|
3063
|
+
const writer = new BinaryWriter();
|
|
3064
|
+
AddTrainingPhrasesResponse.serializeBinaryToWriter(this, writer);
|
|
3065
|
+
return writer.getResultBuffer();
|
|
3066
|
+
}
|
|
3067
|
+
/**
|
|
3068
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
3069
|
+
*/
|
|
3070
|
+
toObject() {
|
|
3071
|
+
return {
|
|
3072
|
+
errorMessages: (this.errorMessages || []).slice()
|
|
3073
|
+
};
|
|
3074
|
+
}
|
|
3075
|
+
/**
|
|
3076
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
3077
|
+
*/
|
|
3078
|
+
toJSON() {
|
|
3079
|
+
return this.toObject();
|
|
3080
|
+
}
|
|
3081
|
+
/**
|
|
3082
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
3083
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
3084
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
3085
|
+
*/
|
|
3086
|
+
toProtobufJSON(
|
|
3087
|
+
// @ts-ignore
|
|
3088
|
+
options) {
|
|
3089
|
+
return {
|
|
3090
|
+
errorMessages: (this.errorMessages || []).slice()
|
|
3091
|
+
};
|
|
3092
|
+
}
|
|
3093
|
+
}
|
|
3094
|
+
AddTrainingPhrasesResponse.id = 'ondewo.nlu.AddTrainingPhrasesResponse';
|
|
3095
|
+
/**
|
|
3096
|
+
* Message implementation for ondewo.nlu.AddTrainingPhrasesFromCSVRequest
|
|
3097
|
+
*/
|
|
3098
|
+
export class AddTrainingPhrasesFromCSVRequest {
|
|
3099
|
+
/**
|
|
3100
|
+
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
3101
|
+
* @param _value initial values object or instance of AddTrainingPhrasesFromCSVRequest to deeply clone from
|
|
3102
|
+
*/
|
|
3103
|
+
constructor(_value) {
|
|
3104
|
+
_value = _value || {};
|
|
3105
|
+
this.parent = _value.parent;
|
|
3106
|
+
this.languageCode = _value.languageCode;
|
|
3107
|
+
this.csvContents = _value.csvContents;
|
|
3108
|
+
this.extractEntities = _value.extractEntities;
|
|
3109
|
+
this.specialCharacters = _value.specialCharacters;
|
|
3110
|
+
this.trainingPhraseCleanerOptions = _value.trainingPhraseCleanerOptions
|
|
3111
|
+
? new TrainingPhraseCleanerOptions(_value.trainingPhraseCleanerOptions)
|
|
3112
|
+
: undefined;
|
|
3113
|
+
this.numberOfWorkers = _value.numberOfWorkers;
|
|
3114
|
+
AddTrainingPhrasesFromCSVRequest.refineValues(this);
|
|
3115
|
+
}
|
|
3116
|
+
/**
|
|
3117
|
+
* Deserialize binary data to message
|
|
3118
|
+
* @param instance message instance
|
|
3119
|
+
*/
|
|
3120
|
+
static deserializeBinary(bytes) {
|
|
3121
|
+
const instance = new AddTrainingPhrasesFromCSVRequest();
|
|
3122
|
+
AddTrainingPhrasesFromCSVRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
3123
|
+
return instance;
|
|
3124
|
+
}
|
|
3125
|
+
/**
|
|
3126
|
+
* Check all the properties and set default protobuf values if necessary
|
|
3127
|
+
* @param _instance message instance
|
|
3128
|
+
*/
|
|
3129
|
+
static refineValues(_instance) {
|
|
3130
|
+
_instance.parent = _instance.parent || '';
|
|
3131
|
+
_instance.languageCode = _instance.languageCode || '';
|
|
3132
|
+
_instance.csvContents = _instance.csvContents || new Uint8Array();
|
|
3133
|
+
_instance.extractEntities = _instance.extractEntities || false;
|
|
3134
|
+
_instance.specialCharacters = _instance.specialCharacters || '';
|
|
3135
|
+
_instance.trainingPhraseCleanerOptions =
|
|
3136
|
+
_instance.trainingPhraseCleanerOptions || undefined;
|
|
3137
|
+
_instance.numberOfWorkers = _instance.numberOfWorkers || 0;
|
|
3138
|
+
}
|
|
3139
|
+
/**
|
|
3140
|
+
* Deserializes / reads binary message into message instance using provided binary reader
|
|
3141
|
+
* @param _instance message instance
|
|
3142
|
+
* @param _reader binary reader instance
|
|
3143
|
+
*/
|
|
3144
|
+
static deserializeBinaryFromReader(_instance, _reader) {
|
|
3145
|
+
while (_reader.nextField()) {
|
|
3146
|
+
if (_reader.isEndGroup())
|
|
3147
|
+
break;
|
|
3148
|
+
switch (_reader.getFieldNumber()) {
|
|
3149
|
+
case 1:
|
|
3150
|
+
_instance.parent = _reader.readString();
|
|
3151
|
+
break;
|
|
3152
|
+
case 2:
|
|
3153
|
+
_instance.languageCode = _reader.readString();
|
|
3154
|
+
break;
|
|
3155
|
+
case 3:
|
|
3156
|
+
_instance.csvContents = _reader.readBytes();
|
|
3157
|
+
break;
|
|
3158
|
+
case 4:
|
|
3159
|
+
_instance.extractEntities = _reader.readBool();
|
|
3160
|
+
break;
|
|
3161
|
+
case 5:
|
|
3162
|
+
_instance.specialCharacters = _reader.readString();
|
|
3163
|
+
break;
|
|
3164
|
+
case 6:
|
|
3165
|
+
_instance.trainingPhraseCleanerOptions = new TrainingPhraseCleanerOptions();
|
|
3166
|
+
_reader.readMessage(_instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.deserializeBinaryFromReader);
|
|
3167
|
+
break;
|
|
3168
|
+
case 7:
|
|
3169
|
+
_instance.numberOfWorkers = _reader.readInt32();
|
|
3170
|
+
break;
|
|
3171
|
+
default:
|
|
3172
|
+
_reader.skipField();
|
|
3173
|
+
}
|
|
3174
|
+
}
|
|
3175
|
+
AddTrainingPhrasesFromCSVRequest.refineValues(_instance);
|
|
3176
|
+
}
|
|
3177
|
+
/**
|
|
3178
|
+
* Serializes a message to binary format using provided binary reader
|
|
3179
|
+
* @param _instance message instance
|
|
3180
|
+
* @param _writer binary writer instance
|
|
3181
|
+
*/
|
|
3182
|
+
static serializeBinaryToWriter(_instance, _writer) {
|
|
3183
|
+
if (_instance.parent) {
|
|
3184
|
+
_writer.writeString(1, _instance.parent);
|
|
3185
|
+
}
|
|
3186
|
+
if (_instance.languageCode) {
|
|
3187
|
+
_writer.writeString(2, _instance.languageCode);
|
|
3188
|
+
}
|
|
3189
|
+
if (_instance.csvContents && _instance.csvContents.length) {
|
|
3190
|
+
_writer.writeBytes(3, _instance.csvContents);
|
|
3191
|
+
}
|
|
3192
|
+
if (_instance.extractEntities) {
|
|
3193
|
+
_writer.writeBool(4, _instance.extractEntities);
|
|
3194
|
+
}
|
|
3195
|
+
if (_instance.specialCharacters) {
|
|
3196
|
+
_writer.writeString(5, _instance.specialCharacters);
|
|
3197
|
+
}
|
|
3198
|
+
if (_instance.trainingPhraseCleanerOptions) {
|
|
3199
|
+
_writer.writeMessage(6, _instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.serializeBinaryToWriter);
|
|
3200
|
+
}
|
|
3201
|
+
if (_instance.numberOfWorkers) {
|
|
3202
|
+
_writer.writeInt32(7, _instance.numberOfWorkers);
|
|
3203
|
+
}
|
|
3204
|
+
}
|
|
3205
|
+
get parent() {
|
|
3206
|
+
return this._parent;
|
|
3207
|
+
}
|
|
3208
|
+
set parent(value) {
|
|
3209
|
+
this._parent = value;
|
|
3210
|
+
}
|
|
3211
|
+
get languageCode() {
|
|
3212
|
+
return this._languageCode;
|
|
3213
|
+
}
|
|
3214
|
+
set languageCode(value) {
|
|
3215
|
+
this._languageCode = value;
|
|
3216
|
+
}
|
|
3217
|
+
get csvContents() {
|
|
3218
|
+
return this._csvContents;
|
|
3219
|
+
}
|
|
3220
|
+
set csvContents(value) {
|
|
3221
|
+
this._csvContents = value;
|
|
3222
|
+
}
|
|
3223
|
+
get extractEntities() {
|
|
3224
|
+
return this._extractEntities;
|
|
3225
|
+
}
|
|
3226
|
+
set extractEntities(value) {
|
|
3227
|
+
this._extractEntities = value;
|
|
3228
|
+
}
|
|
3229
|
+
get specialCharacters() {
|
|
3230
|
+
return this._specialCharacters;
|
|
3231
|
+
}
|
|
3232
|
+
set specialCharacters(value) {
|
|
3233
|
+
this._specialCharacters = value;
|
|
3234
|
+
}
|
|
3235
|
+
get trainingPhraseCleanerOptions() {
|
|
3236
|
+
return this._trainingPhraseCleanerOptions;
|
|
3237
|
+
}
|
|
3238
|
+
set trainingPhraseCleanerOptions(value) {
|
|
3239
|
+
this._trainingPhraseCleanerOptions = value;
|
|
3240
|
+
}
|
|
3241
|
+
get numberOfWorkers() {
|
|
3242
|
+
return this._numberOfWorkers;
|
|
3243
|
+
}
|
|
3244
|
+
set numberOfWorkers(value) {
|
|
3245
|
+
this._numberOfWorkers = value;
|
|
3246
|
+
}
|
|
3247
|
+
/**
|
|
3248
|
+
* Serialize message to binary data
|
|
3249
|
+
* @param instance message instance
|
|
3250
|
+
*/
|
|
3251
|
+
serializeBinary() {
|
|
3252
|
+
const writer = new BinaryWriter();
|
|
3253
|
+
AddTrainingPhrasesFromCSVRequest.serializeBinaryToWriter(this, writer);
|
|
3254
|
+
return writer.getResultBuffer();
|
|
3255
|
+
}
|
|
3256
|
+
/**
|
|
3257
|
+
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
3258
|
+
*/
|
|
3259
|
+
toObject() {
|
|
3260
|
+
return {
|
|
3261
|
+
parent: this.parent,
|
|
3262
|
+
languageCode: this.languageCode,
|
|
3263
|
+
csvContents: this.csvContents
|
|
3264
|
+
? this.csvContents.subarray(0)
|
|
3265
|
+
: new Uint8Array(),
|
|
3266
|
+
extractEntities: this.extractEntities,
|
|
3267
|
+
specialCharacters: this.specialCharacters,
|
|
3268
|
+
trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
|
|
3269
|
+
? this.trainingPhraseCleanerOptions.toObject()
|
|
3270
|
+
: undefined,
|
|
3271
|
+
numberOfWorkers: this.numberOfWorkers
|
|
3272
|
+
};
|
|
3273
|
+
}
|
|
3274
|
+
/**
|
|
3275
|
+
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
3276
|
+
*/
|
|
3277
|
+
toJSON() {
|
|
3278
|
+
return this.toObject();
|
|
3279
|
+
}
|
|
3280
|
+
/**
|
|
3281
|
+
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
3282
|
+
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
3283
|
+
* If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
|
|
3284
|
+
*/
|
|
3285
|
+
toProtobufJSON(
|
|
3286
|
+
// @ts-ignore
|
|
3287
|
+
options) {
|
|
3288
|
+
return {
|
|
3289
|
+
parent: this.parent,
|
|
3290
|
+
languageCode: this.languageCode,
|
|
3291
|
+
csvContents: this.csvContents ? uint8ArrayToBase64(this.csvContents) : '',
|
|
3292
|
+
extractEntities: this.extractEntities,
|
|
3293
|
+
specialCharacters: this.specialCharacters,
|
|
3294
|
+
trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
|
|
3295
|
+
? this.trainingPhraseCleanerOptions.toProtobufJSON(options)
|
|
3296
|
+
: null,
|
|
3297
|
+
numberOfWorkers: this.numberOfWorkers
|
|
3298
|
+
};
|
|
3299
|
+
}
|
|
3300
|
+
}
|
|
3301
|
+
AddTrainingPhrasesFromCSVRequest.id = 'ondewo.nlu.AddTrainingPhrasesFromCSVRequest';
|
|
3302
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0eS5wYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2FwaS9vbmRld28vbmx1L3V0aWxpdHkucGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixjQUFjO0FBQ2QsRUFBRTtBQUNGLDJCQUEyQjtBQUMzQiw4Q0FBOEM7QUFDOUMsT0FBTyxFQUlMLGtCQUFrQixFQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFTekUsT0FBTyxLQUFLLFlBQVksTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEtBQUssWUFBWSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE1BQU0sQ0FBTixJQUFZLHlCQU1YO0FBTkQsV0FBWSx5QkFBeUI7SUFDbkMsaUdBQW9CLENBQUE7SUFDcEIsbUdBQXFCLENBQUE7SUFDckIsdUdBQXVCLENBQUE7SUFDdkIsbUhBQTZCLENBQUE7SUFDN0IsMklBQXlDLENBQUE7QUFDM0MsQ0FBQyxFQU5XLHlCQUF5QixLQUF6Qix5QkFBeUIsUUFNcEM7QUFDRDs7R0FFRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7SUFnRS9COzs7T0FHRztJQUNILFlBQVksTUFBd0Q7UUFDbEUsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzFCLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBckVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFpQjtRQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDNUMsb0JBQW9CLENBQUMsMkJBQTJCLENBQzlDLFFBQVEsRUFDUixJQUFJLFlBQVksQ0FBQyxL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QWUsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNyQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3pDLDRCQUE0QixFQUFFLElBQUksQ0FBQyw0QkFBNEI7Z0JBQzdELENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsUUFBUSxFQUFFO2dCQUM5QyxDQUFDLENBQUMsU0FBUztZQUNiLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtTQUN0QyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYztJQUNaLGFBQWE7SUFDYixPQUErQjtRQUUvQixPQUFPO1lBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3pFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNyQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3pDLDRCQUE0QixFQUFFLElBQUksQ0FBQyw0QkFBNEI7Z0JBQzdELENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztnQkFDM0QsQ0FBQyxDQUFDLElBQUk7WUFDUixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7U0FDdEMsQ0FBQztJQUNKLENBQUM7O0FBaFBNLG1DQUFFLEdBQUcsNkNBQTZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8vIEB0cy1ub2NoZWNrXG4vL1xuLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFXG4vLyBETyBOT1QgTU9ESUZZIElUISBZT1VSIENIQU5HRVMgV0lMTCBCRSBMT1NUXG5pbXBvcnQge1xuICBHcnBjTWVzc2FnZSxcbiAgUmVjdXJzaXZlUGFydGlhbCxcbiAgVG9Qcm90b2J1ZkpTT05PcHRpb25zLFxuICB1aW50OEFycmF5VG9CYXNlNjRcbn0gZnJvbSAnQG5neC1ncnBjL2NvbW1vbic7XG5pbXBvcnQgeyBCaW5hcnlSZWFkZXIsIEJpbmFyeVdyaXRlciwgQnl0ZVNvdXJjZSB9IGZyb20gJ2dvb2dsZS1wcm90b2J1Zic7XG5pbXBvcnQgKiBhcyBnb29nbGVBcGkwMDAgZnJvbSAnLi4vLi4vZ29vZ2xlL2FwaS9hbm5vdGF0aW9ucy5wYic7XG5pbXBvcnQgKiBhcyBvbmRld29ObHUwMDEgZnJvbSAnLi4vLi4vb25kZXdvL25sdS9jb250ZXh0LnBiJztcbmltcG9ydCAqIGFzIG9uZGV3b05sdTAwMiBmcm9tICcuLi8uLi9vbmRld28vbmx1L2NvbW1vbi5wYic7XG5pbXBvcnQgKiBhcyBvbmRld29ObHUwMDMgZnJvbSAnLi4vLi4vb25kZXdvL25sdS9vcGVyYXRpb25zLnBiJztcbmltcG9ydCAqIGFzIGdvb2dsZVByb3RvYnVmMDA0IGZyb20gJ0BuZ3gtZ3JwYy93ZWxsLWtub3duLXR5cGVzJztcbmltcG9ydCAqIGFzIGdvb2dsZVByb3RvYnVmMDA1IGZyb20gJ0BuZ3gtZ3JwYy93ZWxsLWtub3duLXR5cGVzJztcbmltcG9ydCAqIGFzIGdvb2dsZVByb3RvYnVmMDA2IGZyb20gJ0BuZ3gtZ3JwYy93ZWxsLWtub3duLXR5cGVzJztcbmltcG9ydCAqIGFzIGdvb2dsZVByb3RvYnVmMDA3IGZyb20gJ0BuZ3gtZ3JwYy93ZWxsLWtub3duLXR5cGVzJztcbmltcG9ydCAqIGFzIG9uZGV3b05sdTAwOCBmcm9tICcuLi8uLi9vbmRld28vbmx1L2ludGVudC5wYic7XG5pbXBvcnQgKiBhcyBvbmRld29ObHUwMDkgZnJvbSAnLi4vLi4vb25kZXdvL25sdS9lbnRpdHktdHlwZS5wYic7XG5leHBvcnQgZW51bSBSZWFubm90YXRlRW50aXRpZXNPcHRpb25zIHtcbiAgUkVBTk5PVEFURV9ORVZFUiA9IDAsXG4gIFJFQU5OT1RBVEVfQUxXQVlTID0gMSxcbiAgUkVBTk5PVEFURV9JRl9FTVBUWSA9IDIsXG4gIFJFQU5OT1RBVEVfQUZURVJfREVMRVRJT04gPSAzLFxuICBSRUFOTk9UQVRFX0lGX0VNUFRZX09SX0FGVEVSX0RFTEVUSU9OID0gNFxufVxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LlZhbGlkYXRlUmVnZXhSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0ZVJlZ2V4UmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuVmFsaWRhdGVSZWdleFJlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBWYWxpZGF0ZVJlZ2V4UmVxdWVzdCgpO1xuICAgIFZhbGlkYXRlUmVnZXhSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogVmFsaWRhdGVSZWdleFJlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UucmVnZXggPSBfaW5zdGFuY2UucmVnZXggfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBWYWxpZGF0ZVJlZ2V4UmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UucmVnZXggPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFZhbGlkYXRlUmVnZXhSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogVmFsaWRhdGVSZWdleFJlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UucmVnZXgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnJlZ2V4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdleD86IHN0cmluZztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFZhbGlkYXRlUmVnZXhSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFZhbGlkYXRlUmVnZXhSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnJlZ2V4ID0gX3ZhbHVlLnJlZ2V4O1xuICAgIFZhbGlkYXRlUmVnZXhSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgcmVnZXgoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcmVnZXg7XG4gIH1cbiAgc2V0IHJlZ2V4KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9yZWdleCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFZhbGlkYXRlUmVnZXhSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFZhbGlkYXRlUmVnZXhSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVnZXg6IHRoaXMucmVnZXhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBWYWxpZGF0ZVJlZ2V4UmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZ2V4OiB0aGlzLnJlZ2V4XG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBWYWxpZGF0ZVJlZ2V4UmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgVmFsaWRhdGVSZWdleFJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHJlZ2V4Pzogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFZhbGlkYXRlUmVnZXhSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICByZWdleD86IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuVmFsaWRhdGVSZWdleFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0ZVJlZ2V4UmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LlZhbGlkYXRlUmVnZXhSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFZhbGlkYXRlUmVnZXhSZXNwb25zZSgpO1xuICAgIFZhbGlkYXRlUmVnZXhSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFZhbGlkYXRlUmVnZXhSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5lcnJvck1lc3NhZ2VzID0gX2luc3RhbmNlLmVycm9yTWVzc2FnZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBWYWxpZGF0ZVJlZ2V4UmVzcG9uc2UsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgKF9pbnN0YW5jZS5lcnJvck1lc3NhZ2VzID0gX2luc3RhbmNlLmVycm9yTWVzc2FnZXMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRTdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBWYWxpZGF0ZVJlZ2V4UmVzcG9uc2UucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBWYWxpZGF0ZVJlZ2V4UmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyAmJiBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZygxLCBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgVmFsaWRhdGVSZWdleFJlc3BvbnNlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFZhbGlkYXRlUmVnZXhSZXNwb25zZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5lcnJvck1lc3NhZ2VzID0gKF92YWx1ZS5lcnJvck1lc3NhZ2VzIHx8IFtdKS5zbGljZSgpO1xuICAgIFZhbGlkYXRlUmVnZXhSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVycm9yTWVzc2FnZXMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lcnJvck1lc3NhZ2VzO1xuICB9XG4gIHNldCBlcnJvck1lc3NhZ2VzKHZhbHVlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2Vycm9yTWVzc2FnZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBWYWxpZGF0ZVJlZ2V4UmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogVmFsaWRhdGVSZWdleFJlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JNZXNzYWdlczogKHRoaXMuZXJyb3JNZXNzYWdlcyB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFZhbGlkYXRlUmVnZXhSZXNwb25zZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yTWVzc2FnZXM6ICh0aGlzLmVycm9yTWVzc2FnZXMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFZhbGlkYXRlUmVnZXhSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgVmFsaWRhdGVSZWdleFJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBlcnJvck1lc3NhZ2VzPzogc3RyaW5nW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgVmFsaWRhdGVSZWdleFJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBlcnJvck1lc3NhZ2VzPzogc3RyaW5nW107XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LlZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LlZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0KCk7XG4gICAgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UuZW50aXR5VHlwZSA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlIHx8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGUgPSBuZXcgb25kZXdvTmx1MDA5LkVudGl0eVR5cGUuRW50aXR5KCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlLFxuICAgICAgICAgICAgb25kZXdvTmx1MDA5LkVudGl0eVR5cGUuRW50aXR5LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlUeXBlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGUgYXMgYW55LFxuICAgICAgICBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5FbnRpdHkuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZW50aXR5VHlwZT86IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLkVudGl0eTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8VmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdC5Bc09iamVjdD5cbiAgKSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuZW50aXR5VHlwZSA9IF92YWx1ZS5lbnRpdHlUeXBlXG4gICAgICA/IG5ldyBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5FbnRpdHkoX3ZhbHVlLmVudGl0eVR5cGUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgZW50aXR5VHlwZSgpOiBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5FbnRpdHkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlUeXBlO1xuICB9XG4gIHNldCBlbnRpdHlUeXBlKHZhbHVlOiBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5FbnRpdHkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbnRpdHlUeXBlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5VHlwZTogdGhpcy5lbnRpdHlUeXBlID8gdGhpcy5lbnRpdHlUeXBlLnRvT2JqZWN0KCkgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5VHlwZTogdGhpcy5lbnRpdHlUeXBlXG4gICAgICAgID8gdGhpcy5lbnRpdHlUeXBlLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbFxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZW50aXR5VHlwZT86IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLkVudGl0eS5Bc09iamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBlbnRpdHlUeXBlPzogb25kZXdvTmx1MDA5LkVudGl0eVR5cGUuRW50aXR5LkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlc3BvbnNlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5WYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlc3BvbnNlKCk7XG4gICAgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5lcnJvck1lc3NhZ2VzID0gX2luc3RhbmNlLmVycm9yTWVzc2FnZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAoX2luc3RhbmNlLmVycm9yTWVzc2FnZXMgPSBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIF9yZWFkZXIucmVhZFN0cmluZygpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyAmJiBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZygxLCBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8VmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2UuQXNPYmplY3Q+XG4gICkge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmVycm9yTWVzc2FnZXMgPSAoX3ZhbHVlLmVycm9yTWVzc2FnZXMgfHwgW10pLnNsaWNlKCk7XG4gICAgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2UucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBlcnJvck1lc3NhZ2VzKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JNZXNzYWdlcztcbiAgfVxuICBzZXQgZXJyb3JNZXNzYWdlcyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lcnJvck1lc3NhZ2VzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2UuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvck1lc3NhZ2VzOiAodGhpcy5lcnJvck1lc3NhZ2VzIHx8IFtdKS5zbGljZSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvck1lc3NhZ2VzOiAodGhpcy5lcnJvck1lc3NhZ2VzIHx8IFtdKS5zbGljZSgpXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGVycm9yTWVzc2FnZXM/OiBzdHJpbmdbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZXJyb3JNZXNzYWdlcz86IHN0cmluZ1tdO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5DbGVhbkFsbEludGVudHNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkFsbEludGVudHNSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5DbGVhbkFsbEludGVudHNSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ2xlYW5BbGxJbnRlbnRzUmVxdWVzdCgpO1xuICAgIENsZWFuQWxsSW50ZW50c1JlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBDbGVhbkFsbEludGVudHNSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnBhcmVudCA9IF9pbnN0YW5jZS5wYXJlbnQgfHwgJyc7XG4gICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgfHwgJyc7XG4gICAgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzID0gX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgPSBfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdO1xuICAgIF9pbnN0YW5jZS5kcnlSdW4gPSBfaW5zdGFuY2UuZHJ5UnVuIHx8IGZhbHNlO1xuICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID1cbiAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9XG4gICAgICBfaW5zdGFuY2UucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyB8fCAwO1xuICAgIF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMgPSBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDbGVhbkFsbEludGVudHNSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5wYXJlbnQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgKF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgPVxuICAgICAgICAgICAgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCB8fCBbXSkucHVzaChfcmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBfaW5zdGFuY2UuZHJ5UnVuID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgPSBuZXcgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucygpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyxcbiAgICAgICAgICAgIFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9pbnN0YW5jZS5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgX2luc3RhbmNlLm51bWJlck9mV29ya2VycyA9IF9yZWFkZXIucmVhZEludDMyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDbGVhbkFsbEludGVudHNSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5BbGxJbnRlbnRzUmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5wYXJlbnQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnBhcmVudCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDMsIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0ICYmIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoNCwgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZHJ5UnVuKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCg1LCBfaW5zdGFuY2UuZHJ5UnVuKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgNixcbiAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgYXMgYW55LFxuICAgICAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVFbnVtKDcsIF9pbnN0YW5jZS5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMig4LCBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2xhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfc3BlY2lhbENoYXJhY3RlcnM/OiBzdHJpbmc7XG4gIHByaXZhdGUgX3N1YnN0cmluZ1doaXRlTGlzdD86IHN0cmluZ1tdO1xuICBwcml2YXRlIF9kcnlSdW4/OiBib29sZWFuO1xuICBwcml2YXRlIF90cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zPzogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucztcbiAgcHJpdmF0ZSBfcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucz86IFJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM7XG4gIHByaXZhdGUgX251bWJlck9mV29ya2Vycz86IG51bWJlcjtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENsZWFuQWxsSW50ZW50c1JlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8Q2xlYW5BbGxJbnRlbnRzUmVxdWVzdC5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5wYXJlbnQgPSBfdmFsdWUucGFyZW50O1xuICAgIHRoaXMubGFuZ3VhZ2VDb2RlID0gX3ZhbHVlLmxhbmd1YWdlQ29kZTtcbiAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzID0gX3ZhbHVlLnNwZWNpYWxDaGFyYWN0ZXJzO1xuICAgIHRoaXMuc3Vic3RyaW5nV2hpdGVMaXN0ID0gKF92YWx1ZS5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW10pLnNsaWNlKCk7XG4gICAgdGhpcy5kcnlSdW4gPSBfdmFsdWUuZHJ5UnVuO1xuICAgIHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyA9IF92YWx1ZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zXG4gICAgICA/IG5ldyBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKF92YWx1ZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zID0gX3ZhbHVlLnJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM7XG4gICAgdGhpcy5udW1iZXJPZldvcmtlcnMgPSBfdmFsdWUubnVtYmVyT2ZXb3JrZXJzO1xuICAgIENsZWFuQWxsSW50ZW50c1JlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBwYXJlbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICB9XG4gIHNldCBwYXJlbnQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhcmVudCA9IHZhbHVlO1xuICB9XG4gIGdldCBsYW5ndWFnZUNvZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VDb2RlO1xuICB9XG4gIHNldCBsYW5ndWFnZUNvZGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2xhbmd1YWdlQ29kZSA9IHZhbHVlO1xuICB9XG4gIGdldCBzcGVjaWFsQ2hhcmFjdGVycygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zcGVjaWFsQ2hhcmFjdGVycztcbiAgfVxuICBzZXQgc3BlY2lhbENoYXJhY3RlcnModmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3NwZWNpYWxDaGFyYWN0ZXJzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHN1YnN0cmluZ1doaXRlTGlzdCgpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnN0cmluZ1doaXRlTGlzdDtcbiAgfVxuICBzZXQgc3Vic3RyaW5nV2hpdGVMaXN0KHZhbHVlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3N1YnN0cmluZ1doaXRlTGlzdCA9IHZhbHVlO1xuICB9XG4gIGdldCBkcnlSdW4oKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RyeVJ1bjtcbiAgfVxuICBzZXQgZHJ5UnVuKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZHJ5UnVuID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoKTogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM7XG4gIH1cbiAgc2V0IHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoXG4gICAgdmFsdWU6IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyA9IHZhbHVlO1xuICB9XG4gIGdldCByZWFubm90YXRlRW50aXRpZXNPcHRpb25zKCk6IFJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZWFubm90YXRlRW50aXRpZXNPcHRpb25zO1xuICB9XG4gIHNldCByZWFubm90YXRlRW50aXRpZXNPcHRpb25zKHZhbHVlOiBSZWFubm90YXRlRW50aXRpZXNPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9IHZhbHVlO1xuICB9XG4gIGdldCBudW1iZXJPZldvcmtlcnMoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZXb3JrZXJzO1xuICB9XG4gIHNldCBudW1iZXJPZldvcmtlcnModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX251bWJlck9mV29ya2VycyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENsZWFuQWxsSW50ZW50c1JlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogQ2xlYW5BbGxJbnRlbnRzUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQsXG4gICAgICBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlLFxuICAgICAgc3BlY2lhbENoYXJhY3RlcnM6IHRoaXMuc3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICBzdWJzdHJpbmdXaGl0ZUxpc3Q6ICh0aGlzLnN1YnN0cmluZ1doaXRlTGlzdCB8fCBbXSkuc2xpY2UoKSxcbiAgICAgIGRyeVJ1bjogdGhpcy5kcnlSdW4sXG4gICAgICB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zOiB0aGlzLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnNcbiAgICAgICAgPyB0aGlzLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMudG9PYmplY3QoKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM6IHRoaXMucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyxcbiAgICAgIG51bWJlck9mV29ya2VyczogdGhpcy5udW1iZXJPZldvcmtlcnNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBDbGVhbkFsbEludGVudHNSZXF1ZXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBzcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIHN1YnN0cmluZ1doaXRlTGlzdDogKHRoaXMuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdKS5zbGljZSgpLFxuICAgICAgZHJ5UnVuOiB0aGlzLmRyeVJ1bixcbiAgICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM6IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICAgICAgICA/IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGwsXG4gICAgICByZWFubm90YXRlRW50aXRpZXNPcHRpb25zOlxuICAgICAgICBSZWFubm90YXRlRW50aXRpZXNPcHRpb25zW1xuICAgICAgICAgIHRoaXMucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9PT0gbnVsbCB8fFxuICAgICAgICAgIHRoaXMucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogdGhpcy5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zXG4gICAgICAgIF0sXG4gICAgICBudW1iZXJPZldvcmtlcnM6IHRoaXMubnVtYmVyT2ZXb3JrZXJzXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBDbGVhbkFsbEludGVudHNSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkFsbEludGVudHNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICAgIHNwZWNpYWxDaGFyYWN0ZXJzPzogc3RyaW5nO1xuICAgIHN1YnN0cmluZ1doaXRlTGlzdD86IHN0cmluZ1tdO1xuICAgIGRyeVJ1bj86IGJvb2xlYW47XG4gICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucz86IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMuQXNPYmplY3Q7XG4gICAgcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucz86IFJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM7XG4gICAgbnVtYmVyT2ZXb3JrZXJzPzogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIENsZWFuQWxsSW50ZW50c1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHBhcmVudD86IHN0cmluZztcbiAgICBsYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gICAgc3BlY2lhbENoYXJhY3RlcnM/OiBzdHJpbmc7XG4gICAgc3Vic3RyaW5nV2hpdGVMaXN0Pzogc3RyaW5nW107XG4gICAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgICB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zPzogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucz86IHN0cmluZztcbiAgICBudW1iZXJPZldvcmtlcnM/OiBudW1iZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkNsZWFuQWxsSW50ZW50c1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkFsbEludGVudHNSZXNwb25zZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQ2xlYW5BbGxJbnRlbnRzUmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDbGVhbkFsbEludGVudHNSZXNwb25zZSgpO1xuICAgIENsZWFuQWxsSW50ZW50c1Jlc3BvbnNlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ2xlYW5BbGxJbnRlbnRzUmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2UuY2xlYW5lZEludGVudHMgPSBfaW5zdGFuY2UuY2xlYW5lZEludGVudHMgfHwgW107XG4gICAgX2luc3RhbmNlLmludGVudFVwZGF0ZUxpc3QgPSBfaW5zdGFuY2UuaW50ZW50VXBkYXRlTGlzdCB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IENsZWFuQWxsSW50ZW50c1Jlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjEgPSBuZXcgb25kZXdvTmx1MDA4LkludGVudCgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIxLFxuICAgICAgICAgICAgb25kZXdvTmx1MDA4LkludGVudC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UuY2xlYW5lZEludGVudHMgPSBfaW5zdGFuY2UuY2xlYW5lZEludGVudHMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIxXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjIgPSBuZXcgSW50ZW50VXBkYXRlKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjIsXG4gICAgICAgICAgICBJbnRlbnRVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICAoX2luc3RhbmNlLmludGVudFVwZGF0ZUxpc3QgPSBfaW5zdGFuY2UuaW50ZW50VXBkYXRlTGlzdCB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQ2xlYW5BbGxJbnRlbnRzUmVzcG9uc2UucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBDbGVhbkFsbEludGVudHNSZXNwb25zZSxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50cyAmJiBfaW5zdGFuY2UuY2xlYW5lZEludGVudHMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgICAxLFxuICAgICAgICBfaW5zdGFuY2UuY2xlYW5lZEludGVudHMgYXMgYW55LFxuICAgICAgICBvbmRld29ObHUwMDguSW50ZW50LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmludGVudFVwZGF0ZUxpc3QgJiYgX2luc3RhbmNlLmludGVudFVwZGF0ZUxpc3QubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgICAyLFxuICAgICAgICBfaW5zdGFuY2UuaW50ZW50VXBkYXRlTGlzdCBhcyBhbnksXG4gICAgICAgIEludGVudFVwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbmVkSW50ZW50cz86IG9uZGV3b05sdTAwOC5JbnRlbnRbXTtcbiAgcHJpdmF0ZSBfaW50ZW50VXBkYXRlTGlzdD86IEludGVudFVwZGF0ZVtdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQ2xlYW5BbGxJbnRlbnRzUmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8Q2xlYW5BbGxJbnRlbnRzUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuY2xlYW5lZEludGVudHMgPSAoX3ZhbHVlLmNsZWFuZWRJbnRlbnRzIHx8IFtdKS5tYXAoXG4gICAgICBtID0+IG5ldyBvbmRld29ObHUwMDguSW50ZW50KG0pXG4gICAgKTtcbiAgICB0aGlzLmludGVudFVwZGF0ZUxpc3QgPSAoX3ZhbHVlLmludGVudFVwZGF0ZUxpc3QgfHwgW10pLm1hcChcbiAgICAgIG0gPT4gbmV3IEludGVudFVwZGF0ZShtKVxuICAgICk7XG4gICAgQ2xlYW5BbGxJbnRlbnRzUmVzcG9uc2UucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBjbGVhbmVkSW50ZW50cygpOiBvbmRld29ObHUwMDguSW50ZW50W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jbGVhbmVkSW50ZW50cztcbiAgfVxuICBzZXQgY2xlYW5lZEludGVudHModmFsdWU6IG9uZGV3b05sdTAwOC5JbnRlbnRbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NsZWFuZWRJbnRlbnRzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGludGVudFVwZGF0ZUxpc3QoKTogSW50ZW50VXBkYXRlW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbnRlbnRVcGRhdGVMaXN0O1xuICB9XG4gIHNldCBpbnRlbnRVcGRhdGVMaXN0KHZhbHVlOiBJbnRlbnRVcGRhdGVbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2ludGVudFVwZGF0ZUxpc3QgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBDbGVhbkFsbEludGVudHNSZXNwb25zZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBDbGVhbkFsbEludGVudHNSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsZWFuZWRJbnRlbnRzOiAodGhpcy5jbGVhbmVkSW50ZW50cyB8fCBbXSkubWFwKG0gPT4gbS50b09iamVjdCgpKSxcbiAgICAgIGludGVudFVwZGF0ZUxpc3Q6ICh0aGlzLmludGVudFVwZGF0ZUxpc3QgfHwgW10pLm1hcChtID0+IG0udG9PYmplY3QoKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBDbGVhbkFsbEludGVudHNSZXNwb25zZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsZWFuZWRJbnRlbnRzOiAodGhpcy5jbGVhbmVkSW50ZW50cyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgKSxcbiAgICAgIGludGVudFVwZGF0ZUxpc3Q6ICh0aGlzLmludGVudFVwZGF0ZUxpc3QgfHwgW10pLm1hcChtID0+XG4gICAgICAgIG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgIClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENsZWFuQWxsSW50ZW50c1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkFsbEludGVudHNSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgY2xlYW5lZEludGVudHM/OiBvbmRld29ObHUwMDguSW50ZW50LkFzT2JqZWN0W107XG4gICAgaW50ZW50VXBkYXRlTGlzdD86IEludGVudFVwZGF0ZS5Bc09iamVjdFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIENsZWFuQWxsSW50ZW50c1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBjbGVhbmVkSW50ZW50cz86IG9uZGV3b05sdTAwOC5JbnRlbnQuQXNQcm90b2J1ZkpTT05bXSB8IG51bGw7XG4gICAgaW50ZW50VXBkYXRlTGlzdD86IEludGVudFVwZGF0ZS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuQ2xlYW5JbnRlbnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkludGVudFJlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkNsZWFuSW50ZW50UmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENsZWFuSW50ZW50UmVxdWVzdCgpO1xuICAgIENsZWFuSW50ZW50UmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IENsZWFuSW50ZW50UmVxdWVzdCkge1xuICAgIF9pbnN0YW5jZS5wYXJlbnQgPSBfaW5zdGFuY2UucGFyZW50IHx8ICcnO1xuICAgIF9pbnN0YW5jZS5pbnRlbnROYW1lID0gX2luc3RhbmNlLmludGVudE5hbWUgfHwgJyc7XG4gICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgfHwgJyc7XG4gICAgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzID0gX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgPSBfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdO1xuICAgIF9pbnN0YW5jZS5kcnlSdW4gPSBfaW5zdGFuY2UuZHJ5UnVuIHx8IGZhbHNlO1xuICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID1cbiAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9XG4gICAgICBfaW5zdGFuY2UucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5JbnRlbnRSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5wYXJlbnQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5pbnRlbnROYW1lID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIChfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0ID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW10pLnB1c2goX3JlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2luc3RhbmNlLmRyeVJ1biA9IF9yZWFkZXIucmVhZEJvb2woKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID0gbmV3IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMsXG4gICAgICAgICAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBfaW5zdGFuY2UucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIENsZWFuSW50ZW50UmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENsZWFuSW50ZW50UmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5wYXJlbnQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnBhcmVudCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuaW50ZW50TmFtZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyLCBfaW5zdGFuY2UuaW50ZW50TmFtZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDMsIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDQsIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0ICYmIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoNSwgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZHJ5UnVuKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCg2LCBfaW5zdGFuY2UuZHJ5UnVuKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgNyxcbiAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgYXMgYW55LFxuICAgICAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVFbnVtKDgsIF9pbnN0YW5jZS5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2ludGVudE5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2xhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfc3BlY2lhbENoYXJhY3RlcnM/OiBzdHJpbmc7XG4gIHByaXZhdGUgX3N1YnN0cmluZ1doaXRlTGlzdD86IHN0cmluZ1tdO1xuICBwcml2YXRlIF9kcnlSdW4/OiBib29sZWFuO1xuICBwcml2YXRlIF90cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zPzogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucztcbiAgcHJpdmF0ZSBfcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucz86IFJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBDbGVhbkludGVudFJlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8Q2xlYW5JbnRlbnRSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnBhcmVudCA9IF92YWx1ZS5wYXJlbnQ7XG4gICAgdGhpcy5pbnRlbnROYW1lID0gX3ZhbHVlLmludGVudE5hbWU7XG4gICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBfdmFsdWUubGFuZ3VhZ2VDb2RlO1xuICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMgPSBfdmFsdWUuc3BlY2lhbENoYXJhY3RlcnM7XG4gICAgdGhpcy5zdWJzdHJpbmdXaGl0ZUxpc3QgPSAoX3ZhbHVlLnN1YnN0cmluZ1doaXRlTGlzdCB8fCBbXSkuc2xpY2UoKTtcbiAgICB0aGlzLmRyeVJ1biA9IF92YWx1ZS5kcnlSdW47XG4gICAgdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID0gX3ZhbHVlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnNcbiAgICAgID8gbmV3IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoX3ZhbHVlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnMgPSBfdmFsdWUucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucztcbiAgICBDbGVhbkludGVudFJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBwYXJlbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICB9XG4gIHNldCBwYXJlbnQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhcmVudCA9IHZhbHVlO1xuICB9XG4gIGdldCBpbnRlbnROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVudE5hbWU7XG4gIH1cbiAgc2V0IGludGVudE5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2ludGVudE5hbWUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbGFuZ3VhZ2VDb2RlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlQ29kZTtcbiAgfVxuICBzZXQgbGFuZ3VhZ2VDb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9sYW5ndWFnZUNvZGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3BlY2lhbENoYXJhY3RlcnMoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3BlY2lhbENoYXJhY3RlcnM7XG4gIH1cbiAgc2V0IHNwZWNpYWxDaGFyYWN0ZXJzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zcGVjaWFsQ2hhcmFjdGVycyA9IHZhbHVlO1xuICB9XG4gIGdldCBzdWJzdHJpbmdXaGl0ZUxpc3QoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zdWJzdHJpbmdXaGl0ZUxpc3Q7XG4gIH1cbiAgc2V0IHN1YnN0cmluZ1doaXRlTGlzdCh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zdWJzdHJpbmdXaGl0ZUxpc3QgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZHJ5UnVuKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kcnlSdW47XG4gIH1cbiAgc2V0IGRyeVJ1bih2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2RyeVJ1biA9IHZhbHVlO1xuICB9XG4gIGdldCB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKCk6IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zO1xuICB9XG4gIHNldCB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKFxuICAgIHZhbHVlOiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX3RyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucygpOiBSZWFubm90YXRlRW50aXRpZXNPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucztcbiAgfVxuICBzZXQgcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyh2YWx1ZTogUmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3JlYW5ub3RhdGVFbnRpdGllc09wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBDbGVhbkludGVudFJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogQ2xlYW5JbnRlbnRSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGludGVudE5hbWU6IHRoaXMuaW50ZW50TmFtZSxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBzcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIHN1YnN0cmluZ1doaXRlTGlzdDogKHRoaXMuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdKS5zbGljZSgpLFxuICAgICAgZHJ5UnVuOiB0aGlzLmRyeVJ1bixcbiAgICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM6IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICAgICAgICA/IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy50b09iamVjdCgpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9uczogdGhpcy5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ2xlYW5JbnRlbnRSZXF1ZXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGludGVudE5hbWU6IHRoaXMuaW50ZW50TmFtZSxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBzcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIHN1YnN0cmluZ1doaXRlTGlzdDogKHRoaXMuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdKS5zbGljZSgpLFxuICAgICAgZHJ5UnVuOiB0aGlzLmRyeVJ1bixcbiAgICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM6IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICAgICAgICA/IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGwsXG4gICAgICByZWFubm90YXRlRW50aXRpZXNPcHRpb25zOlxuICAgICAgICBSZWFubm90YXRlRW50aXRpZXNPcHRpb25zW1xuICAgICAgICAgIHRoaXMucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9PT0gbnVsbCB8fFxuICAgICAgICAgIHRoaXMucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogdGhpcy5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zXG4gICAgICAgIF1cbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENsZWFuSW50ZW50UmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQ2xlYW5JbnRlbnRSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgaW50ZW50TmFtZT86IHN0cmluZztcbiAgICBsYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gICAgc3BlY2lhbENoYXJhY3RlcnM/OiBzdHJpbmc7XG4gICAgc3Vic3RyaW5nV2hpdGVMaXN0Pzogc3RyaW5nW107XG4gICAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgICB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zPzogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy5Bc09iamVjdDtcbiAgICByZWFubm90YXRlRW50aXRpZXNPcHRpb25zPzogUmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkludGVudFJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHBhcmVudD86IHN0cmluZztcbiAgICBpbnRlbnROYW1lPzogc3RyaW5nO1xuICAgIGxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICBzcGVjaWFsQ2hhcmFjdGVycz86IHN0cmluZztcbiAgICBzdWJzdHJpbmdXaGl0ZUxpc3Q/OiBzdHJpbmdbXTtcbiAgICBkcnlSdW4/OiBib29sZWFuO1xuICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM/OiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICByZWFubm90YXRlRW50aXRpZXNPcHRpb25zPzogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5DbGVhbkludGVudFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkludGVudFJlc3BvbnNlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5DbGVhbkludGVudFJlc3BvbnNlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ2xlYW5JbnRlbnRSZXNwb25zZSgpO1xuICAgIENsZWFuSW50ZW50UmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBDbGVhbkludGVudFJlc3BvbnNlKSB7XG4gICAgX2luc3RhbmNlLmNsZWFuZWRJbnRlbnQgPSBfaW5zdGFuY2UuY2xlYW5lZEludGVudCB8fCB1bmRlZmluZWQ7XG4gICAgX2luc3RhbmNlLmludGVudFVwZGF0ZSA9IF9pbnN0YW5jZS5pbnRlbnRVcGRhdGUgfHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5JbnRlbnRSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UuY2xlYW5lZEludGVudCA9IG5ldyBvbmRld29ObHUwMDguSW50ZW50KCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50LFxuICAgICAgICAgICAgb25kZXdvTmx1MDA4LkludGVudC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLmludGVudFVwZGF0ZSA9IG5ldyBJbnRlbnRVcGRhdGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLmludGVudFVwZGF0ZSxcbiAgICAgICAgICAgIEludGVudFVwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQ2xlYW5JbnRlbnRSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENsZWFuSW50ZW50UmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuY2xlYW5lZEludGVudCkge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50IGFzIGFueSxcbiAgICAgICAgb25kZXdvTmx1MDA4LkludGVudC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5pbnRlbnRVcGRhdGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAyLFxuICAgICAgICBfaW5zdGFuY2UuaW50ZW50VXBkYXRlIGFzIGFueSxcbiAgICAgICAgSW50ZW50VXBkYXRlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFuZWRJbnRlbnQ/OiBvbmRld29ObHUwMDguSW50ZW50O1xuICBwcml2YXRlIF9pbnRlbnRVcGRhdGU/OiBJbnRlbnRVcGRhdGU7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBDbGVhbkludGVudFJlc3BvbnNlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPENsZWFuSW50ZW50UmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuY2xlYW5lZEludGVudCA9IF92YWx1ZS5jbGVhbmVkSW50ZW50XG4gICAgICA/IG5ldyBvbmRld29ObHUwMDguSW50ZW50KF92YWx1ZS5jbGVhbmVkSW50ZW50KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5pbnRlbnRVcGRhdGUgPSBfdmFsdWUuaW50ZW50VXBkYXRlXG4gICAgICA/IG5ldyBJbnRlbnRVcGRhdGUoX3ZhbHVlLmludGVudFVwZGF0ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIENsZWFuSW50ZW50UmVzcG9uc2UucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBjbGVhbmVkSW50ZW50KCk6IG9uZGV3b05sdTAwOC5JbnRlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jbGVhbmVkSW50ZW50O1xuICB9XG4gIHNldCBjbGVhbmVkSW50ZW50KHZhbHVlOiBvbmRld29ObHUwMDguSW50ZW50IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY2xlYW5lZEludGVudCA9IHZhbHVlO1xuICB9XG4gIGdldCBpbnRlbnRVcGRhdGUoKTogSW50ZW50VXBkYXRlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZW50VXBkYXRlO1xuICB9XG4gIHNldCBpbnRlbnRVcGRhdGUodmFsdWU6IEludGVudFVwZGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2ludGVudFVwZGF0ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENsZWFuSW50ZW50UmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogQ2xlYW5JbnRlbnRSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsZWFuZWRJbnRlbnQ6IHRoaXMuY2xlYW5lZEludGVudFxuICAgICAgICA/IHRoaXMuY2xlYW5lZEludGVudC50b09iamVjdCgpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW50ZW50VXBkYXRlOiB0aGlzLmludGVudFVwZGF0ZSA/IHRoaXMuaW50ZW50VXBkYXRlLnRvT2JqZWN0KCkgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBDbGVhbkludGVudFJlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xlYW5lZEludGVudDogdGhpcy5jbGVhbmVkSW50ZW50XG4gICAgICAgID8gdGhpcy5jbGVhbmVkSW50ZW50LnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIGludGVudFVwZGF0ZTogdGhpcy5pbnRlbnRVcGRhdGVcbiAgICAgICAgPyB0aGlzLmludGVudFVwZGF0ZS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENsZWFuSW50ZW50UmVzcG9uc2Uge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENsZWFuSW50ZW50UmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGNsZWFuZWRJbnRlbnQ/OiBvbmRld29ObHUwMDguSW50ZW50LkFzT2JqZWN0O1xuICAgIGludGVudFVwZGF0ZT86IEludGVudFVwZGF0ZS5Bc09iamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkludGVudFJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBjbGVhbmVkSW50ZW50Pzogb25kZXdvTmx1MDA4LkludGVudC5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgaW50ZW50VXBkYXRlPzogSW50ZW50VXBkYXRlLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoKTtcbiAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucykge1xuICAgIF9pbnN0YW5jZS5kZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzID1cbiAgICAgIF9pbnN0YW5jZS5kZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzIHx8IGZhbHNlO1xuICAgIF9pbnN0YW5jZS5kZWxldGVMZWFkaW5nU3BlY2lhbENoYXJhY3RlcnMgPVxuICAgICAgX2luc3RhbmNlLmRlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVycyB8fCBmYWxzZTtcbiAgICBfaW5zdGFuY2UuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycyA9XG4gICAgICBfaW5zdGFuY2UuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycyB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLmRlbGV0ZVJlcGVhdGVkV2hpdGVzcGFjZXMgPSBfcmVhZGVyLnJlYWRCb29sKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UuZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgX2luc3RhbmNlLmRlbGV0ZVRyYWlsaW5nU3BlY2lhbENoYXJhY3RlcnMgPSBfcmVhZGVyLnJlYWRCb29sKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5kZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCgxLCBfaW5zdGFuY2UuZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCgyLCBfaW5zdGFuY2UuZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5kZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCgzLCBfaW5zdGFuY2UuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcz86IGJvb2xlYW47XG4gIHByaXZhdGUgX2RlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVycz86IGJvb2xlYW47XG4gIHByaXZhdGUgX2RlbGV0ZVRyYWlsaW5nU3BlY2lhbENoYXJhY3RlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLkFzT2JqZWN0PlxuICApIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5kZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzID0gX3ZhbHVlLmRlbGV0ZVJlcGVhdGVkV2hpdGVzcGFjZXM7XG4gICAgdGhpcy5kZWxldGVMZWFkaW5nU3BlY2lhbENoYXJhY3RlcnMgPSBfdmFsdWUuZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzO1xuICAgIHRoaXMuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycyA9XG4gICAgICBfdmFsdWUuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycztcbiAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcztcbiAgfVxuICBzZXQgZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcyh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2RlbGV0ZVJlcGVhdGVkV2hpdGVzcGFjZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kZWxldGVMZWFkaW5nU3BlY2lhbENoYXJhY3RlcnM7XG4gIH1cbiAgc2V0IGRlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVycyh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2RlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVycyA9IHZhbHVlO1xuICB9XG4gIGdldCBkZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzO1xuICB9XG4gIHNldCBkZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlbGV0ZVJlcGVhdGVkV2hpdGVzcGFjZXM6IHRoaXMuZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcyxcbiAgICAgIGRlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5kZWxldGVMZWFkaW5nU3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICBkZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzOiB0aGlzLmRlbGV0ZVRyYWlsaW5nU3BlY2lhbENoYXJhY3RlcnNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlczogdGhpcy5kZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzLFxuICAgICAgZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzOiB0aGlzLmRlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIGRlbGV0ZVRyYWlsaW5nU3BlY2lhbENoYXJhY3RlcnM6IHRoaXMuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVyc1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcz86IGJvb2xlYW47XG4gICAgZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzPzogYm9vbGVhbjtcbiAgICBkZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzPzogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBkZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzPzogYm9vbGVhbjtcbiAgICBkZWxldGVMZWFkaW5nU3BlY2lhbENoYXJhY3RlcnM/OiBib29sZWFuO1xuICAgIGRlbGV0ZVRyYWlsaW5nU3BlY2lhbENoYXJhY3RlcnM/OiBib29sZWFuO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5TdHJpbmdVcGRhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmluZ1VwZGF0ZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuU3RyaW5nVXBkYXRlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgU3RyaW5nVXBkYXRlKCk7XG4gICAgU3RyaW5nVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihpbnN0YW5jZSwgbmV3IEJpbmFyeVJlYWRlcihieXRlcykpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogU3RyaW5nVXBkYXRlKSB7XG4gICAgX2luc3RhbmNlLm5ldyA9IF9pbnN0YW5jZS5uZXcgfHwgJyc7XG4gICAgX2luc3RhbmNlLm9sZCA9IF9pbnN0YW5jZS5vbGQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBTdHJpbmdVcGRhdGUsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLm5ldyA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLm9sZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgU3RyaW5nVXBkYXRlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogU3RyaW5nVXBkYXRlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLm5ldykge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UubmV3KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5vbGQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLm9sZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbmV3Pzogc3RyaW5nO1xuICBwcml2YXRlIF9vbGQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBTdHJpbmdVcGRhdGUgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8U3RyaW5nVXBkYXRlLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLm5ldyA9IF92YWx1ZS5uZXc7XG4gICAgdGhpcy5vbGQgPSBfdmFsdWUub2xkO1xuICAgIFN0cmluZ1VwZGF0ZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IG5ldygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9uZXc7XG4gIH1cbiAgc2V0IG5ldyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbmV3ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IG9sZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9vbGQ7XG4gIH1cbiAgc2V0IG9sZCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fb2xkID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgU3RyaW5nVXBkYXRlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFN0cmluZ1VwZGF0ZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5ldzogdGhpcy5uZXcsXG4gICAgICBvbGQ6IHRoaXMub2xkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogU3RyaW5nVXBkYXRlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmV3OiB0aGlzLm5ldyxcbiAgICAgIG9sZDogdGhpcy5vbGRcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFN0cmluZ1VwZGF0ZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgU3RyaW5nVXBkYXRlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBuZXc/OiBzdHJpbmc7XG4gICAgb2xkPzogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFN0cmluZ1VwZGF0ZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgbmV3Pzogc3RyaW5nO1xuICAgIG9sZD86IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuSW50ZW50VXBkYXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlbnRVcGRhdGUgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkludGVudFVwZGF0ZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEludGVudFVwZGF0ZSgpO1xuICAgIEludGVudFVwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoaW5zdGFuY2UsIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEludGVudFVwZGF0ZSkge1xuICAgIF9pbnN0YW5jZS5pbnRlbnREaXNwbGF5TmFtZSA9IF9pbnN0YW5jZS5pbnRlbnREaXNwbGF5TmFtZSB8fCAnJztcbiAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0ID1cbiAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3QgfHwgW107XG4gICAgX2luc3RhbmNlLmRlbGV0ZWRQYXJhbWV0ZXJzID0gX2luc3RhbmNlLmRlbGV0ZWRQYXJhbWV0ZXJzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogSW50ZW50VXBkYXRlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5pbnRlbnREaXNwbGF5TmFtZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMiA9IG5ldyBJbnRlbnRVcGRhdGUuVHJhaW5pbmdQaHJhc2VVcGRhdGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMixcbiAgICAgICAgICAgIEludGVudFVwZGF0ZS5UcmFpbmluZ1BocmFzZVVwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0ID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3QgfHwgW10pLnB1c2gobWVzc2FnZUluaXRpYWxpemVyMik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAoX2luc3RhbmNlLmRlbGV0ZWRQYXJhbWV0ZXJzID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5kZWxldGVkUGFyYW1ldGVycyB8fCBbXSkucHVzaChfcmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBJbnRlbnRVcGRhdGUucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBJbnRlbnRVcGRhdGUsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuaW50ZW50RGlzcGxheU5hbWUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLmludGVudERpc3BsYXlOYW1lKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdCAmJlxuICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdC5sZW5ndGhcbiAgICApIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDIsXG4gICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3QgYXMgYW55LFxuICAgICAgICBJbnRlbnRVcGRhdGUuVHJhaW5pbmdQaHJhc2VVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZGVsZXRlZFBhcmFtZXRlcnMgJiYgX2luc3RhbmNlLmRlbGV0ZWRQYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkU3RyaW5nKDMsIF9pbnN0YW5jZS5kZWxldGVkUGFyYW1ldGVycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaW50ZW50RGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX3RyYWluaW5nUGhyYXNlVXBkYXRlTGlzdD86IEludGVudFVwZGF0ZS5UcmFpbmluZ1BocmFzZVVwZGF0ZVtdO1xuICBwcml2YXRlIF9kZWxldGVkUGFyYW1ldGVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgSW50ZW50VXBkYXRlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPEludGVudFVwZGF0ZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5pbnRlbnREaXNwbGF5TmFtZSA9IF92YWx1ZS5pbnRlbnREaXNwbGF5TmFtZTtcbiAgICB0aGlzLnRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdCA9IChfdmFsdWUudHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0IHx8IFtdKS5tYXAoXG4gICAgICBtID0+IG5ldyBJbnRlbnRVcGRhdGUuVHJhaW5pbmdQaHJhc2VVcGRhdGUobSlcbiAgICApO1xuICAgIHRoaXMuZGVsZXRlZFBhcmFtZXRlcnMgPSAoX3ZhbHVlLmRlbGV0ZWRQYXJhbWV0ZXJzIHx8IFtdKS5zbGljZSgpO1xuICAgIEludGVudFVwZGF0ZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGludGVudERpc3BsYXlOYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVudERpc3BsYXlOYW1lO1xuICB9XG4gIHNldCBpbnRlbnREaXNwbGF5TmFtZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5faW50ZW50RGlzcGxheU5hbWUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgdHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0KCk6XG4gICAgfCBJbnRlbnRVcGRhdGUuVHJhaW5pbmdQaHJhc2VVcGRhdGVbXVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0O1xuICB9XG4gIHNldCB0cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3QoXG4gICAgdmFsdWU6IEludGVudFVwZGF0ZS5UcmFpbmluZ1BocmFzZVVwZGF0ZVtdIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX3RyYWluaW5nUGhyYXNlVXBkYXRlTGlzdCA9IHZhbHVlO1xuICB9XG4gIGdldCBkZWxldGVkUGFyYW1ldGVycygpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RlbGV0ZWRQYXJhbWV0ZXJzO1xuICB9XG4gIHNldCBkZWxldGVkUGFyYW1ldGVycyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9kZWxldGVkUGFyYW1ldGVycyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIEludGVudFVwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBJbnRlbnRVcGRhdGUuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBpbnRlbnREaXNwbGF5TmFtZTogdGhpcy5pbnRlbnREaXNwbGF5TmFtZSxcbiAgICAgIHRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdDogKHRoaXMudHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0IHx8IFtdKS5tYXAobSA9PlxuICAgICAgICBtLnRvT2JqZWN0KClcbiAgICAgICksXG4gICAgICBkZWxldGVkUGFyYW1ldGVyczogKHRoaXMuZGVsZXRlZFBhcmFtZXRlcnMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBJbnRlbnRVcGRhdGUuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBpbnRlbnREaXNwbGF5TmFtZTogdGhpcy5pbnRlbnREaXNwbGF5TmFtZSxcbiAgICAgIHRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdDogKHRoaXMudHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0IHx8IFtdKS5tYXAobSA9PlxuICAgICAgICBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICApLFxuICAgICAgZGVsZXRlZFBhcmFtZXRlcnM6ICh0aGlzLmRlbGV0ZWRQYXJhbWV0ZXJzIHx8IFtdKS5zbGljZSgpXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBJbnRlbnRVcGRhdGUge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIEludGVudFVwZGF0ZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgaW50ZW50RGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgdHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0PzogSW50ZW50VXBkYXRlLlRyYWluaW5nUGhyYXNlVXBkYXRlLkFzT2JqZWN0W107XG4gICAgZGVsZXRlZFBhcmFtZXRlcnM/OiBzdHJpbmdbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBJbnRlbnRVcGRhdGVcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGludGVudERpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAgIHRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdD86XG4gICAgICB8IEludGVudFVwZGF0ZS5UcmFpbmluZ1BocmFzZVVwZGF0ZS5Bc1Byb3RvYnVmSlNPTltdXG4gICAgICB8IG51bGw7XG4gICAgZGVsZXRlZFBhcmFtZXRlcnM/OiBzdHJpbmdbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LlRyYWluaW5nUGhyYXNlVXBkYXRlXG4gICAqL1xuICBleHBvcnQgY2xhc3MgVHJhaW5pbmdQaHJhc2VVcGRhdGUgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuVHJhaW5pbmdQaHJhc2VVcGRhdGUnO1xuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBUcmFpbmluZ1BocmFzZVVwZGF0ZSgpO1xuICAgICAgVHJhaW5pbmdQaHJhc2VVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICAgICk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFRyYWluaW5nUGhyYXNlVXBkYXRlKSB7XG4gICAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VVcGRhdGUgPVxuICAgICAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VVcGRhdGUgfHwgdW5kZWZpbmVkO1xuICAgICAgX2luc3RhbmNlLmVudGl0eVVwZGF0ZXMgPSBfaW5zdGFuY2UuZW50aXR5VXBkYXRlcyB8fCBbXTtcbiAgICAgIF9pbnN0YW5jZS5lbnRpdGllc1JlYW5ub3RhdGVkID0gX2luc3RhbmNlLmVudGl0aWVzUmVhbm5vdGF0ZWQgfHwgW107XG4gICAgICBfaW5zdGFuY2UuY29udGFpbnNVcGRhdGVWYXJpYWJsZSA9XG4gICAgICAgIF9pbnN0YW5jZS5jb250YWluc1VwZGF0ZVZhcmlhYmxlIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBfaW5zdGFuY2U6IFRyYWluaW5nUGhyYXNlVXBkYXRlLFxuICAgICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICAgKSB7XG4gICAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlVXBkYXRlID0gbmV3IFN0cmluZ1VwZGF0ZSgpO1xuICAgICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlVXBkYXRlLFxuICAgICAgICAgICAgICBTdHJpbmdVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMiA9IG5ldyBTdHJpbmdVcGRhdGUoKTtcbiAgICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjIsXG4gICAgICAgICAgICAgIFN0cmluZ1VwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAoX2luc3RhbmNlLmVudGl0eVVwZGF0ZXMgPSBfaW5zdGFuY2UuZW50aXR5VXBkYXRlcyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIChfaW5zdGFuY2UuZW50aXRpZXNSZWFubm90YXRlZCA9XG4gICAgICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdGllc1JlYW5ub3RhdGVkIHx8IFtdKS5wdXNoKF9yZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5jb250YWluc1VwZGF0ZVZhcmlhYmxlID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgVHJhaW5pbmdQaHJhc2VVcGRhdGUucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICAgIF9pbnN0YW5jZTogVHJhaW5pbmdQaHJhc2VVcGRhdGUsXG4gICAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgICApIHtcbiAgICAgIGlmIChfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VVcGRhdGUpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgICAgMSxcbiAgICAgICAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VVcGRhdGUgYXMgYW55LFxuICAgICAgICAgIFN0cmluZ1VwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlVcGRhdGVzICYmIF9pbnN0YW5jZS5lbnRpdHlVcGRhdGVzLmxlbmd0aCkge1xuICAgICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgICAgIDIsXG4gICAgICAgICAgX2luc3RhbmNlLmVudGl0eVVwZGF0ZXMgYXMgYW55LFxuICAgICAgICAgIFN0cmluZ1VwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBfaW5zdGFuY2UuZW50aXRpZXNSZWFubm90YXRlZCAmJlxuICAgICAgICBfaW5zdGFuY2UuZW50aXRpZXNSZWFubm90YXRlZC5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoMywgX2luc3RhbmNlLmVudGl0aWVzUmVhbm5vdGF0ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5jb250YWluc1VwZGF0ZVZhcmlhYmxlKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVCb29sKDQsIF9pbnN0YW5jZS5jb250YWluc1VwZGF0ZVZhcmlhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF90cmFpbmluZ1BocmFzZVVwZGF0ZT86IFN0cmluZ1VwZGF0ZTtcbiAgICBwcml2YXRlIF9lbnRpdHlVcGRhdGVzPzogU3RyaW5nVXBkYXRlW107XG4gICAgcHJpdmF0ZSBfZW50aXRpZXNSZWFubm90YXRlZD86IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgX2NvbnRhaW5zVXBkYXRlVmFyaWFibGU/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgVHJhaW5pbmdQaHJhc2VVcGRhdGUgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFRyYWluaW5nUGhyYXNlVXBkYXRlLkFzT2JqZWN0Pikge1xuICAgICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgICAgdGhpcy50cmFpbmluZ1BocmFzZVVwZGF0ZSA9IF92YWx1ZS50cmFpbmluZ1BocmFzZVVwZGF0ZVxuICAgICAgICA/IG5ldyBTdHJpbmdVcGRhdGUoX3ZhbHVlLnRyYWluaW5nUGhyYXNlVXBkYXRlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZW50aXR5VXBkYXRlcyA9IChfdmFsdWUuZW50aXR5VXBkYXRlcyB8fCBbXSkubWFwKFxuICAgICAgICBtID0+IG5ldyBTdHJpbmdVcGRhdGUobSlcbiAgICAgICk7XG4gICAgICB0aGlzLmVudGl0aWVzUmVhbm5vdGF0ZWQgPSAoX3ZhbHVlLmVudGl0aWVzUmVhbm5vdGF0ZWQgfHwgW10pLnNsaWNlKCk7XG4gICAgICB0aGlzLmNvbnRhaW5zVXBkYXRlVmFyaWFibGUgPSBfdmFsdWUuY29udGFpbnNVcGRhdGVWYXJpYWJsZTtcbiAgICAgIFRyYWluaW5nUGhyYXNlVXBkYXRlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHRyYWluaW5nUGhyYXNlVXBkYXRlKCk6IFN0cmluZ1VwZGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhaW5pbmdQaHJhc2VVcGRhdGU7XG4gICAgfVxuICAgIHNldCB0cmFpbmluZ1BocmFzZVVwZGF0ZSh2YWx1ZTogU3RyaW5nVXBkYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl90cmFpbmluZ1BocmFzZVVwZGF0ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgZW50aXR5VXBkYXRlcygpOiBTdHJpbmdVcGRhdGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5fZW50aXR5VXBkYXRlcztcbiAgICB9XG4gICAgc2V0IGVudGl0eVVwZGF0ZXModmFsdWU6IFN0cmluZ1VwZGF0ZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lbnRpdHlVcGRhdGVzID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBlbnRpdGllc1JlYW5ub3RhdGVkKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbnRpdGllc1JlYW5ub3RhdGVkO1xuICAgIH1cbiAgICBzZXQgZW50aXRpZXNSZWFubm90YXRlZCh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2VudGl0aWVzUmVhbm5vdGF0ZWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IGNvbnRhaW5zVXBkYXRlVmFyaWFibGUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5fY29udGFpbnNVcGRhdGVWYXJpYWJsZTtcbiAgICB9XG4gICAgc2V0IGNvbnRhaW5zVXBkYXRlVmFyaWFibGUodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2NvbnRhaW5zVXBkYXRlVmFyaWFibGUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgVHJhaW5pbmdQaHJhc2VVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAgICovXG4gICAgdG9PYmplY3QoKTogVHJhaW5pbmdQaHJhc2VVcGRhdGUuQXNPYmplY3Qge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhaW5pbmdQaHJhc2VVcGRhdGU6IHRoaXMudHJhaW5pbmdQaHJhc2VVcGRhdGVcbiAgICAgICAgICA/IHRoaXMudHJhaW5pbmdQaHJhc2VVcGRhdGUudG9PYmplY3QoKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBlbnRpdHlVcGRhdGVzOiAodGhpcy5lbnRpdHlVcGRhdGVzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpLFxuICAgICAgICBlbnRpdGllc1JlYW5ub3RhdGVkOiAodGhpcy5lbnRpdGllc1JlYW5ub3RhdGVkIHx8IFtdKS5zbGljZSgpLFxuICAgICAgICBjb250YWluc1VwZGF0ZVZhcmlhYmxlOiB0aGlzLmNvbnRhaW5zVXBkYXRlVmFyaWFibGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAgICovXG4gICAgdG9Qcm90b2J1ZkpTT04oXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICAgKTogVHJhaW5pbmdQaHJhc2VVcGRhdGUuQXNQcm90b2J1ZkpTT04ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhaW5pbmdQaHJhc2VVcGRhdGU6IHRoaXMudHJhaW5pbmdQaHJhc2VVcGRhdGVcbiAgICAgICAgICA/IHRoaXMudHJhaW5pbmdQaHJhc2VVcGRhdGUudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgICA6IG51bGwsXG4gICAgICAgIGVudGl0eVVwZGF0ZXM6ICh0aGlzLmVudGl0eVVwZGF0ZXMgfHwgW10pLm1hcChtID0+XG4gICAgICAgICAgbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICApLFxuICAgICAgICBlbnRpdGllc1JlYW5ub3RhdGVkOiAodGhpcy5lbnRpdGllc1JlYW5ub3RhdGVkIHx8IFtdKS5zbGljZSgpLFxuICAgICAgICBjb250YWluc1VwZGF0ZVZhcmlhYmxlOiB0aGlzLmNvbnRhaW5zVXBkYXRlVmFyaWFibGVcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgVHJhaW5pbmdQaHJhc2VVcGRhdGUge1xuICAgIC8qKlxuICAgICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBUcmFpbmluZ1BocmFzZVVwZGF0ZVxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgICAgdHJhaW5pbmdQaHJhc2VVcGRhdGU/OiBTdHJpbmdVcGRhdGUuQXNPYmplY3Q7XG4gICAgICBlbnRpdHlVcGRhdGVzPzogU3RyaW5nVXBkYXRlLkFzT2JqZWN0W107XG4gICAgICBlbnRpdGllc1JlYW5ub3RhdGVkPzogc3RyaW5nW107XG4gICAgICBjb250YWluc1VwZGF0ZVZhcmlhYmxlPzogYm9vbGVhbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBUcmFpbmluZ1BocmFzZVVwZGF0ZVxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgICAgdHJhaW5pbmdQaHJhc2VVcGRhdGU/OiBTdHJpbmdVcGRhdGUuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgICAgZW50aXR5VXBkYXRlcz86IFN0cmluZ1VwZGF0ZS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgICAgIGVudGl0aWVzUmVhbm5vdGF0ZWQ/OiBzdHJpbmdbXTtcbiAgICAgIGNvbnRhaW5zVXBkYXRlVmFyaWFibGU/OiBib29sZWFuO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuRW50aXR5VHlwZVVwZGF0ZVxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5VHlwZVVwZGF0ZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuRW50aXR5VHlwZVVwZGF0ZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEVudGl0eVR5cGVVcGRhdGUoKTtcbiAgICBFbnRpdHlUeXBlVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogRW50aXR5VHlwZVVwZGF0ZSkge1xuICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZSA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZSB8fCAnJztcbiAgICBfaW5zdGFuY2UudmFsdWVzVXBkYXRlTGlzdCA9IF9pbnN0YW5jZS52YWx1ZXNVcGRhdGVMaXN0IHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogRW50aXR5VHlwZVVwZGF0ZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZU5hbWUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjIgPSBuZXcgRW50aXR5VHlwZVVwZGF0ZS5FbnRpdHlVcGRhdGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMixcbiAgICAgICAgICAgIEVudGl0eVR5cGVVcGRhdGUuRW50aXR5VXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS52YWx1ZXNVcGRhdGVMaXN0ID0gX2luc3RhbmNlLnZhbHVlc1VwZGF0ZUxpc3QgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEVudGl0eVR5cGVVcGRhdGUucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBFbnRpdHlUeXBlVXBkYXRlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UudmFsdWVzVXBkYXRlTGlzdCAmJiBfaW5zdGFuY2UudmFsdWVzVXBkYXRlTGlzdC5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDIsXG4gICAgICAgIF9pbnN0YW5jZS52YWx1ZXNVcGRhdGVMaXN0IGFzIGFueSxcbiAgICAgICAgRW50aXR5VHlwZVVwZGF0ZS5FbnRpdHlVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZW50aXR5VHlwZU5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX3ZhbHVlc1VwZGF0ZUxpc3Q/OiBFbnRpdHlUeXBlVXBkYXRlLkVudGl0eVVwZGF0ZVtdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgRW50aXR5VHlwZVVwZGF0ZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxFbnRpdHlUeXBlVXBkYXRlLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmVudGl0eVR5cGVOYW1lID0gX3ZhbHVlLmVudGl0eVR5cGVOYW1lO1xuICAgIHRoaXMudmFsdWVzVXBkYXRlTGlzdCA9IChfdmFsdWUudmFsdWVzVXBkYXRlTGlzdCB8fCBbXSkubWFwKFxuICAgICAgbSA9PiBuZXcgRW50aXR5VHlwZVVwZGF0ZS5FbnRpdHlVcGRhdGUobSlcbiAgICApO1xuICAgIEVudGl0eVR5cGVVcGRhdGUucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBlbnRpdHlUeXBlTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlUeXBlTmFtZTtcbiAgfVxuICBzZXQgZW50aXR5VHlwZU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2VudGl0eVR5cGVOYW1lID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHZhbHVlc1VwZGF0ZUxpc3QoKTogRW50aXR5VHlwZVVwZGF0ZS5FbnRpdHlVcGRhdGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1VwZGF0ZUxpc3Q7XG4gIH1cbiAgc2V0IHZhbHVlc1VwZGF0ZUxpc3QodmFsdWU6IEVudGl0eVR5cGVVcGRhdGUuRW50aXR5VXBkYXRlW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl92YWx1ZXNVcGRhdGVMaXN0ID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgRW50aXR5VHlwZVVwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBFbnRpdHlUeXBlVXBkYXRlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5VHlwZU5hbWU6IHRoaXMuZW50aXR5VHlwZU5hbWUsXG4gICAgICB2YWx1ZXNVcGRhdGVMaXN0OiAodGhpcy52YWx1ZXNVcGRhdGVMaXN0IHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogRW50aXR5VHlwZVVwZGF0ZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0eVR5cGVOYW1lOiB0aGlzLmVudGl0eVR5cGVOYW1lLFxuICAgICAgdmFsdWVzVXBkYXRlTGlzdDogKHRoaXMudmFsdWVzVXBkYXRlTGlzdCB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgRW50aXR5VHlwZVVwZGF0ZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgRW50aXR5VHlwZVVwZGF0ZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZW50aXR5VHlwZU5hbWU/OiBzdHJpbmc7XG4gICAgdmFsdWVzVXBkYXRlTGlzdD86IEVudGl0eVR5cGVVcGRhdGUuRW50aXR5VXBkYXRlLkFzT2JqZWN0W107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRW50aXR5VHlwZVVwZGF0ZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZW50aXR5VHlwZU5hbWU/OiBzdHJpbmc7XG4gICAgdmFsdWVzVXBkYXRlTGlzdD86IEVudGl0eVR5cGVVcGRhdGUuRW50aXR5VXBkYXRlLkFzUHJvdG9idWZKU09OW10gfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuRW50aXR5VXBkYXRlXG4gICAqL1xuICBleHBvcnQgY2xhc3MgRW50aXR5VXBkYXRlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICAgIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkVudGl0eVVwZGF0ZSc7XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEVudGl0eVVwZGF0ZSgpO1xuICAgICAgRW50aXR5VXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgICApO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBFbnRpdHlVcGRhdGUpIHtcbiAgICAgIF9pbnN0YW5jZS5lbnRpdHlWYWx1ZVVwZGF0ZSA9IF9pbnN0YW5jZS5lbnRpdHlWYWx1ZVVwZGF0ZSB8fCB1bmRlZmluZWQ7XG4gICAgICBfaW5zdGFuY2UuZW50aXR5U3lub255bVVwZGF0ZXMgPSBfaW5zdGFuY2UuZW50aXR5U3lub255bVVwZGF0ZXMgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIF9pbnN0YW5jZTogRW50aXR5VXBkYXRlLFxuICAgICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICAgKSB7XG4gICAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgX2luc3RhbmNlLmVudGl0eVZhbHVlVXBkYXRlID0gbmV3IFN0cmluZ1VwZGF0ZSgpO1xuICAgICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgICAgX2luc3RhbmNlLmVudGl0eVZhbHVlVXBkYXRlLFxuICAgICAgICAgICAgICBTdHJpbmdVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMiA9IG5ldyBTdHJpbmdVcGRhdGUoKTtcbiAgICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjIsXG4gICAgICAgICAgICAgIFN0cmluZ1VwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAoX2luc3RhbmNlLmVudGl0eVN5bm9ueW1VcGRhdGVzID1cbiAgICAgICAgICAgICAgX2luc3RhbmNlLmVudGl0eVN5bm9ueW1VcGRhdGVzIHx8IFtdKS5wdXNoKG1lc3NhZ2VJbml0aWFsaXplcjIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgRW50aXR5VXBkYXRlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgICBfaW5zdGFuY2U6IEVudGl0eVVwZGF0ZSxcbiAgICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICAgICkge1xuICAgICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlWYWx1ZVVwZGF0ZSkge1xuICAgICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgICAxLFxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlWYWx1ZVVwZGF0ZSBhcyBhbnksXG4gICAgICAgICAgU3RyaW5nVXBkYXRlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdHlTeW5vbnltVXBkYXRlcyAmJlxuICAgICAgICBfaW5zdGFuY2UuZW50aXR5U3lub255bVVwZGF0ZXMubGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgICAyLFxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlTeW5vbnltVXBkYXRlcyBhcyBhbnksXG4gICAgICAgICAgU3RyaW5nVXBkYXRlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZW50aXR5VmFsdWVVcGRhdGU/OiBTdHJpbmdVcGRhdGU7XG4gICAgcHJpdmF0ZSBfZW50aXR5U3lub255bVVwZGF0ZXM/OiBTdHJpbmdVcGRhdGVbXTtcblxuICAgIC8qKlxuICAgICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEVudGl0eVVwZGF0ZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8RW50aXR5VXBkYXRlLkFzT2JqZWN0Pikge1xuICAgICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgICAgdGhpcy5lbnRpdHlWYWx1ZVVwZGF0ZSA9IF92YWx1ZS5lbnRpdHlWYWx1ZVVwZGF0ZVxuICAgICAgICA/IG5ldyBTdHJpbmdVcGRhdGUoX3ZhbHVlLmVudGl0eVZhbHVlVXBkYXRlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZW50aXR5U3lub255bVVwZGF0ZXMgPSAoX3ZhbHVlLmVudGl0eVN5bm9ueW1VcGRhdGVzIHx8IFtdKS5tYXAoXG4gICAgICAgIG0gPT4gbmV3IFN0cmluZ1VwZGF0ZShtKVxuICAgICAgKTtcbiAgICAgIEVudGl0eVVwZGF0ZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gICAgfVxuICAgIGdldCBlbnRpdHlWYWx1ZVVwZGF0ZSgpOiBTdHJpbmdVcGRhdGUgfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuX2VudGl0eVZhbHVlVXBkYXRlO1xuICAgIH1cbiAgICBzZXQgZW50aXR5VmFsdWVVcGRhdGUodmFsdWU6IFN0cmluZ1VwZGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZW50aXR5VmFsdWVVcGRhdGUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IGVudGl0eVN5bm9ueW1VcGRhdGVzKCk6IFN0cmluZ1VwZGF0ZVtdIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbnRpdHlTeW5vbnltVXBkYXRlcztcbiAgICB9XG4gICAgc2V0IGVudGl0eVN5bm9ueW1VcGRhdGVzKHZhbHVlOiBTdHJpbmdVcGRhdGVbXSB8IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZW50aXR5U3lub255bVVwZGF0ZXMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgRW50aXR5VXBkYXRlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgICAqL1xuICAgIHRvT2JqZWN0KCk6IEVudGl0eVVwZGF0ZS5Bc09iamVjdCB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnRpdHlWYWx1ZVVwZGF0ZTogdGhpcy5lbnRpdHlWYWx1ZVVwZGF0ZVxuICAgICAgICAgID8gdGhpcy5lbnRpdHlWYWx1ZVVwZGF0ZS50b09iamVjdCgpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGVudGl0eVN5bm9ueW1VcGRhdGVzOiAodGhpcy5lbnRpdHlTeW5vbnltVXBkYXRlcyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgICBtLnRvT2JqZWN0KClcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICAgKi9cbiAgICB0b1Byb3RvYnVmSlNPTihcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgICApOiBFbnRpdHlVcGRhdGUuQXNQcm90b2J1ZkpTT04ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW50aXR5VmFsdWVVcGRhdGU6IHRoaXMuZW50aXR5VmFsdWVVcGRhdGVcbiAgICAgICAgICA/IHRoaXMuZW50aXR5VmFsdWVVcGRhdGUudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgICA6IG51bGwsXG4gICAgICAgIGVudGl0eVN5bm9ueW1VcGRhdGVzOiAodGhpcy5lbnRpdHlTeW5vbnltVXBkYXRlcyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgICBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIClcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgRW50aXR5VXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgRW50aXR5VXBkYXRlXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgICBlbnRpdHlWYWx1ZVVwZGF0ZT86IFN0cmluZ1VwZGF0ZS5Bc09iamVjdDtcbiAgICAgIGVudGl0eVN5bm9ueW1VcGRhdGVzPzogU3RyaW5nVXBkYXRlLkFzT2JqZWN0W107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRW50aXR5VXBkYXRlXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgICBlbnRpdHlWYWx1ZVVwZGF0ZT86IFN0cmluZ1VwZGF0ZS5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgICBlbnRpdHlTeW5vbnltVXBkYXRlcz86IFN0cmluZ1VwZGF0ZS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkNsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQ2xlYW5BbGxFbnRpdHlUeXBlc1JlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdCgpO1xuICAgIENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ2xlYW5BbGxFbnRpdHlUeXBlc1JlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UucGFyZW50ID0gX2luc3RhbmNlLnBhcmVudCB8fCAnJztcbiAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX2luc3RhbmNlLmxhbmd1YWdlQ29kZSB8fCAnJztcbiAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgfHwgJyc7XG4gICAgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCA9IF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW107XG4gICAgX2luc3RhbmNlLm1heEVudGl0eUNvdW50VXBkYXRlID0gX2luc3RhbmNlLm1heEVudGl0eUNvdW50VXBkYXRlIHx8IDA7XG4gICAgX2luc3RhbmNlLmZvcmJpZGRlbkVudGl0eVR5cGVQYXR0ZXJucyA9XG4gICAgICBfaW5zdGFuY2UuZm9yYmlkZGVuRW50aXR5VHlwZVBhdHRlcm5zIHx8IFtdO1xuICAgIF9pbnN0YW5jZS5kcnlSdW4gPSBfaW5zdGFuY2UuZHJ5UnVuIHx8IGZhbHNlO1xuICAgIF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMgPSBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UucGFyZW50ID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIChfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0ID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW10pLnB1c2goX3JlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgX2luc3RhbmNlLm1heEVudGl0eUNvdW50VXBkYXRlID0gX3JlYWRlci5yZWFkSW50MzIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIChfaW5zdGFuY2UuZm9yYmlkZGVuRW50aXR5VHlwZVBhdHRlcm5zID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5mb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRTdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBfaW5zdGFuY2UuZHJ5UnVuID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgX2luc3RhbmNlLm51bWJlck9mV29ya2VycyA9IF9yZWFkZXIucmVhZEludDMyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnBhcmVudCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UucGFyZW50KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMywgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgJiYgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdC5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZyg0LCBfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5tYXhFbnRpdHlDb3VudFVwZGF0ZSkge1xuICAgICAgX3dyaXRlci53cml0ZUludDMyKDUsIF9pbnN0YW5jZS5tYXhFbnRpdHlDb3VudFVwZGF0ZSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIF9pbnN0YW5jZS5mb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnMgJiZcbiAgICAgIF9pbnN0YW5jZS5mb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnMubGVuZ3RoXG4gICAgKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoNiwgX2luc3RhbmNlLmZvcmJpZGRlbkVudGl0eVR5cGVQYXR0ZXJucyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZHJ5UnVuKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCg3LCBfaW5zdGFuY2UuZHJ5UnVuKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMig4LCBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2xhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfc3BlY2lhbENoYXJhY3RlcnM/OiBzdHJpbmc7XG4gIHByaXZhdGUgX3N1YnN0cmluZ1doaXRlTGlzdD86IHN0cmluZ1tdO1xuICBwcml2YXRlIF9tYXhFbnRpdHlDb3VudFVwZGF0ZT86IG51bWJlcjtcbiAgcHJpdmF0ZSBfZm9yYmlkZGVuRW50aXR5VHlwZVBhdHRlcm5zPzogc3RyaW5nW107XG4gIHByaXZhdGUgX2RyeVJ1bj86IGJvb2xlYW47XG4gIHByaXZhdGUgX251bWJlck9mV29ya2Vycz86IG51bWJlcjtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnBhcmVudCA9IF92YWx1ZS5wYXJlbnQ7XG4gICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBfdmFsdWUubGFuZ3VhZ2VDb2RlO1xuICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMgPSBfdmFsdWUuc3BlY2lhbENoYXJhY3RlcnM7XG4gICAgdGhpcy5zdWJzdHJpbmdXaGl0ZUxpc3QgPSAoX3ZhbHVlLnN1YnN0cmluZ1doaXRlTGlzdCB8fCBbXSkuc2xpY2UoKTtcbiAgICB0aGlzLm1heEVudGl0eUNvdW50VXBkYXRlID0gX3ZhbHVlLm1heEVudGl0eUNvdW50VXBkYXRlO1xuICAgIHRoaXMuZm9yYmlkZGVuRW50aXR5VHlwZVBhdHRlcm5zID0gKFxuICAgICAgX3ZhbHVlLmZvcmJpZGRlbkVudGl0eVR5cGVQYXR0ZXJucyB8fCBbXVxuICAgICkuc2xpY2UoKTtcbiAgICB0aGlzLmRyeVJ1biA9IF92YWx1ZS5kcnlSdW47XG4gICAgdGhpcy5udW1iZXJPZldvcmtlcnMgPSBfdmFsdWUubnVtYmVyT2ZXb3JrZXJzO1xuICAgIENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgcGFyZW50KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgfVxuICBzZXQgcGFyZW50KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wYXJlbnQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbGFuZ3VhZ2VDb2RlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlQ29kZTtcbiAgfVxuICBzZXQgbGFuZ3VhZ2VDb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9sYW5ndWFnZUNvZGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3BlY2lhbENoYXJhY3RlcnMoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3BlY2lhbENoYXJhY3RlcnM7XG4gIH1cbiAgc2V0IHNwZWNpYWxDaGFyYWN0ZXJzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zcGVjaWFsQ2hhcmFjdGVycyA9IHZhbHVlO1xuICB9XG4gIGdldCBzdWJzdHJpbmdXaGl0ZUxpc3QoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zdWJzdHJpbmdXaGl0ZUxpc3Q7XG4gIH1cbiAgc2V0IHN1YnN0cmluZ1doaXRlTGlzdCh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zdWJzdHJpbmdXaGl0ZUxpc3QgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbWF4RW50aXR5Q291bnRVcGRhdGUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4RW50aXR5Q291bnRVcGRhdGU7XG4gIH1cbiAgc2V0IG1heEVudGl0eUNvdW50VXBkYXRlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9tYXhFbnRpdHlDb3VudFVwZGF0ZSA9IHZhbHVlO1xuICB9XG4gIGdldCBmb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnM7XG4gIH1cbiAgc2V0IGZvcmJpZGRlbkVudGl0eVR5cGVQYXR0ZXJucyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9mb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZHJ5UnVuKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kcnlSdW47XG4gIH1cbiAgc2V0IGRyeVJ1bih2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2RyeVJ1biA9IHZhbHVlO1xuICB9XG4gIGdldCBudW1iZXJPZldvcmtlcnMoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZXb3JrZXJzO1xuICB9XG4gIHNldCBudW1iZXJPZldvcmtlcnModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX251bWJlck9mV29ya2VycyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBzcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIHN1YnN0cmluZ1doaXRlTGlzdDogKHRoaXMuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdKS5zbGljZSgpLFxuICAgICAgbWF4RW50aXR5Q291bnRVcGRhdGU6IHRoaXMubWF4RW50aXR5Q291bnRVcGRhdGUsXG4gICAgICBmb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnM6IChcbiAgICAgICAgdGhpcy5mb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnMgfHwgW11cbiAgICAgICkuc2xpY2UoKSxcbiAgICAgIGRyeVJ1bjogdGhpcy5kcnlSdW4sXG4gICAgICBudW1iZXJPZldvcmtlcnM6IHRoaXMubnVtYmVyT2ZXb3JrZXJzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ2xlYW5BbGxFbnRpdHlUeXBlc1JlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSxcbiAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLFxuICAgICAgc3Vic3RyaW5nV2hpdGVMaXN0OiAodGhpcy5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW10pLnNsaWNlKCksXG4gICAgICBtYXhFbnRpdHlDb3VudFVwZGF0ZTogdGhpcy5tYXhFbnRpdHlDb3VudFVwZGF0ZSxcbiAgICAgIGZvcmJpZGRlbkVudGl0eVR5cGVQYXR0ZXJuczogKFxuICAgICAgICB0aGlzLmZvcmJpZGRlbkVudGl0eVR5cGVQYXR0ZXJucyB8fCBbXVxuICAgICAgKS5zbGljZSgpLFxuICAgICAgZHJ5UnVuOiB0aGlzLmRyeVJ1bixcbiAgICAgIG51bWJlck9mV29ya2VyczogdGhpcy5udW1iZXJPZldvcmtlcnNcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgcGFyZW50Pzogc3RyaW5nO1xuICAgIGxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICBzcGVjaWFsQ2hhcmFjdGVycz86IHN0cmluZztcbiAgICBzdWJzdHJpbmdXaGl0ZUxpc3Q/OiBzdHJpbmdbXTtcbiAgICBtYXhFbnRpdHlDb3VudFVwZGF0ZT86IG51bWJlcjtcbiAgICBmb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnM/OiBzdHJpbmdbXTtcbiAgICBkcnlSdW4/OiBib29sZWFuO1xuICAgIG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgcGFyZW50Pzogc3RyaW5nO1xuICAgIGxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICBzcGVjaWFsQ2hhcmFjdGVycz86IHN0cmluZztcbiAgICBzdWJzdHJpbmdXaGl0ZUxpc3Q/OiBzdHJpbmdbXTtcbiAgICBtYXhFbnRpdHlDb3VudFVwZGF0ZT86IG51bWJlcjtcbiAgICBmb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnM/OiBzdHJpbmdbXTtcbiAgICBkcnlSdW4/OiBib29sZWFuO1xuICAgIG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkFsbEVudGl0eVR5cGVzUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkNsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZSgpO1xuICAgIENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5jbGVhbmVkRW50aXR5VHlwZXMgPSBfaW5zdGFuY2UuY2xlYW5lZEVudGl0eVR5cGVzIHx8IFtdO1xuICAgIF9pbnN0YW5jZS5kZWxldGVkRW50aXR5VHlwZXMgPSBfaW5zdGFuY2UuZGVsZXRlZEVudGl0eVR5cGVzIHx8IFtdO1xuICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlcyA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlcyB8fCBbXTtcbiAgICBfaW5zdGFuY2UuZW50aXR5VHlwZURlbGV0aW9ucyA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlRGVsZXRpb25zIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjEgPSBuZXcgb25kZXdvTmx1MDA5LkVudGl0eVR5cGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMSxcbiAgICAgICAgICAgIG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS5jbGVhbmVkRW50aXR5VHlwZXMgPVxuICAgICAgICAgICAgX2luc3RhbmNlLmNsZWFuZWRFbnRpdHlUeXBlcyB8fCBbXSkucHVzaChtZXNzYWdlSW5pdGlhbGl6ZXIxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjIgPSBuZXcgb25kZXdvTmx1MDA5LkVudGl0eVR5cGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMixcbiAgICAgICAgICAgIG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS5kZWxldGVkRW50aXR5VHlwZXMgPVxuICAgICAgICAgICAgX2luc3RhbmNlLmRlbGV0ZWRFbnRpdHlUeXBlcyB8fCBbXSkucHVzaChtZXNzYWdlSW5pdGlhbGl6ZXIyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjMgPSBuZXcgRW50aXR5VHlwZVVwZGF0ZSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIzLFxuICAgICAgICAgICAgRW50aXR5VHlwZVVwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UuZW50aXR5VHlwZVVwZGF0ZXMgPVxuICAgICAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGVVcGRhdGVzIHx8IFtdKS5wdXNoKG1lc3NhZ2VJbml0aWFsaXplcjMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyNCA9IG5ldyBFbnRpdHlUeXBlVXBkYXRlKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjQsXG4gICAgICAgICAgICBFbnRpdHlUeXBlVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS5lbnRpdHlUeXBlRGVsZXRpb25zID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlRGVsZXRpb25zIHx8IFtdKS5wdXNoKG1lc3NhZ2VJbml0aWFsaXplcjQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmNsZWFuZWRFbnRpdHlUeXBlcyAmJiBfaW5zdGFuY2UuY2xlYW5lZEVudGl0eVR5cGVzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLmNsZWFuZWRFbnRpdHlUeXBlcyBhcyBhbnksXG4gICAgICAgIG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmRlbGV0ZWRFbnRpdHlUeXBlcyAmJiBfaW5zdGFuY2UuZGVsZXRlZEVudGl0eVR5cGVzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgMixcbiAgICAgICAgX2luc3RhbmNlLmRlbGV0ZWRFbnRpdHlUeXBlcyBhcyBhbnksXG4gICAgICAgIG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmVudGl0eVR5cGVVcGRhdGVzICYmIF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDMsXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlcyBhcyBhbnksXG4gICAgICAgIEVudGl0eVR5cGVVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZW50aXR5VHlwZURlbGV0aW9ucyAmJiBfaW5zdGFuY2UuZW50aXR5VHlwZURlbGV0aW9ucy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDQsXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlRGVsZXRpb25zIGFzIGFueSxcbiAgICAgICAgRW50aXR5VHlwZVVwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbmVkRW50aXR5VHlwZXM/OiBvbmRld29ObHUwMDkuRW50aXR5VHlwZVtdO1xuICBwcml2YXRlIF9kZWxldGVkRW50aXR5VHlwZXM/OiBvbmRld29ObHUwMDkuRW50aXR5VHlwZVtdO1xuICBwcml2YXRlIF9lbnRpdHlUeXBlVXBkYXRlcz86IEVudGl0eVR5cGVVcGRhdGVbXTtcbiAgcHJpdmF0ZSBfZW50aXR5VHlwZURlbGV0aW9ucz86IEVudGl0eVR5cGVVcGRhdGVbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDbGVhbkFsbEVudGl0eVR5cGVzUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuY2xlYW5lZEVudGl0eVR5cGVzID0gKF92YWx1ZS5jbGVhbmVkRW50aXR5VHlwZXMgfHwgW10pLm1hcChcbiAgICAgIG0gPT4gbmV3IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlKG0pXG4gICAgKTtcbiAgICB0aGlzLmRlbGV0ZWRFbnRpdHlUeXBlcyA9IChfdmFsdWUuZGVsZXRlZEVudGl0eVR5cGVzIHx8IFtdKS5tYXAoXG4gICAgICBtID0+IG5ldyBvbmRld29ObHUwMDkuRW50aXR5VHlwZShtKVxuICAgICk7XG4gICAgdGhpcy5lbnRpdHlUeXBlVXBkYXRlcyA9IChfdmFsdWUuZW50aXR5VHlwZVVwZGF0ZXMgfHwgW10pLm1hcChcbiAgICAgIG0gPT4gbmV3IEVudGl0eVR5cGVVcGRhdGUobSlcbiAgICApO1xuICAgIHRoaXMuZW50aXR5VHlwZURlbGV0aW9ucyA9IChfdmFsdWUuZW50aXR5VHlwZURlbGV0aW9ucyB8fCBbXSkubWFwKFxuICAgICAgbSA9PiBuZXcgRW50aXR5VHlwZVVwZGF0ZShtKVxuICAgICk7XG4gICAgQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgY2xlYW5lZEVudGl0eVR5cGVzKCk6IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jbGVhbmVkRW50aXR5VHlwZXM7XG4gIH1cbiAgc2V0IGNsZWFuZWRFbnRpdHlUeXBlcyh2YWx1ZTogb25kZXdvTmx1MDA5LkVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NsZWFuZWRFbnRpdHlUeXBlcyA9IHZhbHVlO1xuICB9XG4gIGdldCBkZWxldGVkRW50aXR5VHlwZXMoKTogb25kZXdvTmx1MDA5LkVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RlbGV0ZWRFbnRpdHlUeXBlcztcbiAgfVxuICBzZXQgZGVsZXRlZEVudGl0eVR5cGVzKHZhbHVlOiBvbmRld29ObHUwMDkuRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZGVsZXRlZEVudGl0eVR5cGVzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGVudGl0eVR5cGVVcGRhdGVzKCk6IEVudGl0eVR5cGVVcGRhdGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVVcGRhdGVzO1xuICB9XG4gIHNldCBlbnRpdHlUeXBlVXBkYXRlcyh2YWx1ZTogRW50aXR5VHlwZVVwZGF0ZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZW50aXR5VHlwZVVwZGF0ZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZW50aXR5VHlwZURlbGV0aW9ucygpOiBFbnRpdHlUeXBlVXBkYXRlW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlUeXBlRGVsZXRpb25zO1xuICB9XG4gIHNldCBlbnRpdHlUeXBlRGVsZXRpb25zKHZhbHVlOiBFbnRpdHlUeXBlVXBkYXRlW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbnRpdHlUeXBlRGVsZXRpb25zID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsZWFuZWRFbnRpdHlUeXBlczogKHRoaXMuY2xlYW5lZEVudGl0eVR5cGVzIHx8IFtdKS5tYXAobSA9PlxuICAgICAgICBtLnRvT2JqZWN0KClcbiAgICAgICksXG4gICAgICBkZWxldGVkRW50aXR5VHlwZXM6ICh0aGlzLmRlbGV0ZWRFbnRpdHlUeXBlcyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b09iamVjdCgpXG4gICAgICApLFxuICAgICAgZW50aXR5VHlwZVVwZGF0ZXM6ICh0aGlzLmVudGl0eVR5cGVVcGRhdGVzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpLFxuICAgICAgZW50aXR5VHlwZURlbGV0aW9uczogKHRoaXMuZW50aXR5VHlwZURlbGV0aW9ucyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b09iamVjdCgpXG4gICAgICApXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xlYW5lZEVudGl0eVR5cGVzOiAodGhpcy5jbGVhbmVkRW50aXR5VHlwZXMgfHwgW10pLm1hcChtID0+XG4gICAgICAgIG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICksXG4gICAgICBkZWxldGVkRW50aXR5VHlwZXM6ICh0aGlzLmRlbGV0ZWRFbnRpdHlUeXBlcyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgKSxcbiAgICAgIGVudGl0eVR5cGVVcGRhdGVzOiAodGhpcy5lbnRpdHlUeXBlVXBkYXRlcyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgKSxcbiAgICAgIGVudGl0eVR5cGVEZWxldGlvbnM6ICh0aGlzLmVudGl0eVR5cGVEZWxldGlvbnMgfHwgW10pLm1hcChtID0+XG4gICAgICAgIG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgIClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBjbGVhbmVkRW50aXR5VHlwZXM/OiBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5Bc09iamVjdFtdO1xuICAgIGRlbGV0ZWRFbnRpdHlUeXBlcz86IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLkFzT2JqZWN0W107XG4gICAgZW50aXR5VHlwZVVwZGF0ZXM/OiBFbnRpdHlUeXBlVXBkYXRlLkFzT2JqZWN0W107XG4gICAgZW50aXR5VHlwZURlbGV0aW9ucz86IEVudGl0eVR5cGVVcGRhdGUuQXNPYmplY3RbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkFsbEVudGl0eVR5cGVzUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGNsZWFuZWRFbnRpdHlUeXBlcz86IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLkFzUHJvdG9idWZKU09OW10gfCBudWxsO1xuICAgIGRlbGV0ZWRFbnRpdHlUeXBlcz86IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLkFzUHJvdG9idWZKU09OW10gfCBudWxsO1xuICAgIGVudGl0eVR5cGVVcGRhdGVzPzogRW50aXR5VHlwZVVwZGF0ZS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgICBlbnRpdHlUeXBlRGVsZXRpb25zPzogRW50aXR5VHlwZVVwZGF0ZS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENsZWFuRW50aXR5VHlwZVJlcXVlc3QoKTtcbiAgICBDbGVhbkVudGl0eVR5cGVSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdCkge1xuICAgIF9pbnN0YW5jZS5wYXJlbnQgPSBfaW5zdGFuY2UucGFyZW50IHx8ICcnO1xuICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZSA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZSB8fCAnJztcbiAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX2luc3RhbmNlLmxhbmd1YWdlQ29kZSB8fCAnJztcbiAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgfHwgJyc7XG4gICAgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCA9IF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW107XG4gICAgX2luc3RhbmNlLm1heEVudGl0eUNvdW50VXBkYXRlID0gX2luc3RhbmNlLm1heEVudGl0eUNvdW50VXBkYXRlIHx8IDA7XG4gICAgX2luc3RhbmNlLmRyeVJ1biA9IF9pbnN0YW5jZS5kcnlSdW4gfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDbGVhbkVudGl0eVR5cGVSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5wYXJlbnQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAoX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCA9XG4gICAgICAgICAgICBfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdKS5wdXNoKF9yZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9pbnN0YW5jZS5tYXhFbnRpdHlDb3VudFVwZGF0ZSA9IF9yZWFkZXIucmVhZEludDMyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBfaW5zdGFuY2UuZHJ5UnVuID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENsZWFuRW50aXR5VHlwZVJlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UucGFyZW50KSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5wYXJlbnQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDMsIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDQsIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0ICYmIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoNSwgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UubWF4RW50aXR5Q291bnRVcGRhdGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMig2LCBfaW5zdGFuY2UubWF4RW50aXR5Q291bnRVcGRhdGUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmRyeVJ1bikge1xuICAgICAgX3dyaXRlci53cml0ZUJvb2woNywgX2luc3RhbmNlLmRyeVJ1bik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFyZW50Pzogc3RyaW5nO1xuICBwcml2YXRlIF9lbnRpdHlUeXBlTmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICBwcml2YXRlIF9zcGVjaWFsQ2hhcmFjdGVycz86IHN0cmluZztcbiAgcHJpdmF0ZSBfc3Vic3RyaW5nV2hpdGVMaXN0Pzogc3RyaW5nW107XG4gIHByaXZhdGUgX21heEVudGl0eUNvdW50VXBkYXRlPzogbnVtYmVyO1xuICBwcml2YXRlIF9kcnlSdW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDbGVhbkVudGl0eVR5cGVSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnBhcmVudCA9IF92YWx1ZS5wYXJlbnQ7XG4gICAgdGhpcy5lbnRpdHlUeXBlTmFtZSA9IF92YWx1ZS5lbnRpdHlUeXBlTmFtZTtcbiAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IF92YWx1ZS5sYW5ndWFnZUNvZGU7XG4gICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyA9IF92YWx1ZS5zcGVjaWFsQ2hhcmFjdGVycztcbiAgICB0aGlzLnN1YnN0cmluZ1doaXRlTGlzdCA9IChfdmFsdWUuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdKS5zbGljZSgpO1xuICAgIHRoaXMubWF4RW50aXR5Q291bnRVcGRhdGUgPSBfdmFsdWUubWF4RW50aXR5Q291bnRVcGRhdGU7XG4gICAgdGhpcy5kcnlSdW4gPSBfdmFsdWUuZHJ5UnVuO1xuICAgIENsZWFuRW50aXR5VHlwZVJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBwYXJlbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICB9XG4gIHNldCBwYXJlbnQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhcmVudCA9IHZhbHVlO1xuICB9XG4gIGdldCBlbnRpdHlUeXBlTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlUeXBlTmFtZTtcbiAgfVxuICBzZXQgZW50aXR5VHlwZU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2VudGl0eVR5cGVOYW1lID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGxhbmd1YWdlQ29kZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUNvZGU7XG4gIH1cbiAgc2V0IGxhbmd1YWdlQ29kZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbGFuZ3VhZ2VDb2RlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHNwZWNpYWxDaGFyYWN0ZXJzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NwZWNpYWxDaGFyYWN0ZXJzO1xuICB9XG4gIHNldCBzcGVjaWFsQ2hhcmFjdGVycyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc3BlY2lhbENoYXJhY3RlcnMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3Vic3RyaW5nV2hpdGVMaXN0KCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic3RyaW5nV2hpdGVMaXN0O1xuICB9XG4gIHNldCBzdWJzdHJpbmdXaGl0ZUxpc3QodmFsdWU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc3Vic3RyaW5nV2hpdGVMaXN0ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IG1heEVudGl0eUNvdW50VXBkYXRlKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21heEVudGl0eUNvdW50VXBkYXRlO1xuICB9XG4gIHNldCBtYXhFbnRpdHlDb3VudFVwZGF0ZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbWF4RW50aXR5Q291bnRVcGRhdGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZHJ5UnVuKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kcnlSdW47XG4gIH1cbiAgc2V0IGRyeVJ1bih2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2RyeVJ1biA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENsZWFuRW50aXR5VHlwZVJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQsXG4gICAgICBlbnRpdHlUeXBlTmFtZTogdGhpcy5lbnRpdHlUeXBlTmFtZSxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBzcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIHN1YnN0cmluZ1doaXRlTGlzdDogKHRoaXMuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdKS5zbGljZSgpLFxuICAgICAgbWF4RW50aXR5Q291bnRVcGRhdGU6IHRoaXMubWF4RW50aXR5Q291bnRVcGRhdGUsXG4gICAgICBkcnlSdW46IHRoaXMuZHJ5UnVuXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQsXG4gICAgICBlbnRpdHlUeXBlTmFtZTogdGhpcy5lbnRpdHlUeXBlTmFtZSxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBzcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIHN1YnN0cmluZ1doaXRlTGlzdDogKHRoaXMuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdKS5zbGljZSgpLFxuICAgICAgbWF4RW50aXR5Q291bnRVcGRhdGU6IHRoaXMubWF4RW50aXR5Q291bnRVcGRhdGUsXG4gICAgICBkcnlSdW46IHRoaXMuZHJ5UnVuXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBDbGVhbkVudGl0eVR5cGVSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkVudGl0eVR5cGVSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgZW50aXR5VHlwZU5hbWU/OiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICAgIHNwZWNpYWxDaGFyYWN0ZXJzPzogc3RyaW5nO1xuICAgIHN1YnN0cmluZ1doaXRlTGlzdD86IHN0cmluZ1tdO1xuICAgIG1heEVudGl0eUNvdW50VXBkYXRlPzogbnVtYmVyO1xuICAgIGRyeVJ1bj86IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgcGFyZW50Pzogc3RyaW5nO1xuICAgIGVudGl0eVR5cGVOYW1lPzogc3RyaW5nO1xuICAgIGxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICBzcGVjaWFsQ2hhcmFjdGVycz86IHN0cmluZztcbiAgICBzdWJzdHJpbmdXaGl0ZUxpc3Q/OiBzdHJpbmdbXTtcbiAgICBtYXhFbnRpdHlDb3VudFVwZGF0ZT86IG51bWJlcjtcbiAgICBkcnlSdW4/OiBib29sZWFuO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5DbGVhbkVudGl0eVR5cGVSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkNsZWFuRW50aXR5VHlwZVJlc3BvbnNlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UoKTtcbiAgICBDbGVhbkVudGl0eVR5cGVSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IENsZWFuRW50aXR5VHlwZVJlc3BvbnNlKSB7XG4gICAgX2luc3RhbmNlLmNsZWFuZWRFbnRpdHlUeXBlID0gX2luc3RhbmNlLmNsZWFuZWRFbnRpdHlUeXBlIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UuZW50aXR5VHlwZVVwZGF0ZSA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlIHx8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IENsZWFuRW50aXR5VHlwZVJlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5jbGVhbmVkRW50aXR5VHlwZSA9IG5ldyBvbmRld29ObHUwMDkuRW50aXR5VHlwZSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuY2xlYW5lZEVudGl0eVR5cGUsXG4gICAgICAgICAgICBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGVVcGRhdGUgPSBuZXcgRW50aXR5VHlwZVVwZGF0ZSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZVVwZGF0ZSxcbiAgICAgICAgICAgIEVudGl0eVR5cGVVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIENsZWFuRW50aXR5VHlwZVJlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuY2xlYW5lZEVudGl0eVR5cGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAxLFxuICAgICAgICBfaW5zdGFuY2UuY2xlYW5lZEVudGl0eVR5cGUgYXMgYW55LFxuICAgICAgICBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMixcbiAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGVVcGRhdGUgYXMgYW55LFxuICAgICAgICBFbnRpdHlUeXBlVXBkYXRlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFuZWRFbnRpdHlUeXBlPzogb25kZXdvTmx1MDA5LkVudGl0eVR5cGU7XG4gIHByaXZhdGUgX2VudGl0eVR5cGVVcGRhdGU/OiBFbnRpdHlUeXBlVXBkYXRlO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8Q2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuY2xlYW5lZEVudGl0eVR5cGUgPSBfdmFsdWUuY2xlYW5lZEVudGl0eVR5cGVcbiAgICAgID8gbmV3IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlKF92YWx1ZS5jbGVhbmVkRW50aXR5VHlwZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuZW50aXR5VHlwZVVwZGF0ZSA9IF92YWx1ZS5lbnRpdHlUeXBlVXBkYXRlXG4gICAgICA/IG5ldyBFbnRpdHlUeXBlVXBkYXRlKF92YWx1ZS5lbnRpdHlUeXBlVXBkYXRlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBjbGVhbmVkRW50aXR5VHlwZSgpOiBvbmRld29ObHUwMDkuRW50aXR5VHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NsZWFuZWRFbnRpdHlUeXBlO1xuICB9XG4gIHNldCBjbGVhbmVkRW50aXR5VHlwZSh2YWx1ZTogb25kZXdvTmx1MDA5LkVudGl0eVR5cGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jbGVhbmVkRW50aXR5VHlwZSA9IHZhbHVlO1xuICB9XG4gIGdldCBlbnRpdHlUeXBlVXBkYXRlKCk6IEVudGl0eVR5cGVVcGRhdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlUeXBlVXBkYXRlO1xuICB9XG4gIHNldCBlbnRpdHlUeXBlVXBkYXRlKHZhbHVlOiBFbnRpdHlUeXBlVXBkYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZW50aXR5VHlwZVVwZGF0ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENsZWFuRW50aXR5VHlwZVJlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENsZWFuRW50aXR5VHlwZVJlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xlYW5lZEVudGl0eVR5cGU6IHRoaXMuY2xlYW5lZEVudGl0eVR5cGVcbiAgICAgICAgPyB0aGlzLmNsZWFuZWRFbnRpdHlUeXBlLnRvT2JqZWN0KClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBlbnRpdHlUeXBlVXBkYXRlOiB0aGlzLmVudGl0eVR5cGVVcGRhdGVcbiAgICAgICAgPyB0aGlzLmVudGl0eVR5cGVVcGRhdGUudG9PYmplY3QoKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IENsZWFuRW50aXR5VHlwZVJlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xlYW5lZEVudGl0eVR5cGU6IHRoaXMuY2xlYW5lZEVudGl0eVR5cGVcbiAgICAgICAgPyB0aGlzLmNsZWFuZWRFbnRpdHlUeXBlLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIGVudGl0eVR5cGVVcGRhdGU6IHRoaXMuZW50aXR5VHlwZVVwZGF0ZVxuICAgICAgICA/IHRoaXMuZW50aXR5VHlwZVVwZGF0ZS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENsZWFuRW50aXR5VHlwZVJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkVudGl0eVR5cGVSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgY2xlYW5lZEVudGl0eVR5cGU/OiBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5Bc09iamVjdDtcbiAgICBlbnRpdHlUeXBlVXBkYXRlPzogRW50aXR5VHlwZVVwZGF0ZS5Bc09iamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkVudGl0eVR5cGVSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgY2xlYW5lZEVudGl0eVR5cGU/OiBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgZW50aXR5VHlwZVVwZGF0ZT86IEVudGl0eVR5cGVVcGRhdGUuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5BZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5BZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdCgpO1xuICAgIEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnBhcmVudCA9IF9pbnN0YW5jZS5wYXJlbnQgfHwgJyc7XG4gICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgfHwgJyc7XG4gICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlTGlzdCA9IF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUxpc3QgfHwgW107XG4gICAgX2luc3RhbmNlLmV4dHJhY3RFbnRpdGllcyA9IF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMgfHwgZmFsc2U7XG4gICAgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzID0gX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzIHx8ICcnO1xuICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID1cbiAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzID0gX2luc3RhbmNlLm51bWJlck9mV29ya2VycyB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UucGFyZW50ID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIzID0gbmV3IEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QuVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMyxcbiAgICAgICAgICAgIEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QuVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnRcbiAgICAgICAgICAgICAgLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUxpc3QgPVxuICAgICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlTGlzdCB8fCBbXSkucHVzaChtZXNzYWdlSW5pdGlhbGl6ZXIzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMgPSBfcmVhZGVyLnJlYWRCb29sKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID0gbmV3IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMsXG4gICAgICAgICAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzID0gX3JlYWRlci5yZWFkSW50MzIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnBhcmVudCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UucGFyZW50KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VMaXN0ICYmIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUxpc3QubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgICAzLFxuICAgICAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VMaXN0IGFzIGFueSxcbiAgICAgICAgQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5UcmFpbmluZ1BocmFzZUZvckludGVudFxuICAgICAgICAgIC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVCb29sKDQsIF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDUsIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucykge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDYsXG4gICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIGFzIGFueSxcbiAgICAgICAgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMig3LCBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2xhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfdHJhaW5pbmdQaHJhc2VMaXN0PzogQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5UcmFpbmluZ1BocmFzZUZvckludGVudFtdO1xuICBwcml2YXRlIF9leHRyYWN0RW50aXRpZXM/OiBib29sZWFuO1xuICBwcml2YXRlIF9zcGVjaWFsQ2hhcmFjdGVycz86IHN0cmluZztcbiAgcHJpdmF0ZSBfdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucz86IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM7XG4gIHByaXZhdGUgX251bWJlck9mV29ya2Vycz86IG51bWJlcjtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8QWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5wYXJlbnQgPSBfdmFsdWUucGFyZW50O1xuICAgIHRoaXMubGFuZ3VhZ2VDb2RlID0gX3ZhbHVlLmxhbmd1YWdlQ29kZTtcbiAgICB0aGlzLnRyYWluaW5nUGhyYXNlTGlzdCA9IChfdmFsdWUudHJhaW5pbmdQaHJhc2VMaXN0IHx8IFtdKS5tYXAoXG4gICAgICBtID0+IG5ldyBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0LlRyYWluaW5nUGhyYXNlRm9ySW50ZW50KG0pXG4gICAgKTtcbiAgICB0aGlzLmV4dHJhY3RFbnRpdGllcyA9IF92YWx1ZS5leHRyYWN0RW50aXRpZXM7XG4gICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyA9IF92YWx1ZS5zcGVjaWFsQ2hhcmFjdGVycztcbiAgICB0aGlzLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgPSBfdmFsdWUudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICAgICAgPyBuZXcgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyhfdmFsdWUudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMubnVtYmVyT2ZXb3JrZXJzID0gX3ZhbHVlLm51bWJlck9mV29ya2VycztcbiAgICBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgcGFyZW50KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgfVxuICBzZXQgcGFyZW50KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wYXJlbnQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbGFuZ3VhZ2VDb2RlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlQ29kZTtcbiAgfVxuICBzZXQgbGFuZ3VhZ2VDb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9sYW5ndWFnZUNvZGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgdHJhaW5pbmdQaHJhc2VMaXN0KCk6XG4gICAgfCBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0LlRyYWluaW5nUGhyYXNlRm9ySW50ZW50W11cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYWluaW5nUGhyYXNlTGlzdDtcbiAgfVxuICBzZXQgdHJhaW5pbmdQaHJhc2VMaXN0KFxuICAgIHZhbHVlOiBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0LlRyYWluaW5nUGhyYXNlRm9ySW50ZW50W10gfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fdHJhaW5pbmdQaHJhc2VMaXN0ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGV4dHJhY3RFbnRpdGllcygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZXh0cmFjdEVudGl0aWVzO1xuICB9XG4gIHNldCBleHRyYWN0RW50aXRpZXModmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9leHRyYWN0RW50aXRpZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3BlY2lhbENoYXJhY3RlcnMoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3BlY2lhbENoYXJhY3RlcnM7XG4gIH1cbiAgc2V0IHNwZWNpYWxDaGFyYWN0ZXJzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zcGVjaWFsQ2hhcmFjdGVycyA9IHZhbHVlO1xuICB9XG4gIGdldCB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKCk6IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zO1xuICB9XG4gIHNldCB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKFxuICAgIHZhbHVlOiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX3RyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbnVtYmVyT2ZXb3JrZXJzKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX251bWJlck9mV29ya2VycztcbiAgfVxuICBzZXQgbnVtYmVyT2ZXb3JrZXJzKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9udW1iZXJPZldvcmtlcnMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSxcbiAgICAgIHRyYWluaW5nUGhyYXNlTGlzdDogKHRoaXMudHJhaW5pbmdQaHJhc2VMaXN0IHx8IFtdKS5tYXAobSA9PlxuICAgICAgICBtLnRvT2JqZWN0KClcbiAgICAgICksXG4gICAgICBleHRyYWN0RW50aXRpZXM6IHRoaXMuZXh0cmFjdEVudGl0aWVzLFxuICAgICAgc3BlY2lhbENoYXJhY3RlcnM6IHRoaXMuc3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zOiB0aGlzLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnNcbiAgICAgICAgPyB0aGlzLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMudG9PYmplY3QoKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG51bWJlck9mV29ya2VyczogdGhpcy5udW1iZXJPZldvcmtlcnNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICB0cmFpbmluZ1BocmFzZUxpc3Q6ICh0aGlzLnRyYWluaW5nUGhyYXNlTGlzdCB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgKSxcbiAgICAgIGV4dHJhY3RFbnRpdGllczogdGhpcy5leHRyYWN0RW50aXRpZXMsXG4gICAgICBzcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM6IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICAgICAgICA/IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGwsXG4gICAgICBudW1iZXJPZldvcmtlcnM6IHRoaXMubnVtYmVyT2ZXb3JrZXJzXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICAgIHRyYWluaW5nUGhyYXNlTGlzdD86IEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QuVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQuQXNPYmplY3RbXTtcbiAgICBleHRyYWN0RW50aXRpZXM/OiBib29sZWFuO1xuICAgIHNwZWNpYWxDaGFyYWN0ZXJzPzogc3RyaW5nO1xuICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM/OiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLkFzT2JqZWN0O1xuICAgIG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICAgIHRyYWluaW5nUGhyYXNlTGlzdD86XG4gICAgICB8IEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QuVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQuQXNQcm90b2J1ZkpTT05bXVxuICAgICAgfCBudWxsO1xuICAgIGV4dHJhY3RFbnRpdGllcz86IGJvb2xlYW47XG4gICAgc3BlY2lhbENoYXJhY3RlcnM/OiBzdHJpbmc7XG4gICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucz86IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgIG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LlRyYWluaW5nUGhyYXNlRm9ySW50ZW50XG4gICAqL1xuICBleHBvcnQgY2xhc3MgVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQnO1xuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBUcmFpbmluZ1BocmFzZUZvckludGVudCgpO1xuICAgICAgVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICAgICk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFRyYWluaW5nUGhyYXNlRm9ySW50ZW50KSB7XG4gICAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2UgPSBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2UgfHwgJyc7XG4gICAgICBfaW5zdGFuY2UuaW50ZW50RGlzcGxheU5hbWUgPSBfaW5zdGFuY2UuaW50ZW50RGlzcGxheU5hbWUgfHwgJyc7XG4gICAgICBfaW5zdGFuY2UuZW50aXRpZXMgPSBfaW5zdGFuY2UuZW50aXRpZXMgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIF9pbnN0YW5jZTogVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQsXG4gICAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgICApIHtcbiAgICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2UgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5pbnRlbnREaXNwbGF5TmFtZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMyA9IG5ldyBvbmRld29ObHUwMDguSW50ZW50LlRyYWluaW5nUGhyYXNlLkVudGl0eSgpO1xuICAgICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMyxcbiAgICAgICAgICAgICAgb25kZXdvTmx1MDA4LkludGVudC5UcmFpbmluZ1BocmFzZS5FbnRpdHlcbiAgICAgICAgICAgICAgICAuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgKF9pbnN0YW5jZS5lbnRpdGllcyA9IF9pbnN0YW5jZS5lbnRpdGllcyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyM1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgICBfaW5zdGFuY2U6IFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LFxuICAgICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICAgKSB7XG4gICAgICBpZiAoX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2UuaW50ZW50RGlzcGxheU5hbWUpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyLCBfaW5zdGFuY2UuaW50ZW50RGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5lbnRpdGllcyAmJiBfaW5zdGFuY2UuZW50aXRpZXMubGVuZ3RoKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgICAgMyxcbiAgICAgICAgICBfaW5zdGFuY2UuZW50aXRpZXMgYXMgYW55LFxuICAgICAgICAgIG9uZGV3b05sdTAwOC5JbnRlbnQuVHJhaW5pbmdQaHJhc2UuRW50aXR5LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdHJhaW5pbmdQaHJhc2U/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfaW50ZW50RGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZW50aXRpZXM/OiBvbmRld29ObHUwMDguSW50ZW50LlRyYWluaW5nUGhyYXNlLkVudGl0eVtdO1xuXG4gICAgLyoqXG4gICAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LkFzT2JqZWN0Pikge1xuICAgICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgICAgdGhpcy50cmFpbmluZ1BocmFzZSA9IF92YWx1ZS50cmFpbmluZ1BocmFzZTtcbiAgICAgIHRoaXMuaW50ZW50RGlzcGxheU5hbWUgPSBfdmFsdWUuaW50ZW50RGlzcGxheU5hbWU7XG4gICAgICB0aGlzLmVudGl0aWVzID0gKF92YWx1ZS5lbnRpdGllcyB8fCBbXSkubWFwKFxuICAgICAgICBtID0+IG5ldyBvbmRld29ObHUwMDguSW50ZW50LlRyYWluaW5nUGhyYXNlLkVudGl0eShtKVxuICAgICAgKTtcbiAgICAgIFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHRyYWluaW5nUGhyYXNlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhaW5pbmdQaHJhc2U7XG4gICAgfVxuICAgIHNldCB0cmFpbmluZ1BocmFzZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl90cmFpbmluZ1BocmFzZSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgaW50ZW50RGlzcGxheU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbnRlbnREaXNwbGF5TmFtZTtcbiAgICB9XG4gICAgc2V0IGludGVudERpc3BsYXlOYW1lKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2ludGVudERpc3BsYXlOYW1lID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBlbnRpdGllcygpOiBvbmRld29ObHUwMDguSW50ZW50LlRyYWluaW5nUGhyYXNlLkVudGl0eVtdIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbnRpdGllcztcbiAgICB9XG4gICAgc2V0IGVudGl0aWVzKFxuICAgICAgdmFsdWU6IG9uZGV3b05sdTAwOC5JbnRlbnQuVHJhaW5pbmdQaHJhc2UuRW50aXR5W10gfCB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuX2VudGl0aWVzID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICAgIFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgICAqL1xuICAgIHRvT2JqZWN0KCk6IFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LkFzT2JqZWN0IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYWluaW5nUGhyYXNlOiB0aGlzLnRyYWluaW5nUGhyYXNlLFxuICAgICAgICBpbnRlbnREaXNwbGF5TmFtZTogdGhpcy5pbnRlbnREaXNwbGF5TmFtZSxcbiAgICAgICAgZW50aXRpZXM6ICh0aGlzLmVudGl0aWVzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LkFzUHJvdG9idWZKU09OIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYWluaW5nUGhyYXNlOiB0aGlzLnRyYWluaW5nUGhyYXNlLFxuICAgICAgICBpbnRlbnREaXNwbGF5TmFtZTogdGhpcy5pbnRlbnREaXNwbGF5TmFtZSxcbiAgICAgICAgZW50aXRpZXM6ICh0aGlzLmVudGl0aWVzIHx8IFtdKS5tYXAobSA9PiBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpKVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IG1vZHVsZSBUcmFpbmluZ1BocmFzZUZvckludGVudCB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFRyYWluaW5nUGhyYXNlRm9ySW50ZW50XG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgICB0cmFpbmluZ1BocmFzZT86IHN0cmluZztcbiAgICAgIGludGVudERpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAgICAgZW50aXRpZXM/OiBvbmRld29ObHUwMDguSW50ZW50LlRyYWluaW5nUGhyYXNlLkVudGl0eS5Bc09iamVjdFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFRyYWluaW5nUGhyYXNlRm9ySW50ZW50XG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgICB0cmFpbmluZ1BocmFzZT86IHN0cmluZztcbiAgICAgIGludGVudERpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAgICAgZW50aXRpZXM/OlxuICAgICAgICB8IG9uZGV3b05sdTAwOC5JbnRlbnQuVHJhaW5pbmdQaHJhc2UuRW50aXR5LkFzUHJvdG9idWZKU09OW11cbiAgICAgICAgfCBudWxsO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuQWRkVHJhaW5pbmdQaHJhc2VzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNsYXNzIEFkZFRyYWluaW5nUGhyYXNlc1Jlc3BvbnNlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5BZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEFkZFRyYWluaW5nUGhyYXNlc1Jlc3BvbnNlKCk7XG4gICAgQWRkVHJhaW5pbmdQaHJhc2VzUmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5lcnJvck1lc3NhZ2VzID0gX2luc3RhbmNlLmVycm9yTWVzc2FnZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAoX2luc3RhbmNlLmVycm9yTWVzc2FnZXMgPSBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIF9yZWFkZXIucmVhZFN0cmluZygpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEFkZFRyYWluaW5nUGhyYXNlc1Jlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQWRkVHJhaW5pbmdQaHJhc2VzUmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyAmJiBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZygxLCBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQWRkVHJhaW5pbmdQaHJhc2VzUmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8QWRkVHJhaW5pbmdQaHJhc2VzUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlcyA9IChfdmFsdWUuZXJyb3JNZXNzYWdlcyB8fCBbXSkuc2xpY2UoKTtcbiAgICBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVycm9yTWVzc2FnZXMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lcnJvck1lc3NhZ2VzO1xuICB9XG4gIHNldCBlcnJvck1lc3NhZ2VzKHZhbHVlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2Vycm9yTWVzc2FnZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yTWVzc2FnZXM6ICh0aGlzLmVycm9yTWVzc2FnZXMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yTWVzc2FnZXM6ICh0aGlzLmVycm9yTWVzc2FnZXMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEFkZFRyYWluaW5nUGhyYXNlc1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZXJyb3JNZXNzYWdlcz86IHN0cmluZ1tdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEFkZFRyYWluaW5nUGhyYXNlc1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBlcnJvck1lc3NhZ2VzPzogc3RyaW5nW107XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBBZGRUcmFpbmluZ1BocmFzZXNGcm9tQ1NWUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBBZGRUcmFpbmluZ1BocmFzZXNGcm9tQ1NWUmVxdWVzdCgpO1xuICAgIEFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UucGFyZW50ID0gX2luc3RhbmNlLnBhcmVudCB8fCAnJztcbiAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX2luc3RhbmNlLmxhbmd1YWdlQ29kZSB8fCAnJztcbiAgICBfaW5zdGFuY2UuY3N2Q29udGVudHMgPSBfaW5zdGFuY2UuY3N2Q29udGVudHMgfHwgbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICBfaW5zdGFuY2UuZXh0cmFjdEVudGl0aWVzID0gX2luc3RhbmNlLmV4dHJhY3RFbnRpdGllcyB8fCBmYWxzZTtcbiAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgfHwgJyc7XG4gICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgPVxuICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgfHwgdW5kZWZpbmVkO1xuICAgIF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMgPSBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBBZGRUcmFpbmluZ1BocmFzZXNGcm9tQ1NWUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UucGFyZW50ID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UuY3N2Q29udGVudHMgPSBfcmVhZGVyLnJlYWRCeXRlcygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgX2luc3RhbmNlLmV4dHJhY3RFbnRpdGllcyA9IF9yZWFkZXIucmVhZEJvb2woKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgPSBuZXcgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucygpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyxcbiAgICAgICAgICAgIFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMgPSBfcmVhZGVyLnJlYWRJbnQzMigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBBZGRUcmFpbmluZ1BocmFzZXNGcm9tQ1NWUmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5wYXJlbnQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnBhcmVudCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmNzdkNvbnRlbnRzICYmIF9pbnN0YW5jZS5jc3ZDb250ZW50cy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVCeXRlcygzLCBfaW5zdGFuY2UuY3N2Q29udGVudHMpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmV4dHJhY3RFbnRpdGllcykge1xuICAgICAgX3dyaXRlci53cml0ZUJvb2woNCwgX2luc3RhbmNlLmV4dHJhY3RFbnRpdGllcyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoNSwgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgNixcbiAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgYXMgYW55LFxuICAgICAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLm51bWJlck9mV29ya2Vycykge1xuICAgICAgX3dyaXRlci53cml0ZUludDMyKDcsIF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3BhcmVudD86IHN0cmluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICBwcml2YXRlIF9jc3ZDb250ZW50cz86IFVpbnQ4QXJyYXk7XG4gIHByaXZhdGUgX2V4dHJhY3RFbnRpdGllcz86IGJvb2xlYW47XG4gIHByaXZhdGUgX3NwZWNpYWxDaGFyYWN0ZXJzPzogc3RyaW5nO1xuICBwcml2YXRlIF90cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zPzogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucztcbiAgcHJpdmF0ZSBfbnVtYmVyT2ZXb3JrZXJzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8QWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3QuQXNPYmplY3Q+XG4gICkge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnBhcmVudCA9IF92YWx1ZS5wYXJlbnQ7XG4gICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBfdmFsdWUubGFuZ3VhZ2VDb2RlO1xuICAgIHRoaXMuY3N2Q29udGVudHMgPSBfdmFsdWUuY3N2Q29udGVudHM7XG4gICAgdGhpcy5leHRyYWN0RW50aXRpZXMgPSBfdmFsdWUuZXh0cmFjdEVudGl0aWVzO1xuICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMgPSBfdmFsdWUuc3BlY2lhbENoYXJhY3RlcnM7XG4gICAgdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID0gX3ZhbHVlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnNcbiAgICAgID8gbmV3IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoX3ZhbHVlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm51bWJlck9mV29ya2VycyA9IF92YWx1ZS5udW1iZXJPZldvcmtlcnM7XG4gICAgQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBwYXJlbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICB9XG4gIHNldCBwYXJlbnQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhcmVudCA9IHZhbHVlO1xuICB9XG4gIGdldCBsYW5ndWFnZUNvZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VDb2RlO1xuICB9XG4gIHNldCBsYW5ndWFnZUNvZGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2xhbmd1YWdlQ29kZSA9IHZhbHVlO1xuICB9XG4gIGdldCBjc3ZDb250ZW50cygpOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY3N2Q29udGVudHM7XG4gIH1cbiAgc2V0IGNzdkNvbnRlbnRzKHZhbHVlOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY3N2Q29udGVudHMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZXh0cmFjdEVudGl0aWVzKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9leHRyYWN0RW50aXRpZXM7XG4gIH1cbiAgc2V0IGV4dHJhY3RFbnRpdGllcyh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2V4dHJhY3RFbnRpdGllcyA9IHZhbHVlO1xuICB9XG4gIGdldCBzcGVjaWFsQ2hhcmFjdGVycygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zcGVjaWFsQ2hhcmFjdGVycztcbiAgfVxuICBzZXQgc3BlY2lhbENoYXJhY3RlcnModmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3NwZWNpYWxDaGFyYWN0ZXJzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoKTogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM7XG4gIH1cbiAgc2V0IHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoXG4gICAgdmFsdWU6IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyA9IHZhbHVlO1xuICB9XG4gIGdldCBudW1iZXJPZldvcmtlcnMoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZXb3JrZXJzO1xuICB9XG4gIHNldCBudW1iZXJPZldvcmtlcnModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX251bWJlck9mV29ya2VycyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIEFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBjc3ZDb250ZW50czogdGhpcy5jc3ZDb250ZW50c1xuICAgICAgICA/IHRoaXMuY3N2Q29udGVudHMuc3ViYXJyYXkoMClcbiAgICAgICAgOiBuZXcgVWludDhBcnJheSgpLFxuICAgICAgZXh0cmFjdEVudGl0aWVzOiB0aGlzLmV4dHJhY3RFbnRpdGllcyxcbiAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLFxuICAgICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uczogdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zXG4gICAgICAgID8gdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnRvT2JqZWN0KClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBudW1iZXJPZldvcmtlcnM6IHRoaXMubnVtYmVyT2ZXb3JrZXJzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSxcbiAgICAgIGNzdkNvbnRlbnRzOiB0aGlzLmNzdkNvbnRlbnRzID8gdWludDhBcnJheVRvQmFzZTY0KHRoaXMuY3N2Q29udGVudHMpIDogJycsXG4gICAgICBleHRyYWN0RW50aXRpZXM6IHRoaXMuZXh0cmFjdEVudGl0aWVzLFxuICAgICAgc3BlY2lhbENoYXJhY3RlcnM6IHRoaXMuc3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zOiB0aGlzLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnNcbiAgICAgICAgPyB0aGlzLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgOiBudWxsLFxuICAgICAgbnVtYmVyT2ZXb3JrZXJzOiB0aGlzLm51bWJlck9mV29ya2Vyc1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIEFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICAgIGNzdkNvbnRlbnRzPzogVWludDhBcnJheTtcbiAgICBleHRyYWN0RW50aXRpZXM/OiBib29sZWFuO1xuICAgIHNwZWNpYWxDaGFyYWN0ZXJzPzogc3RyaW5nO1xuICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM/OiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLkFzT2JqZWN0O1xuICAgIG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBBZGRUcmFpbmluZ1BocmFzZXNGcm9tQ1NWUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgcGFyZW50Pzogc3RyaW5nO1xuICAgIGxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICBjc3ZDb250ZW50cz86IHN0cmluZztcbiAgICBleHRyYWN0RW50aXRpZXM/OiBib29sZWFuO1xuICAgIHNwZWNpYWxDaGFyYWN0ZXJzPzogc3RyaW5nO1xuICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM/OiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICBudW1iZXJPZldvcmtlcnM/OiBudW1iZXI7XG4gIH1cbn1cbiJdfQ==
|