@aerokit/sdk 12.78.0 → 12.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/cjs/bpm/process.js +4 -1
  2. package/dist/cjs/bpm/tasks.js +3 -1
  3. package/dist/cjs/bpm/tracer.js +3 -1
  4. package/dist/cjs/cms/cmis.js +105 -177
  5. package/dist/cjs/db/database.js +5 -1
  6. package/dist/cjs/db/query.js +19 -1
  7. package/dist/cjs/db/repository.js +2 -1
  8. package/dist/cjs/db/sql.js +5 -2
  9. package/dist/cjs/etcd/client.js +4 -1
  10. package/dist/cjs/http/errors/ForbiddenError.js +9 -9
  11. package/dist/cjs/http/errors/ValidationError.js +9 -9
  12. package/dist/cjs/http/request.js +2 -1
  13. package/dist/cjs/http/response.js +102 -188
  14. package/dist/cjs/http/rs/resource-http-controller.js +4 -1
  15. package/dist/cjs/http/rs/resource-mappings.js +6 -3
  16. package/dist/cjs/http/rs/resource-method.js +10 -1
  17. package/dist/cjs/http/rs/resource.js +11 -1
  18. package/dist/cjs/http/upload.js +3 -1
  19. package/dist/cjs/io/files.js +5 -7
  20. package/dist/cjs/io/streams.js +5 -1
  21. package/dist/cjs/io/zip.js +4 -1
  22. package/dist/cjs/job/scheduler.js +4 -1
  23. package/dist/cjs/kafka/consumer.js +3 -2
  24. package/dist/cjs/kafka/producer.js +3 -1
  25. package/dist/cjs/log/logging.js +2 -1
  26. package/dist/cjs/mail/client.js +2 -1
  27. package/dist/cjs/messaging/consumer.js +3 -1
  28. package/dist/cjs/messaging/producer.js +3 -1
  29. package/dist/cjs/mongodb/client.js +26 -1
  30. package/dist/cjs/mongodb/dao.js +3 -1
  31. package/dist/cjs/net/soap.js +15 -1
  32. package/dist/cjs/net/websockets.js +5 -1
  33. package/dist/cjs/platform/engines.js +2 -1
  34. package/dist/cjs/platform/os.js +7 -9
  35. package/dist/cjs/platform/problems.js +7 -13
  36. package/dist/cjs/platform/registry.js +4 -1
  37. package/dist/cjs/platform/repository.js +4 -1
  38. package/dist/cjs/platform/workspace.js +8 -1
  39. package/dist/cjs/redis/client.js +2 -1
  40. package/dist/cjs/security/oauth.js +2 -1
  41. package/dist/cjs/template/engines.js +6 -1
  42. package/dist/dts/db/query.d.ts +10 -0
  43. package/dist/esm/bpm/process.mjs +4 -1
  44. package/dist/esm/bpm/tasks.mjs +3 -1
  45. package/dist/esm/bpm/tracer.mjs +3 -1
  46. package/dist/esm/cms/cmis.mjs +105 -177
  47. package/dist/esm/db/database.mjs +5 -1
  48. package/dist/esm/db/query.mjs +19 -1
  49. package/dist/esm/db/repository.mjs +2 -1
  50. package/dist/esm/db/sql.mjs +5 -2
  51. package/dist/esm/etcd/client.mjs +4 -1
  52. package/dist/esm/http/errors/ForbiddenError.mjs +9 -9
  53. package/dist/esm/http/errors/ValidationError.mjs +9 -9
  54. package/dist/esm/http/request.mjs +2 -1
  55. package/dist/esm/http/response.mjs +102 -188
  56. package/dist/esm/http/rs/resource-http-controller.mjs +4 -1
  57. package/dist/esm/http/rs/resource-mappings.mjs +6 -3
  58. package/dist/esm/http/rs/resource-method.mjs +10 -1
  59. package/dist/esm/http/rs/resource.mjs +11 -1
  60. package/dist/esm/http/upload.mjs +3 -1
  61. package/dist/esm/io/files.mjs +5 -7
  62. package/dist/esm/io/streams.mjs +5 -1
  63. package/dist/esm/io/zip.mjs +4 -1
  64. package/dist/esm/job/scheduler.mjs +4 -1
  65. package/dist/esm/kafka/consumer.mjs +3 -2
  66. package/dist/esm/kafka/producer.mjs +3 -1
  67. package/dist/esm/log/logging.mjs +2 -1
  68. package/dist/esm/mail/client.mjs +2 -1
  69. package/dist/esm/messaging/consumer.mjs +3 -1
  70. package/dist/esm/messaging/producer.mjs +3 -1
  71. package/dist/esm/mongodb/client.mjs +26 -1
  72. package/dist/esm/mongodb/dao.mjs +3 -1
  73. package/dist/esm/net/soap.mjs +15 -1
  74. package/dist/esm/net/websockets.mjs +5 -1
  75. package/dist/esm/platform/engines.mjs +2 -1
  76. package/dist/esm/platform/os.mjs +7 -9
  77. package/dist/esm/platform/problems.mjs +7 -13
  78. package/dist/esm/platform/registry.mjs +4 -1
  79. package/dist/esm/platform/repository.mjs +4 -1
  80. package/dist/esm/platform/workspace.mjs +8 -1
  81. package/dist/esm/redis/client.mjs +2 -1
  82. package/dist/esm/security/oauth.mjs +2 -1
  83. package/dist/esm/template/engines.mjs +6 -1
  84. package/package.json +1 -1
@@ -25,195 +25,109 @@ const HttpResponseFacade = Java.type("org.eclipse.dirigible.components.api.http.
25
25
  const OutputStreamWriter = Java.type("java.io.OutputStreamWriter");
26
26
  const StandardCharsets = Java.type("java.nio.charset.StandardCharsets");
27
27
  class Response {
28
- static {
29
- // --- Standard HTTP Status Code Constants (Informational, Success, Redirection, Client Error, Server Error) ---
30
- this.ACCEPTED = 202;
31
- }
32
- static {
33
- this.BAD_GATEWAY = 502;
34
- }
35
- static {
36
- this.BAD_REQUEST = 400;
37
- }
38
- static {
39
- this.CONFLICT = 409;
40
- }
41
- static {
42
- this.CONTINUE = 100;
43
- }
44
- static {
45
- this.CREATED = 201;
46
- }
47
- static {
48
- this.EXPECTATION_FAILED = 417;
49
- }
50
- static {
51
- this.FORBIDDEN = 403;
52
- }
53
- static {
54
- this.FOUND = 302;
55
- }
56
- static {
57
- this.GATEWAY_TIMEOUT = 504;
58
- }
59
- static {
60
- this.GONE = 410;
61
- }
62
- static {
63
- this.HTTP_VERSION_NOT_SUPPORTED = 505;
64
- }
65
- static {
66
- this.INTERNAL_SERVER_ERROR = 500;
67
- }
68
- static {
69
- this.LENGTH_REQUIRED = 411;
70
- }
71
- static {
72
- this.METHOD_NOT_ALLOWED = 405;
73
- }
74
- static {
75
- this.MOVED_PERMANENTLY = 301;
76
- }
77
- static {
78
- this.MOVED_TEMPORARILY = 302;
79
- }
80
- static {
81
- this.MULTIPLE_CHOICES = 300;
82
- }
83
- static {
84
- this.NO_CONTENT = 204;
85
- }
86
- static {
87
- this.NON_AUTHORITATIVE_INFORMATION = 203;
88
- }
89
- static {
90
- this.NOT_ACCEPTABLE = 406;
91
- }
92
- static {
93
- this.NOT_FOUND = 404;
94
- }
95
- static {
96
- this.NOT_IMPLEMENTED = 501;
97
- }
98
- static {
99
- this.NOT_MODIFIED = 304;
100
- }
101
- static {
102
- this.OK = 200;
103
- }
104
- static {
105
- this.PARTIAL_CONTENT = 206;
106
- }
107
- static {
108
- this.PAYMENT_REQUIRED = 402;
109
- }
110
- static {
111
- this.PRECONDITION_FAILED = 412;
112
- }
113
- static {
114
- this.PROXY_AUTHENTICATION_REQUIRED = 407;
115
- }
116
- static {
117
- this.REQUEST_ENTITY_TOO_LARGE = 413;
118
- }
119
- static {
120
- this.REQUEST_TIMEOUT = 408;
121
- }
122
- static {
123
- this.REQUEST_URI_TOO_LONG = 414;
124
- }
125
- static {
126
- this.REQUESTED_RANGE_NOT_SATISFIABLE = 416;
127
- }
128
- static {
129
- this.RESET_CONTENT = 205;
130
- }
131
- static {
132
- this.SEE_OTHER = 303;
133
- }
134
- static {
135
- this.SERVICE_UNAVAILABLE = 503;
136
- }
137
- static {
138
- this.SWITCHING_PROTOCOLS = 101;
139
- }
140
- static {
141
- this.TEMPORARY_REDIRECT = 307;
142
- }
143
- static {
144
- this.UNAUTHORIZED = 401;
145
- }
146
- static {
147
- this.UNSUPPORTED_MEDIA_TYPE = 415;
148
- }
149
- static {
150
- this.USE_PROXY = 305;
151
- }
152
- static {
153
- this.UNPROCESSABLE_CONTENT = 422;
154
- }
155
- static {
28
+ // --- Standard HTTP Status Code Constants (Informational, Success, Redirection, Client Error, Server Error) ---
29
+ static ACCEPTED = 202;
30
+ static BAD_GATEWAY = 502;
31
+ static BAD_REQUEST = 400;
32
+ static CONFLICT = 409;
33
+ static CONTINUE = 100;
34
+ static CREATED = 201;
35
+ static EXPECTATION_FAILED = 417;
36
+ static FORBIDDEN = 403;
37
+ static FOUND = 302;
38
+ static GATEWAY_TIMEOUT = 504;
39
+ static GONE = 410;
40
+ static HTTP_VERSION_NOT_SUPPORTED = 505;
41
+ static INTERNAL_SERVER_ERROR = 500;
42
+ static LENGTH_REQUIRED = 411;
43
+ static METHOD_NOT_ALLOWED = 405;
44
+ static MOVED_PERMANENTLY = 301;
45
+ static MOVED_TEMPORARILY = 302;
46
+ static MULTIPLE_CHOICES = 300;
47
+ static NO_CONTENT = 204;
48
+ static NON_AUTHORITATIVE_INFORMATION = 203;
49
+ static NOT_ACCEPTABLE = 406;
50
+ static NOT_FOUND = 404;
51
+ static NOT_IMPLEMENTED = 501;
52
+ static NOT_MODIFIED = 304;
53
+ static OK = 200;
54
+ static PARTIAL_CONTENT = 206;
55
+ static PAYMENT_REQUIRED = 402;
56
+ static PRECONDITION_FAILED = 412;
57
+ static PROXY_AUTHENTICATION_REQUIRED = 407;
58
+ static REQUEST_ENTITY_TOO_LARGE = 413;
59
+ static REQUEST_TIMEOUT = 408;
60
+ static REQUEST_URI_TOO_LONG = 414;
61
+ static REQUESTED_RANGE_NOT_SATISFIABLE = 416;
62
+ static RESET_CONTENT = 205;
63
+ static SEE_OTHER = 303;
64
+ static SERVICE_UNAVAILABLE = 503;
65
+ static SWITCHING_PROTOCOLS = 101;
66
+ static TEMPORARY_REDIRECT = 307;
67
+ static UNAUTHORIZED = 401;
68
+ static UNSUPPORTED_MEDIA_TYPE = 415;
69
+ static USE_PROXY = 305;
70
+ static UNPROCESSABLE_CONTENT = 422;
71
+ /**
72
+ * Mapping between HTTP response codes (string) and their corresponding reason-phrases
73
+ * as defined in RFC 7231, section 6.1.
74
+ */
75
+ static HttpCodesReasons = {
76
+ "100": "Continue",
77
+ "101": "Switching Protocols",
78
+ "200": "OK",
79
+ "201": "Created",
80
+ "202": "Accepted",
81
+ "203": "Non-Authoritative Information",
82
+ "204": "No Content",
83
+ "205": "Reset Content",
84
+ "206": "Partial Content",
85
+ "300": "Multiple Choices",
86
+ "301": "Moved Permanently",
87
+ "302": "Found",
88
+ "303": "See Other",
89
+ "304": "Not Modified",
90
+ "305": "Use Proxy",
91
+ "307": "Temporary Redirect",
92
+ "400": "Bad Request",
93
+ "401": "Unauthorized",
94
+ "402": "Payment Required",
95
+ "403": "Forbidden",
96
+ "404": "Not Found",
97
+ "405": "Method Not Allowed",
98
+ "406": "Not Acceptable",
99
+ "407": "Proxy Authentication Required",
100
+ "408": "Request Timeout",
101
+ "409": "Conflict",
102
+ "410": "Gone",
103
+ "411": "Length Required",
104
+ "412": "Precondition Failed",
105
+ "413": "Payload Too Large",
106
+ "414": "URI Too Large",
107
+ "415": "Unsupported Media Type",
108
+ "416": "Range Not Satisfiable",
109
+ "417": "Expectation Failed",
110
+ "422": "Unprocessable Content",
111
+ "426": "Upgrade Required",
112
+ "500": "Internal Server Error",
113
+ "501": "Not Implemented",
114
+ "502": "Bad Gateway",
115
+ "503": "Service Unavailable",
116
+ "504": "Gateway Timmeout",
117
+ "505": "HTTP Version Not Supported",
156
118
  /**
157
- * Mapping between HTTP response codes (string) and their corresponding reason-phrases
158
- * as defined in RFC 7231, section 6.1.
159
- */
160
- this.HttpCodesReasons = {
161
- "100": "Continue",
162
- "101": "Switching Protocols",
163
- "200": "OK",
164
- "201": "Created",
165
- "202": "Accepted",
166
- "203": "Non-Authoritative Information",
167
- "204": "No Content",
168
- "205": "Reset Content",
169
- "206": "Partial Content",
170
- "300": "Multiple Choices",
171
- "301": "Moved Permanently",
172
- "302": "Found",
173
- "303": "See Other",
174
- "304": "Not Modified",
175
- "305": "Use Proxy",
176
- "307": "Temporary Redirect",
177
- "400": "Bad Request",
178
- "401": "Unauthorized",
179
- "402": "Payment Required",
180
- "403": "Forbidden",
181
- "404": "Not Found",
182
- "405": "Method Not Allowed",
183
- "406": "Not Acceptable",
184
- "407": "Proxy Authentication Required",
185
- "408": "Request Timeout",
186
- "409": "Conflict",
187
- "410": "Gone",
188
- "411": "Length Required",
189
- "412": "Precondition Failed",
190
- "413": "Payload Too Large",
191
- "414": "URI Too Large",
192
- "415": "Unsupported Media Type",
193
- "416": "Range Not Satisfiable",
194
- "417": "Expectation Failed",
195
- "422": "Unprocessable Content",
196
- "426": "Upgrade Required",
197
- "500": "Internal Server Error",
198
- "501": "Not Implemented",
199
- "502": "Bad Gateway",
200
- "503": "Service Unavailable",
201
- "504": "Gateway Timmeout",
202
- "505": "HTTP Version Not Supported",
203
- /**
204
- * Utility method that accepts an HTTP code and returns its corresponding reason-phrase.
205
- * @param code The HTTP status code (number).
206
- * @returns The reason phrase string.
207
- * @throws Error if the code is not a valid integer in the range [100-505].
208
- */
209
- getReason: (code) => {
210
- if (isNaN(code) || code < 100 || code > 505) {
211
- throw Error("Illegal argument for code[" + code + "]. Valid HTTP codes are integer numbers in the range [100-505].");
212
- }
213
- return Response.HttpCodesReasons[String(code)];
119
+ * Utility method that accepts an HTTP code and returns its corresponding reason-phrase.
120
+ * @param code The HTTP status code (number).
121
+ * @returns The reason phrase string.
122
+ * @throws Error if the code is not a valid integer in the range [100-505].
123
+ */
124
+ getReason: (code) => {
125
+ if (isNaN(code) || code < 100 || code > 505) {
126
+ throw Error("Illegal argument for code[" + code + "]. Valid HTTP codes are integer numbers in the range [100-505].");
214
127
  }
215
- };
216
- }
128
+ return Response.HttpCodesReasons[String(code)];
129
+ }
130
+ };
217
131
  /**
218
132
  * Checks if the response façade is currently valid or connected to an active request context.
219
133
  * @returns True if valid, false otherwise.
@@ -449,4 +363,4 @@ class Response {
449
363
  if (typeof module !== "undefined") {
450
364
  module.exports = Response;
451
365
  }
452
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2h0dHAvcmVzcG9uc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogUHJvdmlkZXMgYSBzdGF0aWMgZmFcdTAwRTdhZGUgKGBSZXNwb25zZWAgY2xhc3MpIGZvciBtYW5hZ2luZyB0aGUgSFRUUCByZXNwb25zZS5cbiAqIFRoaXMgY2xhc3Mgd3JhcHMgYSBuYXRpdmUgSmF2YSBIVFRQIHJlc3BvbnNlIG9iamVjdCwgb2ZmZXJpbmcgbWV0aG9kcyBmb3Igc2V0dGluZ1xuICogc3RhdHVzIGNvZGVzLCBoZWFkZXJzLCBjb29raWVzLCBhbmQgd3JpdGluZyBjb250ZW50ICh0ZXh0LCBKU09OLCBvciBiaW5hcnkpLlxuICovXG5cbmltcG9ydCB7IE91dHB1dFN0cmVhbSB9IGZyb20gXCJAYWVyb2tpdC9zZGsvaW8vc3RyZWFtc1wiXG5cbmNvbnN0IEh0dHBSZXNwb25zZUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5odHRwLkh0dHBSZXNwb25zZUZhY2FkZVwiKTtcbmNvbnN0IE91dHB1dFN0cmVhbVdyaXRlciA9IEphdmEudHlwZShcImphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyXCIpO1xuY29uc3QgU3RhbmRhcmRDaGFyc2V0cyA9IEphdmEudHlwZShcImphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0c1wiKTtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgZm9yIGFuIEhUVFAgY29va2llLCBpbmNsdWRpbmcgaXRzIG5hbWUsIHZhbHVlLCBhbmQgb3B0aW9uYWwgYXR0cmlidXRlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb29raWUge1xuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29va2llLiAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHZhbHVlIG9mIHRoZSBjb29raWUuICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKiogS2V5LXZhbHVlIG1hcCBvZiBjb29raWUgYXR0cmlidXRlcyAoZS5nLiwgJ21heEFnZScsICdwYXRoJywgJ2RvbWFpbicsICdzZWN1cmUnLCAnaHR0cE9ubHknKS4gKi9cbiAgICBhdHRyaWJ1dGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuIH1cblxuLyoqXG4gKiBUaGUgc3RhdGljIFJlc3BvbnNlIGNsYXNzIHByb3ZpZGluZyBzdGFuZGFyZGl6ZWQgSFRUUCBzdGF0dXMgY29kZXMgYW5kIG1ldGhvZHNcbiAqIGZvciBjb25zdHJ1Y3RpbmcgdGhlIHNlcnZlcidzIHJlc3BvbnNlLlxuICovXG5leHBvcnQgY2xhc3MgUmVzcG9uc2Uge1xuXG4gICAgLy8gLS0tIFN0YW5kYXJkIEhUVFAgU3RhdHVzIENvZGUgQ29uc3RhbnRzIChJbmZvcm1hdGlvbmFsLCBTdWNjZXNzLCBSZWRpcmVjdGlvbiwgQ2xpZW50IEVycm9yLCBTZXJ2ZXIgRXJyb3IpIC0tLVxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBBQ0NFUFRFRCA9IDIwMjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJBRF9HQVRFV0FZID0gNTAyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQkFEX1JFUVVFU1QgPSA0MDA7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT05GTElDVCA9IDQwOTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENPTlRJTlVFID0gMTAwO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ1JFQVRFRCA9IDIwMTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVYUEVDVEFUSU9OX0ZBSUxFRCA9IDQxNztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZPUkJJRERFTiA9IDQwMztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZPVU5EID0gMzAyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR0FURVdBWV9USU1FT1VUID0gNTA0O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR09ORSA9IDQxMDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEID0gNTA1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSU5URVJOQUxfU0VSVkVSX0VSUk9SID0gNTAwO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTEVOR1RIX1JFUVVJUkVEID0gNDExO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUVUSE9EX05PVF9BTExPV0VEID0gNDA1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTU9WRURfUEVSTUFORU5UTFkgPSAzMDE7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBNT1ZFRF9URU1QT1JBUklMWSA9IDMwMjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1VTFRJUExFX0NIT0lDRVMgPSAzMDA7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBOT19DT05URU5UID0gMjA0O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04gPSAyMDM7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBOT1RfQUNDRVBUQUJMRSA9IDQwNjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5PVF9GT1VORCA9IDQwNDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5PVF9JTVBMRU1FTlRFRCA9IDUwMTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5PVF9NT0RJRklFRCA9IDMwNDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE9LID0gMjAwO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUEFSVElBTF9DT05URU5UID0gMjA2O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUEFZTUVOVF9SRVFVSVJFRCA9IDQwMjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBSRUNPTkRJVElPTl9GQUlMRUQgPSA0MTI7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRCA9IDQwNztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFUVVFU1RfRU5USVRZX1RPT19MQVJHRSA9IDQxMztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFUVVFU1RfVElNRU9VVCA9IDQwODtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFUVVFU1RfVVJJX1RPT19MT05HID0gNDE0O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSA9IDQxNjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFU0VUX0NPTlRFTlQgPSAyMDU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRUVfT1RIRVIgPSAzMDM7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRVJWSUNFX1VOQVZBSUxBQkxFID0gNTAzO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1dJVENISU5HX1BST1RPQ09MUyA9IDEwMTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRFTVBPUkFSWV9SRURJUkVDVCA9IDMwNztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFVOQVVUSE9SSVpFRCA9IDQwMTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFVOU1VQUE9SVEVEX01FRElBX1RZUEUgPSA0MTU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBVU0VfUFJPWFkgPSAzMDU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBVTlBST0NFU1NBQkxFX0NPTlRFTlQgPSA0MjI7XG5cbiAgICAvKipcbiAgICAgKiBNYXBwaW5nIGJldHdlZW4gSFRUUCByZXNwb25zZSBjb2RlcyAoc3RyaW5nKSBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyByZWFzb24tcGhyYXNlc1xuICAgICAqIGFzIGRlZmluZWQgaW4gUkZDIDcyMzEsIHNlY3Rpb24gNi4xLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSHR0cENvZGVzUmVhc29ucyA9IHtcbiAgICAgICAgXCIxMDBcIjogXCJDb250aW51ZVwiLCBcIjEwMVwiOiBcIlN3aXRjaGluZyBQcm90b2NvbHNcIiwgXCIyMDBcIjogXCJPS1wiLCBcIjIwMVwiOiBcIkNyZWF0ZWRcIixcbiAgICAgICAgXCIyMDJcIjogXCJBY2NlcHRlZFwiLCBcIjIwM1wiOiBcIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uXCIsIFwiMjA0XCI6IFwiTm8gQ29udGVudFwiLFxuICAgICAgICBcIjIwNVwiOiBcIlJlc2V0IENvbnRlbnRcIiwgXCIyMDZcIjogXCJQYXJ0aWFsIENvbnRlbnRcIiwgXCIzMDBcIjogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gICAgICAgIFwiMzAxXCI6IFwiTW92ZWQgUGVybWFuZW50bHlcIiwgXCIzMDJcIjogXCJGb3VuZFwiLCBcIjMwM1wiOiBcIlNlZSBPdGhlclwiLCBcIjMwNFwiOiBcIk5vdCBNb2RpZmllZFwiLFxuICAgICAgICBcIjMwNVwiOiBcIlVzZSBQcm94eVwiLCBcIjMwN1wiOiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLCBcIjQwMFwiOiBcIkJhZCBSZXF1ZXN0XCIsXG4gICAgICAgIFwiNDAxXCI6IFwiVW5hdXRob3JpemVkXCIsIFwiNDAyXCI6IFwiUGF5bWVudCBSZXF1aXJlZFwiLCBcIjQwM1wiOiBcIkZvcmJpZGRlblwiLFxuICAgICAgICBcIjQwNFwiOiBcIk5vdCBGb3VuZFwiLCBcIjQwNVwiOiBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLCBcIjQwNlwiOiBcIk5vdCBBY2NlcHRhYmxlXCIsXG4gICAgICAgIFwiNDA3XCI6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIiwgXCI0MDhcIjogXCJSZXF1ZXN0IFRpbWVvdXRcIiwgXCI0MDlcIjogXCJDb25mbGljdFwiLFxuICAgICAgICBcIjQxMFwiOiBcIkdvbmVcIiwgXCI0MTFcIjogXCJMZW5ndGggUmVxdWlyZWRcIiwgXCI0MTJcIjogXCJQcmVjb25kaXRpb24gRmFpbGVkXCIsXG4gICAgICAgIFwiNDEzXCI6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIiwgXCI0MTRcIjogXCJVUkkgVG9vIExhcmdlXCIsIFwiNDE1XCI6IFwiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVwiLFxuICAgICAgICBcIjQxNlwiOiBcIlJhbmdlIE5vdCBTYXRpc2ZpYWJsZVwiLCBcIjQxN1wiOiBcIkV4cGVjdGF0aW9uIEZhaWxlZFwiLCBcIjQyMlwiOiBcIlVucHJvY2Vzc2FibGUgQ29udGVudFwiLFxuICAgICAgICBcIjQyNlwiOiBcIlVwZ3JhZGUgUmVxdWlyZWRcIiwgXCI1MDBcIjogXCJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcIiwgXCI1MDFcIjogXCJOb3QgSW1wbGVtZW50ZWRcIixcbiAgICAgICAgXCI1MDJcIjogXCJCYWQgR2F0ZXdheVwiLCBcIjUwM1wiOiBcIlNlcnZpY2UgVW5hdmFpbGFibGVcIiwgXCI1MDRcIjogXCJHYXRld2F5IFRpbW1lb3V0XCIsXG4gICAgICAgIFwiNTA1XCI6IFwiSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWRcIixcblxuICAgICAgICAvKipcbiAgICAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGFjY2VwdHMgYW4gSFRUUCBjb2RlIGFuZCByZXR1cm5zIGl0cyBjb3JyZXNwb25kaW5nIHJlYXNvbi1waHJhc2UuXG4gICAgICAgICogQHBhcmFtIGNvZGUgVGhlIEhUVFAgc3RhdHVzIGNvZGUgKG51bWJlcikuXG4gICAgICAgICogQHJldHVybnMgVGhlIHJlYXNvbiBwaHJhc2Ugc3RyaW5nLlxuICAgICAgICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGNvZGUgaXMgbm90IGEgdmFsaWQgaW50ZWdlciBpbiB0aGUgcmFuZ2UgWzEwMC01MDVdLlxuICAgICAgICAqL1xuICAgICAgICBnZXRSZWFzb246IChjb2RlOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgICAgICAgaWYgKGlzTmFOKGNvZGUpIHx8IGNvZGUgPCAxMDAgfHwgY29kZSA+IDUwNSkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50IGZvciBjb2RlWycgKyBjb2RlICsgJ10uIFZhbGlkIEhUVFAgY29kZXMgYXJlIGludGVnZXIgbnVtYmVycyBpbiB0aGUgcmFuZ2UgWzEwMC01MDVdLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuSHR0cENvZGVzUmVhc29uc1tTdHJpbmcoY29kZSldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSByZXNwb25zZSBmYVx1MDBFN2FkZSBpcyBjdXJyZW50bHkgdmFsaWQgb3IgY29ubmVjdGVkIHRvIGFuIGFjdGl2ZSByZXF1ZXN0IGNvbnRleHQuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5pc1ZhbGlkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIEphdmFTY3JpcHQgb2JqZWN0IHRvIEpTT04sIHNldHMgdGhlIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25gIGhlYWRlcixcbiAgICAgKiBhbmQgd3JpdGVzIHRoZSBKU09OIHN0cmluZyB0byB0aGUgcmVzcG9uc2Ugb3V0cHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0gb2JqIFRoZSBKYXZhU2NyaXB0IG9iamVjdCB0byBiZSBzZXJpYWxpemVkIGFuZCBzZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMganNvbihvYmo6IGFueSk6IHZvaWQge1xuICAgICAgICBSZXNwb25zZS5hZGRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpXG4gICAgICAgIGNvbnN0IG9iakpzb24gPSBKU09OLnN0cmluZ2lmeShvYmopO1xuICAgICAgICBSZXNwb25zZS5wcmludChvYmpKc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBzdHJpbmcgb2YgdGV4dCB0byB0aGUgcmVzcG9uc2UgYm9keSB1c2luZyAqKlVURi04KiogZW5jb2RpbmcuXG4gICAgICogTm90ZTogVGhpcyBtZXRob2QgYXV0b21hdGljYWxseSBoYW5kbGVzIGZsdXNoaW5nIHRoZSBvdXRwdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBzdHJpbmcgY29udGVudCB0byB3cml0ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHByaW50KHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0ZXh0ID0gKHRleHQgJiYgdGV4dC50b1N0cmluZygpKSB8fCBcIlwiO1xuICAgICAgICBjb25zdCBvdXQgPSBSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKS5uYXRpdmU7XG4gICAgICAgIC8vIFVzZSBKYXZhIEkvTyB0byBlbnN1cmUgZXhwbGljaXQgVVRGLTggZW5jb2RpbmdcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpO1xuICAgICAgICB3cml0ZXIud3JpdGUodGV4dCk7XG4gICAgICAgIHdyaXRlci5mbHVzaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHN0cmluZyBvZiB0ZXh0IGZvbGxvd2VkIGJ5IGEgbmV3bGluZSBjaGFyYWN0ZXIgKGBcXG5gKSB0byB0aGUgcmVzcG9uc2UgYm9keVxuICAgICAqIHVzaW5nICoqVVRGLTgqKiBlbmNvZGluZy5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgc3RyaW5nIGNvbnRlbnQgdG8gd3JpdGUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBwcmludGxuKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0ZXh0ID0gKHRleHQgJiYgdGV4dC50b1N0cmluZygpKSB8fCBcIlwiO1xuICAgICAgICBjb25zdCBvdXQgPSBSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKS5uYXRpdmU7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTtcbiAgICAgICAgd3JpdGVyLndyaXRlKHRleHQpO1xuICAgICAgICB3cml0ZXIud3JpdGUoXCJcXG5cIik7XG4gICAgICAgIHdyaXRlci5mbHVzaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBhcnJheSBvZiBieXRlcyBkaXJlY3RseSB0byB0aGUgcmVzcG9uc2Ugb3V0cHV0IHN0cmVhbSwgdHlwaWNhbGx5IHVzZWQgZm9yIGJpbmFyeSBkYXRhLlxuICAgICAqIEBwYXJhbSBieXRlcyBUaGUgYXJyYXkgb2YgYnl0ZXMgdG8gd3JpdGUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyB3cml0ZShieXRlczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFieXRlcykge1xuICAgICAgICAgICAgYnl0ZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUud3JpdGUoYnl0ZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgcmVzcG9uc2UgaGVhZGVycyBhbmQgc3RhdHVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlbnQgdG8gdGhlIGNsaWVudC5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSByZXNwb25zZSBpcyBjb21taXR0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQ29tbWl0dGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlRmFjYWRlLmlzQ29tbWl0dGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBDb250ZW50LVR5cGVgIGhlYWRlci5cbiAgICAgKiBAcGFyYW0gY29udGVudFR5cGUgVGhlIE1JTUUgdHlwZSBzdHJpbmcgKGUuZy4sICd0ZXh0L2h0bWwnLCAnYXBwbGljYXRpb24vcGRmJykuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzZXRDb250ZW50VHlwZShjb250ZW50VHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIEh0dHBSZXNwb25zZUZhY2FkZS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2VzIGFueSBidWZmZXJlZCBvdXRwdXQgdG8gYmUgd3JpdHRlbiB0byB0aGUgY2xpZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZmx1c2goKTogdm9pZCB7XG4gICAgICAgIEh0dHBSZXNwb25zZUZhY2FkZS5mbHVzaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgcmVzcG9uc2Ugb3V0cHV0IHN0cmVhbS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUuY2xvc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29va2llIHRvIHRoZSByZXNwb25zZS4gVGhlIGNvb2tpZSBvYmplY3QgaXMgc2VyaWFsaXplZCB0byBKU09OIGJlZm9yZSBiZWluZyBwYXNzZWRcbiAgICAgKiB0byB0aGUgdW5kZXJseWluZyBKYXZhIGZhY2FkZS5cbiAgICAgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUgZGVmaW5pdGlvbiBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhZGRDb29raWUoY29va2llOiBDb29raWUpOiB2b2lkIHtcbiAgICAgICAgSHR0cFJlc3BvbnNlRmFjYWRlLmFkZENvb2tpZShKU09OLnN0cmluZ2lmeShjb29raWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSByZXNwb25zZSBoZWFkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBzZXQuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGhlYWRlci5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBoZWFkZXIgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb250YWluc0hlYWRlcihuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5jb250YWluc0hlYWRlcihuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmNvZGVzIGEgVVJMIGZvciB1c2UgaW4gcmVkaXJlY3RzIG9yIGZvcm1zLCBpbmNsdWRpbmcgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIHRvIGVuY29kZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZW5jb2RlZCBVUkwgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZW5jb2RlVVJMKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5lbmNvZGVVUkwodXJsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCBmb3IgdGhlIHJlc3BvbnNlIGJvZHkuXG4gICAgICogQHJldHVybnMgVGhlIGNoYXJhY3RlciBlbmNvZGluZyBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlRmFjYWRlLmdldENoYXJhY3RlckVuY29kaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5jb2RlcyBhIFVSTCBmb3IgdXNlIGluIHRoZSBgTG9jYXRpb25gIGhlYWRlciBvZiBhIHJlZGlyZWN0IHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSB1cmwgVGhlIHJlZGlyZWN0IFVSTCB0byBlbmNvZGUuXG4gICAgICogQHJldHVybnMgVGhlIGVuY29kZWQgcmVkaXJlY3QgVVJMIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGVuY29kZVJlZGlyZWN0VVJMKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5lbmNvZGVSZWRpcmVjdFVSTCh1cmwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgYENvbnRlbnQtVHlwZWAgaGVhZGVyIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIFRoZSBjb250ZW50IHR5cGUgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udGVudFR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5nZXRDb250ZW50VHlwZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIEhUVFAgZXJyb3IgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhdHVzIGNvZGUgYW5kIG9wdGlvbmFsIG1lc3NhZ2UuXG4gICAgICogVGhpcyBieXBhc3NlcyB0aGUgbm9ybWFsIHJlc3BvbnNlIGJvZHkgd3JpdGluZyBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSBzdGF0dXMgVGhlIEhUVFAgc3RhdHVzIGNvZGUgKGUuZy4sIDQwNCwgNTAwKS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBBbiBvcHRpb25hbCBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGVycm9yIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2VuZEVycm9yKHN0YXR1czogbnVtYmVyLCBtZXNzYWdlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIEh0dHBSZXNwb25zZUZhY2FkZS5zZW5kRXJyb3Ioc3RhdHVzLCBtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZCBmb3IgdGhlIHJlc3BvbnNlIGJvZHkgKGUuZy4sICdVVEYtOCcpLlxuICAgICAqIEBwYXJhbSBjaGFyc2V0IFRoZSBjaGFyYWN0ZXIgc2V0IHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHNldENoYXJhY3RlckVuY29kaW5nKGNoYXJzZXQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoY2hhcnNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYSByZWRpcmVjdCByZXNwb25zZSAoc3RhdHVzIGNvZGUgMzAyIGJ5IGRlZmF1bHQpIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBuZXcgVVJMIHRvIHJlZGlyZWN0IHRoZSBjbGllbnQgdG8uXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzZW5kUmVkaXJlY3QobG9jYXRpb246IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUuc2VuZFJlZGlyZWN0KGxvY2F0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgQ29udGVudC1MZW5ndGhgIGhlYWRlciBmb3IgdGhlIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIHNpemUgb2YgdGhlIHJlc3BvbnNlIGJvZHkgaW4gYnl0ZXMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzZXRDb250ZW50TGVuZ3RoKGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIEh0dHBSZXNwb25zZUZhY2FkZS5zZXRDb250ZW50TGVuZ3RoKGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIHJlc3BvbnNlIGhlYWRlciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4gSWYgdGhlIGhlYWRlciBhbHJlYWR5IGV4aXN0cywgaXRzIHZhbHVlIGlzIG92ZXJ3cml0dGVuLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2V0SGVhZGVyKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcmVzcG9uc2UgaGVhZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlLiBJZiB0aGUgaGVhZGVyIGFscmVhZHkgZXhpc3RzLCBhIHNlY29uZCBoZWFkZXIgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGFkZGVkLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYWRkSGVhZGVyKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUuYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGZvciB0aGUgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIHN0YXR1cyBUaGUgaW50ZWdlciBzdGF0dXMgY29kZSAoZS5nLiwgMjAwLCA0MDQpLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2V0U3RhdHVzKHN0YXR1czogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIEh0dHBSZXNwb25zZUZhY2FkZS5zZXRTdGF0dXMoc3RhdHVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGJ1ZmZlcnMsIHN0YXR1cyBjb2RlLCBhbmQgaGVhZGVycyBmcm9tIHRoZSByZXNwb25zZSwgYWxsb3dpbmcgYSBuZXcgcmVzcG9uc2UgdG8gYmUgZ2VuZXJhdGVkLlxuICAgICAqIFRoaXMgaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgcmVzcG9uc2UgaGFzIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgSHR0cFJlc3BvbnNlRmFjYWRlLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBoZWFkZXIuIElmIG11bHRpcGxlIGhlYWRlcnMgd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXN0LCBpdCByZXR1cm5zIHRoZSBmaXJzdCBvbmUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGhlYWRlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgaGVhZGVyIHZhbHVlIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEhlYWRlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlRmFjYWRlLmdldEhlYWRlcihuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsb2NhbGUgZm9yIHRoZSByZXNwb25zZSwgd2hpY2ggbWF5IGFmZmVjdCBsYW5ndWFnZSBhbmQgZGF0ZS90aW1lIGZvcm1hdHRpbmcuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZSBjb2RlIChlLmcuLCAnZW4nLCAnZnInKS5cbiAgICAgKiBAcGFyYW0gY291bnRyeSBUaGUgb3B0aW9uYWwgY291bnRyeSBjb2RlIChlLmcuLCAnVVMnLCAnR0InKS5cbiAgICAgKiBAcGFyYW0gdmFyaWFudCBUaGUgb3B0aW9uYWwgdmFyaWFudCBjb2RlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2V0TG9jYWxlKGxhbmd1YWdlOiBzdHJpbmcsIGNvdW50cnk/OiBzdHJpbmcsIHZhcmlhbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5zZXRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnksIHZhcmlhbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGhlYWRlciB2YWx1ZXMgZm9yIGEgc3BlY2lmaWMgaGVhZGVyIG5hbWUgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaGVhZGVyLlxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGhlYWRlciB2YWx1ZXMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRIZWFkZXJzKG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSHR0cFJlc3BvbnNlRmFjYWRlLmdldEhlYWRlcnMobmFtZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hbWVzIG9mIGFsbCBoZWFkZXJzIHRoYXQgaGF2ZSBiZWVuIHNldCBvbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgaGVhZGVyIG5hbWVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SGVhZGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShIdHRwUmVzcG9uc2VGYWNhZGUuZ2V0SGVhZGVyTmFtZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudGx5IHNldCBsb2NhbGUgc3RyaW5nIGZvciB0aGUgcmVzcG9uc2UuXG4gICAgICogQHJldHVybnMgVGhlIGxvY2FsZSBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5nZXRMb2NhbGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gb2JqZWN0LCB3cmFwcGVkIGluIHRoZSBTREsncyBgT3V0cHV0U3RyZWFtYCBjbGFzcy5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3Igd3JpdGluZyByYXcgb3IgbGFyZ2UgYW1vdW50cyBvZiBkYXRhLlxuICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldE91dHB1dFN0cmVhbSgpOiBPdXRwdXRTdHJlYW0ge1xuICAgICAgICByZXR1cm4gbmV3IE91dHB1dFN0cmVhbShIdHRwUmVzcG9uc2VGYWNhZGUuZ2V0T3V0cHV0U3RyZWFtKCkpO1xuICAgIH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0bW9kdWxlLmV4cG9ydHMgPSBSZXNwb25zZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BLHFCQUE2QjtBQUU3QixNQUFNLHFCQUFxQixLQUFLLEtBQUssOERBQThEO0FBQ25HLE1BQU0scUJBQXFCLEtBQUssS0FBSyw0QkFBNEI7QUFDakUsTUFBTSxtQkFBbUIsS0FBSyxLQUFLLG1DQUFtQztBQWtCL0QsTUFBTSxTQUFTO0FBQUEsRUFJbEI7QUFBQTtB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
366
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2h0dHAvcmVzcG9uc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogUHJvdmlkZXMgYSBzdGF0aWMgZmFcdTAwRTdhZGUgKGBSZXNwb25zZWAgY2xhc3MpIGZvciBtYW5hZ2luZyB0aGUgSFRUUCByZXNwb25zZS5cbiAqIFRoaXMgY2xhc3Mgd3JhcHMgYSBuYXRpdmUgSmF2YSBIVFRQIHJlc3BvbnNlIG9iamVjdCwgb2ZmZXJpbmcgbWV0aG9kcyBmb3Igc2V0dGluZ1xuICogc3RhdHVzIGNvZGVzLCBoZWFkZXJzLCBjb29raWVzLCBhbmQgd3JpdGluZyBjb250ZW50ICh0ZXh0LCBKU09OLCBvciBiaW5hcnkpLlxuICovXG5cbmltcG9ydCB7IE91dHB1dFN0cmVhbSB9IGZyb20gXCJAYWVyb2tpdC9zZGsvaW8vc3RyZWFtc1wiXG5cbmNvbnN0IEh0dHBSZXNwb25zZUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5odHRwLkh0dHBSZXNwb25zZUZhY2FkZVwiKTtcbmNvbnN0IE91dHB1dFN0cmVhbVdyaXRlciA9IEphdmEudHlwZShcImphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyXCIpO1xuY29uc3QgU3RhbmRhcmRDaGFyc2V0cyA9IEphdmEudHlwZShcImphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0c1wiKTtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgZm9yIGFuIEhUVFAgY29va2llLCBpbmNsdWRpbmcgaXRzIG5hbWUsIHZhbHVlLCBhbmQgb3B0aW9uYWwgYXR0cmlidXRlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb29raWUge1xuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29va2llLiAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHZhbHVlIG9mIHRoZSBjb29raWUuICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKiogS2V5LXZhbHVlIG1hcCBvZiBjb29raWUgYXR0cmlidXRlcyAoZS5nLiwgJ21heEFnZScsICdwYXRoJywgJ2RvbWFpbicsICdzZWN1cmUnLCAnaHR0cE9ubHknKS4gKi9cbiAgICBhdHRyaWJ1dGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuIH1cblxuLyoqXG4gKiBUaGUgc3RhdGljIFJlc3BvbnNlIGNsYXNzIHByb3ZpZGluZyBzdGFuZGFyZGl6ZWQgSFRUUCBzdGF0dXMgY29kZXMgYW5kIG1ldGhvZHNcbiAqIGZvciBjb25zdHJ1Y3RpbmcgdGhlIHNlcnZlcidzIHJlc3BvbnNlLlxuICovXG5leHBvcnQgY2xhc3MgUmVzcG9uc2Uge1xuXG4gICAgLy8gLS0tIFN0YW5kYXJkIEhUVFAgU3RhdHVzIENvZGUgQ29uc3RhbnRzIChJbmZvcm1hdGlvbmFsLCBTdWNjZXNzLCBSZWRpcmVjdGlvbiwgQ2xpZW50IEVycm9yLCBTZXJ2ZXIgRXJyb3IpIC0tLVxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBBQ0NFUFRFRCA9IDIwMjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJBRF9HQVRFV0FZID0gNTAyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQkFEX1JFUVVFU1QgPSA0MDA7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT05GTElDVCA9IDQwOTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENPTlRJTlVFID0gMTAwO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ1JFQVRFRCA9IDIwMTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVYUEVDVEFUSU9OX0ZBSUxFRCA9IDQxNztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZPUkJJRERFTiA9IDQwMztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZPVU5EID0gMzAyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR0FURVdBWV9USU1FT1VUID0gNTA0O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR09ORSA9IDQxMDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEID0gNTA1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSU5URVJOQUxfU0VSVkVSX0VSUk9SID0gNTAwO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTEVOR1RIX1JFUVVJUkVEID0gNDExO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUVUSE9EX05PVF9BTExPV0VEID0gNDA1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTU9WRURfUEVSTUFORU5UTFkgPSAzMDE7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBNT1ZFRF9URU1QT1JBUklMWSA9IDMwMjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1VTFRJUExFX0NIT0lDRVMgPSAzMDA7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBOT19DT05URU5UID0gMjA0O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04gPSAyMDM7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBOT1RfQUNDRVBUQUJMRSA9IDQwNjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5PVF9GT1VORCA9IDQwNDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5PVF9JTVBMRU1FTlRFRCA9IDUwMTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5PVF9NT0RJRklFRCA9IDMwNDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE9LID0gMjAwO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUEFSVElBTF9DT05URU5UID0gMjA2O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUEFZTUVOVF9SRVFVSVJFRCA9IDQwMjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBSRUNPTkRJVElPTl9GQUlMRUQgPSA0MTI7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRCA9IDQwNztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFUVVFU1RfRU5USVRZX1RPT19MQVJHRSA9IDQxMztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFUVVFU1RfVElNRU9VVCA9IDQwODtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFUVVFU1RfVVJJX1RPT19MT05HID0gNDE0O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSA9IDQxNjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFU0VUX0NPTlRFTlQgPSAyMDU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRUVfT1RIRVIgPSAzMDM7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRVJWSUNFX1VOQVZBSUxBQkxFID0gNTAzO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1dJVENISU5HX1BST1RPQ09MUyA9IDEwMTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRFTVBPUkFSWV9SRURJUkVDVCA9IDMwNztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFVOQVVUSE9SSVpFRCA9IDQwMTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFVOU1VQUE9SVEVEX01FRElBX1RZUEUgPSA0MTU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBVU0VfUFJPWFkgPSAzMDU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBVTlBST0NFU1NBQkxFX0NPTlRFTlQgPSA0MjI7XG5cbiAgICAvKipcbiAgICAgKiBNYXBwaW5nIGJldHdlZW4gSFRUUCByZXNwb25zZSBjb2RlcyAoc3RyaW5nKSBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyByZWFzb24tcGhyYXNlc1xuICAgICAqIGFzIGRlZmluZWQgaW4gUkZDIDcyMzEsIHNlY3Rpb24gNi4xLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSHR0cENvZGVzUmVhc29ucyA9IHtcbiAgICAgICAgXCIxMDBcIjogXCJDb250aW51ZVwiLCBcIjEwMVwiOiBcIlN3aXRjaGluZyBQcm90b2NvbHNcIiwgXCIyMDBcIjogXCJPS1wiLCBcIjIwMVwiOiBcIkNyZWF0ZWRcIixcbiAgICAgICAgXCIyMDJcIjogXCJBY2NlcHRlZFwiLCBcIjIwM1wiOiBcIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uXCIsIFwiMjA0XCI6IFwiTm8gQ29udGVudFwiLFxuICAgICAgICBcIjIwNVwiOiBcIlJlc2V0IENvbnRlbnRcIiwgXCIyMDZcIjogXCJQYXJ0aWFsIENvbnRlbnRcIiwgXCIzMDBcIjogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gICAgICAgIFwiMzAxXCI6IFwiTW92ZWQgUGVybWFuZW50bHlcIiwgXCIzMDJcIjogXCJGb3VuZFwiLCBcIjMwM1wiOiBcIlNlZSBPdGhlclwiLCBcIjMwNFwiOiBcIk5vdCBNb2RpZmllZFwiLFxuICAgICAgICBcIjMwNVwiOiBcIlVzZSBQcm94eVwiLCBcIjMwN1wiOiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLCBcIjQwMFwiOiBcIkJhZCBSZXF1ZXN0XCIsXG4gICAgICAgIFwiNDAxXCI6IFwiVW5hdXRob3JpemVkXCIsIFwiNDAyXCI6IFwiUGF5bWVudCBSZXF1aXJlZFwiLCBcIjQwM1wiOiBcIkZvcmJpZGRlblwiLFxuICAgICAgICBcIjQwNFwiOiBcIk5vdCBGb3VuZFwiLCBcIjQwNVwiOiBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLCBcIjQwNlwiOiBcIk5vdCBBY2NlcHRhYmxlXCIsXG4gICAgICAgIFwiNDA3XCI6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIiwgXCI0MDhcIjogXCJSZXF1ZXN0IFRpbWVvdXRcIiwgXCI0MDlcIjogXCJDb25mbGljdFwiLFxuICAgICAgICBcIjQxMFwiOiBcIkdvbmVcIiwgXCI0MTFcIjogXCJMZW5ndGggUmVxdWlyZWRcIiwgXCI0MTJcIjogXCJQcmVjb25kaXRpb24gRmFpbGVkXCIsXG4gICAgICAgIFwiNDEzXCI6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIiwgXCI0MTRcIjogXCJVUkkgVG9vIExhcmdlXCIsIFwiNDE1XCI6IFwiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVwiLFxuICAgICAgICBcIjQxNlwiOiBcIlJhbmdlIE5vdCBTYXRpc2ZpYWJsZVwiLCBcIjQxN1wiOiBcIkV4cGVjdGF0aW9uIEZhaWxlZFwiLCBcIjQyMlwiOiBcIlVucHJvY2Vzc2FibGUgQ29udGVudFwiLFxuICAgICAgICBcIjQyNlwiOiBcIlVwZ3JhZGUgUmVxdWlyZWRcIiwgXCI1MDBcIjogXCJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcIiwgXCI1MDFcIjogXCJOb3QgSW1wbGVtZW50ZWRcIixcbiAgICAgICAgXCI1MDJcIjogXCJCYWQgR2F0ZXdheVwiLCBcIjUwM1wiOiBcIlNlcnZpY2UgVW5hdmFpbGFibGVcIiwgXCI1MDRcIjogXCJHYXRld2F5IFRpbW1lb3V0XCIsXG4gICAgICAgIFwiNTA1XCI6IFwiSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWRcIixcblxuICAgICAgICAvKipcbiAgICAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGFjY2VwdHMgYW4gSFRUUCBjb2RlIGFuZCByZXR1cm5zIGl0cyBjb3JyZXNwb25kaW5nIHJlYXNvbi1waHJhc2UuXG4gICAgICAgICogQHBhcmFtIGNvZGUgVGhlIEhUVFAgc3RhdHVzIGNvZGUgKG51bWJlcikuXG4gICAgICAgICogQHJldHVybnMgVGhlIHJlYXNvbiBwaHJhc2Ugc3RyaW5nLlxuICAgICAgICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGNvZGUgaXMgbm90IGEgdmFsaWQgaW50ZWdlciBpbiB0aGUgcmFuZ2UgWzEwMC01MDVdLlxuICAgICAgICAqL1xuICAgICAgICBnZXRSZWFzb246IChjb2RlOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgICAgICAgaWYgKGlzTmFOKGNvZGUpIHx8IGNvZGUgPCAxMDAgfHwgY29kZSA+IDUwNSkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50IGZvciBjb2RlWycgKyBjb2RlICsgJ10uIFZhbGlkIEhUVFAgY29kZXMgYXJlIGludGVnZXIgbnVtYmVycyBpbiB0aGUgcmFuZ2UgWzEwMC01MDVdLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuSHR0cENvZGVzUmVhc29uc1tTdHJpbmcoY29kZSldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSByZXNwb25zZSBmYVx1MDBFN2FkZSBpcyBjdXJyZW50bHkgdmFsaWQgb3IgY29ubmVjdGVkIHRvIGFuIGFjdGl2ZSByZXF1ZXN0IGNvbnRleHQuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5pc1ZhbGlkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIEphdmFTY3JpcHQgb2JqZWN0IHRvIEpTT04sIHNldHMgdGhlIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25gIGhlYWRlcixcbiAgICAgKiBhbmQgd3JpdGVzIHRoZSBKU09OIHN0cmluZyB0byB0aGUgcmVzcG9uc2Ugb3V0cHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0gb2JqIFRoZSBKYXZhU2NyaXB0IG9iamVjdCB0byBiZSBzZXJpYWxpemVkIGFuZCBzZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMganNvbihvYmo6IGFueSk6IHZvaWQge1xuICAgICAgICBSZXNwb25zZS5hZGRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpXG4gICAgICAgIGNvbnN0IG9iakpzb24gPSBKU09OLnN0cmluZ2lmeShvYmopO1xuICAgICAgICBSZXNwb25zZS5wcmludChvYmpKc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBzdHJpbmcgb2YgdGV4dCB0byB0aGUgcmVzcG9uc2UgYm9keSB1c2luZyAqKlVURi04KiogZW5jb2RpbmcuXG4gICAgICogTm90ZTogVGhpcyBtZXRob2QgYXV0b21hdGljYWxseSBoYW5kbGVzIGZsdXNoaW5nIHRoZSBvdXRwdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBzdHJpbmcgY29udGVudCB0byB3cml0ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHByaW50KHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0ZXh0ID0gKHRleHQgJiYgdGV4dC50b1N0cmluZygpKSB8fCBcIlwiO1xuICAgICAgICBjb25zdCBvdXQgPSBSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKS5uYXRpdmU7XG4gICAgICAgIC8vIFVzZSBKYXZhIEkvTyB0byBlbnN1cmUgZXhwbGljaXQgVVRGLTggZW5jb2RpbmdcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpO1xuICAgICAgICB3cml0ZXIud3JpdGUodGV4dCk7XG4gICAgICAgIHdyaXRlci5mbHVzaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHN0cmluZyBvZiB0ZXh0IGZvbGxvd2VkIGJ5IGEgbmV3bGluZSBjaGFyYWN0ZXIgKGBcXG5gKSB0byB0aGUgcmVzcG9uc2UgYm9keVxuICAgICAqIHVzaW5nICoqVVRGLTgqKiBlbmNvZGluZy5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgc3RyaW5nIGNvbnRlbnQgdG8gd3JpdGUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBwcmludGxuKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0ZXh0ID0gKHRleHQgJiYgdGV4dC50b1N0cmluZygpKSB8fCBcIlwiO1xuICAgICAgICBjb25zdCBvdXQgPSBSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKS5uYXRpdmU7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTtcbiAgICAgICAgd3JpdGVyLndyaXRlKHRleHQpO1xuICAgICAgICB3cml0ZXIud3JpdGUoXCJcXG5cIik7XG4gICAgICAgIHdyaXRlci5mbHVzaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBhcnJheSBvZiBieXRlcyBkaXJlY3RseSB0byB0aGUgcmVzcG9uc2Ugb3V0cHV0IHN0cmVhbSwgdHlwaWNhbGx5IHVzZWQgZm9yIGJpbmFyeSBkYXRhLlxuICAgICAqIEBwYXJhbSBieXRlcyBUaGUgYXJyYXkgb2YgYnl0ZXMgdG8gd3JpdGUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyB3cml0ZShieXRlczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFieXRlcykge1xuICAgICAgICAgICAgYnl0ZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUud3JpdGUoYnl0ZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgcmVzcG9uc2UgaGVhZGVycyBhbmQgc3RhdHVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlbnQgdG8gdGhlIGNsaWVudC5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSByZXNwb25zZSBpcyBjb21taXR0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQ29tbWl0dGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlRmFjYWRlLmlzQ29tbWl0dGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBDb250ZW50LVR5cGVgIGhlYWRlci5cbiAgICAgKiBAcGFyYW0gY29udGVudFR5cGUgVGhlIE1JTUUgdHlwZSBzdHJpbmcgKGUuZy4sICd0ZXh0L2h0bWwnLCAnYXBwbGljYXRpb24vcGRmJykuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzZXRDb250ZW50VHlwZShjb250ZW50VHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIEh0dHBSZXNwb25zZUZhY2FkZS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2VzIGFueSBidWZmZXJlZCBvdXRwdXQgdG8gYmUgd3JpdHRlbiB0byB0aGUgY2xpZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZmx1c2goKTogdm9pZCB7XG4gICAgICAgIEh0dHBSZXNwb25zZUZhY2FkZS5mbHVzaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgcmVzcG9uc2Ugb3V0cHV0IHN0cmVhbS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUuY2xvc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29va2llIHRvIHRoZSByZXNwb25zZS4gVGhlIGNvb2tpZSBvYmplY3QgaXMgc2VyaWFsaXplZCB0byBKU09OIGJlZm9yZSBiZWluZyBwYXNzZWRcbiAgICAgKiB0byB0aGUgdW5kZXJseWluZyBKYXZhIGZhY2FkZS5cbiAgICAgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUgZGVmaW5pdGlvbiBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhZGRDb29raWUoY29va2llOiBDb29raWUpOiB2b2lkIHtcbiAgICAgICAgSHR0cFJlc3BvbnNlRmFjYWRlLmFkZENvb2tpZShKU09OLnN0cmluZ2lmeShjb29raWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSByZXNwb25zZSBoZWFkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBzZXQuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGhlYWRlci5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBoZWFkZXIgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb250YWluc0hlYWRlcihuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5jb250YWluc0hlYWRlcihuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmNvZGVzIGEgVVJMIGZvciB1c2UgaW4gcmVkaXJlY3RzIG9yIGZvcm1zLCBpbmNsdWRpbmcgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIHRvIGVuY29kZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZW5jb2RlZCBVUkwgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZW5jb2RlVVJMKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5lbmNvZGVVUkwodXJsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCBmb3IgdGhlIHJlc3BvbnNlIGJvZHkuXG4gICAgICogQHJldHVybnMgVGhlIGNoYXJhY3RlciBlbmNvZGluZyBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlRmFjYWRlLmdldENoYXJhY3RlckVuY29kaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5jb2RlcyBhIFVSTCBmb3IgdXNlIGluIHRoZSBgTG9jYXRpb25gIGhlYWRlciBvZiBhIHJlZGlyZWN0IHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSB1cmwgVGhlIHJlZGlyZWN0IFVSTCB0byBlbmNvZGUuXG4gICAgICogQHJldHVybnMgVGhlIGVuY29kZWQgcmVkaXJlY3QgVVJMIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGVuY29kZVJlZGlyZWN0VVJMKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5lbmNvZGVSZWRpcmVjdFVSTCh1cmwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgYENvbnRlbnQtVHlwZWAgaGVhZGVyIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIFRoZSBjb250ZW50IHR5cGUgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udGVudFR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5nZXRDb250ZW50VHlwZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIEhUVFAgZXJyb3IgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhdHVzIGNvZGUgYW5kIG9wdGlvbmFsIG1lc3NhZ2UuXG4gICAgICogVGhpcyBieXBhc3NlcyB0aGUgbm9ybWFsIHJlc3BvbnNlIGJvZHkgd3JpdGluZyBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSBzdGF0dXMgVGhlIEhUVFAgc3RhdHVzIGNvZGUgKGUuZy4sIDQwNCwgNTAwKS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBBbiBvcHRpb25hbCBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGVycm9yIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2VuZEVycm9yKHN0YXR1czogbnVtYmVyLCBtZXNzYWdlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIEh0dHBSZXNwb25zZUZhY2FkZS5zZW5kRXJyb3Ioc3RhdHVzLCBtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZCBmb3IgdGhlIHJlc3BvbnNlIGJvZHkgKGUuZy4sICdVVEYtOCcpLlxuICAgICAqIEBwYXJhbSBjaGFyc2V0IFRoZSBjaGFyYWN0ZXIgc2V0IHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHNldENoYXJhY3RlckVuY29kaW5nKGNoYXJzZXQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoY2hhcnNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYSByZWRpcmVjdCByZXNwb25zZSAoc3RhdHVzIGNvZGUgMzAyIGJ5IGRlZmF1bHQpIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBuZXcgVVJMIHRvIHJlZGlyZWN0IHRoZSBjbGllbnQgdG8uXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzZW5kUmVkaXJlY3QobG9jYXRpb246IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUuc2VuZFJlZGlyZWN0KGxvY2F0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgQ29udGVudC1MZW5ndGhgIGhlYWRlciBmb3IgdGhlIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIHNpemUgb2YgdGhlIHJlc3BvbnNlIGJvZHkgaW4gYnl0ZXMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzZXRDb250ZW50TGVuZ3RoKGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIEh0dHBSZXNwb25zZUZhY2FkZS5zZXRDb250ZW50TGVuZ3RoKGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIHJlc3BvbnNlIGhlYWRlciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4gSWYgdGhlIGhlYWRlciBhbHJlYWR5IGV4aXN0cywgaXRzIHZhbHVlIGlzIG92ZXJ3cml0dGVuLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2V0SGVhZGVyKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcmVzcG9uc2UgaGVhZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlLiBJZiB0aGUgaGVhZGVyIGFscmVhZHkgZXhpc3RzLCBhIHNlY29uZCBoZWFkZXIgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGFkZGVkLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYWRkSGVhZGVyKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBIdHRwUmVzcG9uc2VGYWNhZGUuYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGZvciB0aGUgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIHN0YXR1cyBUaGUgaW50ZWdlciBzdGF0dXMgY29kZSAoZS5nLiwgMjAwLCA0MDQpLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2V0U3RhdHVzKHN0YXR1czogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIEh0dHBSZXNwb25zZUZhY2FkZS5zZXRTdGF0dXMoc3RhdHVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGJ1ZmZlcnMsIHN0YXR1cyBjb2RlLCBhbmQgaGVhZGVycyBmcm9tIHRoZSByZXNwb25zZSwgYWxsb3dpbmcgYSBuZXcgcmVzcG9uc2UgdG8gYmUgZ2VuZXJhdGVkLlxuICAgICAqIFRoaXMgaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgcmVzcG9uc2UgaGFzIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgSHR0cFJlc3BvbnNlRmFjYWRlLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBoZWFkZXIuIElmIG11bHRpcGxlIGhlYWRlcnMgd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXN0LCBpdCByZXR1cm5zIHRoZSBmaXJzdCBvbmUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGhlYWRlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgaGVhZGVyIHZhbHVlIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEhlYWRlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlRmFjYWRlLmdldEhlYWRlcihuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsb2NhbGUgZm9yIHRoZSByZXNwb25zZSwgd2hpY2ggbWF5IGFmZmVjdCBsYW5ndWFnZSBhbmQgZGF0ZS90aW1lIGZvcm1hdHRpbmcuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZSBjb2RlIChlLmcuLCAnZW4nLCAnZnInKS5cbiAgICAgKiBAcGFyYW0gY291bnRyeSBUaGUgb3B0aW9uYWwgY291bnRyeSBjb2RlIChlLmcuLCAnVVMnLCAnR0InKS5cbiAgICAgKiBAcGFyYW0gdmFyaWFudCBUaGUgb3B0aW9uYWwgdmFyaWFudCBjb2RlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2V0TG9jYWxlKGxhbmd1YWdlOiBzdHJpbmcsIGNvdW50cnk/OiBzdHJpbmcsIHZhcmlhbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5zZXRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnksIHZhcmlhbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGhlYWRlciB2YWx1ZXMgZm9yIGEgc3BlY2lmaWMgaGVhZGVyIG5hbWUgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaGVhZGVyLlxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGhlYWRlciB2YWx1ZXMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRIZWFkZXJzKG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSHR0cFJlc3BvbnNlRmFjYWRlLmdldEhlYWRlcnMobmFtZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hbWVzIG9mIGFsbCBoZWFkZXJzIHRoYXQgaGF2ZSBiZWVuIHNldCBvbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgaGVhZGVyIG5hbWVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SGVhZGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShIdHRwUmVzcG9uc2VGYWNhZGUuZ2V0SGVhZGVyTmFtZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudGx5IHNldCBsb2NhbGUgc3RyaW5nIGZvciB0aGUgcmVzcG9uc2UuXG4gICAgICogQHJldHVybnMgVGhlIGxvY2FsZSBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUZhY2FkZS5nZXRMb2NhbGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gb2JqZWN0LCB3cmFwcGVkIGluIHRoZSBTREsncyBgT3V0cHV0U3RyZWFtYCBjbGFzcy5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3Igd3JpdGluZyByYXcgb3IgbGFyZ2UgYW1vdW50cyBvZiBkYXRhLlxuICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldE91dHB1dFN0cmVhbSgpOiBPdXRwdXRTdHJlYW0ge1xuICAgICAgICByZXR1cm4gbmV3IE91dHB1dFN0cmVhbShIdHRwUmVzcG9uc2VGYWNhZGUuZ2V0T3V0cHV0U3RyZWFtKCkpO1xuICAgIH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0bW9kdWxlLmV4cG9ydHMgPSBSZXNwb25zZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BLHFCQUE2QjtBQUU3QixNQUFNLHFCQUFxQixLQUFLLEtBQUssOERBQThEO0FBQ25HLE1BQU0scUJBQXFCLEtBQUssS0FBSyw0QkFBNEI7QUFDakUsTUFBTSxtQkFBbUIsS0FBSyxLQUFLLG1DQUFtQztBQWtCL0QsTUFBTSxTQUFTO0FBQUE7QUFBQSxFQUlsQixP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
@@ -43,6 +43,9 @@ function service(oConfig) {
43
43
  return new HttpController(config);
44
44
  }
45
45
  class HttpController {
46
+ resource;
47
+ resourcePath;
48
+ resourceMappings;
46
49
  /**
47
50
  * Constructor function for HttpController instances.
48
51
  *
@@ -304,4 +307,4 @@ const matchMediaType = function(request2, producesMediaTypes, consumesMediaTypes
304
307
  }
305
308
  return isProduceMatched && isConsumeMatched;
306
309
  };
307
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2h0dHAvcnMvcmVzb3VyY2UtaHR0cC1jb250cm9sbGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSZXNwb25zZSBhcyByZXNwb25zZSB9IGZyb20gXCIuLi9yZXNwb25zZVwiO1xuaW1wb3J0IHsgUmVxdWVzdCBhcyByZXF1ZXN0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IFJlc291cmNlTWFwcGluZ3MgfSBmcm9tIFwiLi9yZXNvdXJjZS1tYXBwaW5nc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvbG9nXCI7XG5cbi8vIERlY2xhcmF0aW9uIGZvciB0aGUgZXh0ZXJuYWwgZGlyaWdpYmxlUmVxdWlyZSBmdW5jdGlvbiBhbmQgaXRzIGRlcGVuZGVuY3lcbmRlY2xhcmUgZnVuY3Rpb24gZGlyaWdpYmxlUmVxdWlyZShtb2R1bGU6IHN0cmluZyk6IGFueTtcbmNvbnN0IHsgbWF0Y2ggfSA9IGRpcmlnaWJsZVJlcXVpcmUoXCJtb2R1bGVzL3NyYy9odHRwL3BhdGgtdG8tcmVnZXhwLzYuMi4xL2luZGV4LmpzXCIpO1xuXG5jb25zdCBsb2dnZXI6IGFueSA9IExvZ2dpbmcuZ2V0TG9nZ2VyKCdodHRwLnJzLmNvbnRyb2xsZXInKTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgdG8gaGFuZGxlciBmdW5jdGlvbnMgKGJlZm9yZSwgc2VydmUsIGNhdGNoKS5cbiAqL1xuaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0IHtcbiAgICBwYXRoUGFyYW1ldGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBxdWVyeVBhcmFtZXRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgcmVzcG9uc2U6IGFueTtcbiAgICByZXM6IGFueTtcbiAgICByZXF1ZXN0OiBhbnk7XG4gICAgcmVxOiBhbnk7XG4gICAgLy8gQ29udGV4dCBwcm9wZXJ0aWVzIGZvciBlcnJvciBoYW5kbGluZyBtaWdodCBhbHNvIGJlIGF0dGFjaGVkIGhlcmVcbiAgICBzdXBwcmVzc1N0YWNrPzogYm9vbGVhbjtcbiAgICBodHRwRXJyb3JDb2RlPzogbnVtYmVyO1xuICAgIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgICBlcnJvck5hbWU/OiBzdHJpbmc7XG4gICAgZXJyb3JDb2RlPzogYW55O1xufVxuXG5mdW5jdGlvbiBnZXRSZXF1ZXN0KCk6IGFueSB7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG59XG5mdW5jdGlvbiBnZXRSZXNwb25zZSgpOiBhbnkge1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2VydmljZSAoSHR0cENvbnRyb2xsZXIpIGluc3RhbmNlLCBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggb01hcHBpbmdzLlxuICpcbiAqIEBwYXJhbSBvQ29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IG9yIGNvbmZpZ3VyYXRpb24gYnVpbGRlciB3aXRoIGNvbmZpZ3VyYXRpb24oKSBnZXR0ZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIG5ldyBIdHRwQ29udHJvbGxlciBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2Uob0NvbmZpZz86IGFueSk6IEh0dHBDb250cm9sbGVyIHtcbiAgICBsZXQgY29uZmlnOiBSZXNvdXJjZU1hcHBpbmdzIHwgYW55O1xuICAgIGlmIChvQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvQ29uZmlnID09PSAnb2JqZWN0JyB8fCBvQ29uZmlnIGluc3RhbmNlb2YgUmVzb3VyY2VNYXBwaW5ncykge1xuICAgICAgICAgICAgY29uZmlnID0gb0NvbmZpZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEh0dHBDb250cm9sbGVyKGNvbmZpZyk7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgZm9yIGhhbmRsaW5nIEhUVFAgcmVxdWVzdHMgYW5kIHJvdXRpbmcgdGhlbSB0byB0aGUgY29ycmVjdCByZXNvdXJjZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBDb250cm9sbGVyIHtcblxuICAgIHJlc291cmNlOiBGdW5jdGlvbjtcbiAgICByZXNvdXJjZVBhdGg6IEZ1bmN0aW9uO1xuICAgIHJlc291cmNlTWFwcGluZ3M6IFJlc291cmNlTWFwcGluZ3M7XG5cbiAgICAvLyBJbmRleCBzaWduYXR1cmUgdG8gYWxsb3cgZHluYW1pYyBtZXRob2QgYXNzaWdubWVudCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgSHR0cENvbnRyb2xsZXIgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9NYXBwaW5ncyBUaGUgbWFwcGluZ3MgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBjb250cm9sbGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9NYXBwaW5ncz86IFJlc291cmNlTWFwcGluZ3MgfCBhbnkpIHtcbiAgICAgICAgaWYgKG9NYXBwaW5ncyBpbnN0YW5jZW9mIFJlc291cmNlTWFwcGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VNYXBwaW5ncyA9IG9NYXBwaW5ncztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb01hcHBpbmdzID09PSAnb2JqZWN0JyB8fCBvTWFwcGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Mob01hcHBpbmdzLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgaW5pdGlhbGl6YXRpb24gaWYgaW5wdXQgaXMgdW5leHBlY3RlZFxuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Moe30sIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxpYXMgZm9yIHJlc291cmNlTWFwcGluZ3MucmVzb3VyY2VcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZU1hcHBpbmdzLnJlc291cmNlUGF0aC5iaW5kKHRoaXMucmVzb3VyY2VNYXBwaW5ncyk7XG5cbiAgICAgICAgLy8gd2VhdmUtaW4gSFRUUCBtZXRob2QtYmFzZWQgZmFjdG9yeSBmdW5jdGlvbnMgLSBzaG9ydGN1dCBmb3Igc2VydmljZSgpLnJlc291cmNlKHNQYXRoKS5tZXRob2RcbiAgICAgICAgWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3JlbW92ZScsICdtZXRob2QnXS5mb3JFYWNoKChzTWV0aG9kTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzW3NNZXRob2ROYW1lXSA9ICguLi5hbGxBcmd1bWVudHM6IGFueVtdKTogSHR0cENvbnRyb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbGxBcmd1bWVudHMubGVuZ3RoIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0luc3VmZmljaWVudCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gSHR0cENvbnRyb2xsZXIgbWV0aG9kICcgKyBzTWV0aG9kTmFtZSArICcuJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBzUGF0aCBpcyBhbHdheXMgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICAgICAgICAgICAgbGV0IHNQYXRoID0gYWxsQXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChzUGF0aCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBzUGF0aCA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBhcmd1bWVudHMgKHNWZXJiLCBhcnJDb25zdW1lcywgYXJyUHJvZHVjZXMpIGFyZSB1c2VkIGJ5IFJlc291cmNlTWFwcGluZ3MuZmluZC9yZXNvdXJjZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNWZXJiID0gYWxsQXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyckNvbnN1bWVzID0gYWxsQXJndW1lbnRzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyclByb2R1Y2VzID0gYWxsQXJndW1lbnRzWzNdO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluZCBleGlzdGluZyByZXNvdXJjZSBvciBjcmVhdGUgYSBuZXcgb25lIGJhc2VkIG9uIHRoZSBwYXRoIChhbmQgb3RoZXIgb3B0aW9uYWwgY29uc3RyYWludHMpXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2U6IGFueSA9IHRoaXMucmVzb3VyY2VNYXBwaW5ncy5maW5kKHNQYXRoLCBzVmVyYiwgYXJyQ29uc3VtZXMsIGFyclByb2R1Y2VzKSB8fCB0aGlzLnJlc291cmNlTWFwcGluZ3MucmVzb3VyY2Uoc1BhdGgpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFzcyBhbGwgYXJndW1lbnRzICpleGNlcHQqIHRoZSBzUGF0aCB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb2YgdGhlIHJlc291cmNlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VNZXRob2RBcmdzID0gYWxsQXJndW1lbnRzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIG1ldGhvZCBvbiB0aGUgcmVzb3VyY2UgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICByZXNvdXJjZVtzTWV0aG9kTmFtZV0uYXBwbHkocmVzb3VyY2UsIHJlc291cmNlTWV0aG9kQXJncyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZXhlY3V0ZS5cbiAgICAgKi9cbiAgICBsaXN0ZW4ocmVxdWVzdDogYW55LCByZXNwb25zZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXhlY3V0ZShyZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHJlcXVlc3QgaGFuZGxpbmcgbG9naWMsIGZpbmRpbmcgdGhlIGJlc3QgbWF0Y2hpbmcgcmVzb3VyY2UgYW5kIGhhbmRsZXIuXG4gICAgICovXG4gICAgZXhlY3V0ZShyZXF1ZXN0PzogYW55LCByZXNwb25zZT86IGFueSk6IHZvaWQge1xuICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdCB8fCBnZXRSZXF1ZXN0KCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXRoOiBzdHJpbmcgPSByZXF1ZXN0LmdldFJlc291cmNlUGF0aCgpO1xuICAgICAgICBjb25zdCBtZXRob2Q6IHN0cmluZyA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgX29Db25maWd1cmF0aW9uOiBhbnkgPSB0aGlzLnJlc291cmNlTWFwcGluZ3MuY29uZmlndXJhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZXM6IGFueVtdID0gbWF0Y2hSZXF1ZXN0VXJsKHJlcXVlc3RQYXRoLCBtZXRob2QsIF9vQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGxldCByZXNvdXJjZUhhbmRsZXI6IGFueTtcblxuICAgICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzWzBdKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiSGFuZGxlcnM6IGFueVtdID0gX29Db25maWd1cmF0aW9uW21hdGNoZXNbMF0uZF1bbWV0aG9kXTtcbiAgICAgICAgICAgIGlmICh2ZXJiSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICByZXNvdXJjZUhhbmRsZXIgPSB2ZXJiSGFuZGxlcnMuZmlsdGVyKChoYW5kbGVyRGVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaE1lZGlhVHlwZShyZXF1ZXN0LCBoYW5kbGVyRGVmLnByb2R1Y2VzLCBoYW5kbGVyRGVmLmNvbnN1bWVzKTtcbiAgICAgICAgICAgICAgICB9KVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UgfHwgZ2V0UmVzcG9uc2UoKTtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSByZXF1ZXN0LmdldFF1ZXJ5UGFyYW1ldGVyc01hcCgpIHx8IHt9O1xuICAgICAgICBjb25zdCBhY2NlcHRzSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdBY2NlcHQnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IHJlc291cmNlUGF0aDogc3RyaW5nID0gcmVxdWVzdFBhdGg7XG5cbiAgICAgICAgaWYgKHJlc291cmNlSGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgY3R4OiBSZXF1ZXN0Q29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICBcInBhdGhQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicXVlcnlQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicmVzcG9uc2VcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXNcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXF1ZXN0XCI6IHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgXCJyZXFcIjogcmVxdWVzdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzWzBdLnBhdGhQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBjdHgucGF0aFBhcmFtZXRlcnMgPSBtYXRjaGVzWzBdLnBhdGhQYXJhbXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHgucXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbXM7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vb3AgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgICAgICBsZXQgX2JlZm9yZTogRnVuY3Rpb24sIF9zZXJ2ZTogRnVuY3Rpb24sIF9jYXRjaDogRnVuY3Rpb24sIF9maW5hbGx5OiBGdW5jdGlvbjtcbiAgICAgICAgICAgIF9iZWZvcmUgPSByZXNvdXJjZUhhbmRsZXIuYmVmb3JlIHx8IG5vb3A7XG4gICAgICAgICAgICBfc2VydmUgPSByZXNvdXJjZUhhbmRsZXIuaGFuZGxlciB8fCByZXNvdXJjZUhhbmRsZXIuc2VydmUgfHwgbm9vcDtcbiAgICAgICAgICAgIF9jYXRjaCA9IHJlc291cmNlSGFuZGxlci5jYXRjaCB8fCBjYXRjaEVycm9ySGFuZGxlci5iaW5kKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiByZXNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogY29udGVudFR5cGVIZWFkZXIuam9pbignLCcpLFxuICAgICAgICAgICAgICAgIGFjY2VwdHM6IGFjY2VwdHNIZWFkZXIuam9pbignLCcpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9maW5hbGx5ID0gcmVzb3VyY2VIYW5kbGVyLmZpbmFsbHkgfHwgbm9vcDtcblxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tBcmdzOiBhbnlbXSA9IFtjdHgsIHJlcXVlc3QsIHJlc3BvbnNlLCByZXNvdXJjZUhhbmRsZXIsIHRoaXNdO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgnQmVmb3JlIHNlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgIF9iZWZvcmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcblxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuaXNDb21taXR0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoJ1NlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgICAgICBfc2VydmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCdTZXJ2aW5nIHJlcXVlc3QgZm9yIFJlc291cmNlW3t9XSwgTWV0aG9kW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCcsIHJlc291cmNlUGF0aCwgbWV0aG9kLnRvVXBwZXJDYXNlKCksIGNvbnRlbnRUeXBlSGVhZGVyLCBhY2NlcHRzSGVhZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrQXJncy5zcGxpY2UoMSwgMCwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgX2NhdGNoLmFwcGx5KHRoaXMsIGNhbGxiYWNrQXJncyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoX2NhdGNoRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gZXJyb3IgaGFuZGxlciB0aHJldyBlcnJvcicsIF9jYXRjaEVycik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IF9jYXRjaEVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIEh0dHBDb250cm9sbGVyLnByb3RvdHlwZS5jbG9zZVJlc3BvbnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgX2ZpbmFsbHkuYXBwbHkodGhpcywgW10pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF9maW5hbGx5RXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gcG9zdCBoYW5kbGVyIHRocmV3IGVycm9yJywgX2ZpbmFsbHlFcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTm8gc3VpdGFibGUgcmVzb3VyY2UgaGFuZGxlciBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZvdW5kJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuXHRcdFx0bG9nZ2VyLmVycm9yKCdSZWdpc3RlcmVkIHJlc291cmNlIGhhbmRsZXJzIGZvciBSZXNvdXJjZVt7fV0gYXJlIFt7fV0nLCByZXNvdXJjZVBhdGgsIEpTT04uc3RyaW5naWZ5KF9vQ29uZmlndXJhdGlvbikpO1xuICAgICAgICAgICAgdGhpcy5zZW5kRXJyb3IocmVzcG9uc2UuQkFEX1JFUVVFU1QsIHVuZGVmaW5lZCwgJ0JhZCBSZXF1ZXN0JywgJ05vIHN1aXRhYmxlIHByb2Nlc3NvciBmb3IgdGhpcyByZXF1ZXN0LicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgUmVzb3VyY2VNYXBwaW5ncyBpbnN0YW5jZSBvZiB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgbWFwcGluZ3MoKTogUmVzb3VyY2VNYXBwaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlTWFwcGluZ3M7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIGVycm9yIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQsIGZvcm1hdHRlZCBiYXNlZCBvbiB0aGUgYWNjZXB0ZWQgbWVkaWEgdHlwZS5cbiAgICAgKi9cbiAgICBzZW5kRXJyb3IoaHR0cEVycm9yQ29kZTogbnVtYmVyLCBhcHBsaWNhdGlvbkVycm9yQ29kZTogYW55LCBlcnJvck5hbWU6IHN0cmluZywgZXJyb3JEZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2xpZW50QWNjZXB0TWVkaWFUeXBlczogc3RyaW5nW10gPSBub3JtYWxpemVNZWRpYVR5cGVIZWFkZXJWYWx1ZShyZXF1ZXN0LmdldEhlYWRlcignQWNjZXB0JykpIHx8IFsnYXBwbGljYXRpb24vanNvbiddO1xuICAgICAgICBjb25zdCBpc0h0bWw6IGJvb2xlYW4gPSBjbGllbnRBY2NlcHRNZWRpYVR5cGVzLnNvbWUoKGFjY2VwdE1lZGlhVHlwZSkgPT4gaXNNaW1lVHlwZUNvbXBhdGlibGUoJyovaHRtbCcsIGFjY2VwdE1lZGlhVHlwZSkpO1xuXG4gICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhodHRwRXJyb3JDb2RlIHx8IHJlc3BvbnNlLklOVEVSTkFMX1NFUlZFUl9FUlJPUik7XG5cbiAgICAgICAgaWYgKGlzSHRtbCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZTogc3RyaW5nID0gZXJyb3JOYW1lICsgKGFwcGxpY2F0aW9uRXJyb3JDb2RlICE9PSB1bmRlZmluZWQgPyAnWycgKyBhcHBsaWNhdGlvbkVycm9yQ29kZSArICddJyA6ICcnKSArIChlcnJvckRldGFpbHMgPyAnOiAnICsgZXJyb3JEZXRhaWxzIDogJycpO1xuICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKGh0dHBFcnJvckNvZGUgfHwgcmVzcG9uc2UuSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBtZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgICAgICAgXCJjb2RlXCI6IGFwcGxpY2F0aW9uRXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgIFwiZGV0YWlsc1wiOiBlcnJvckRldGFpbHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgcmVzcG9uc2UucHJpbnQoSlNPTi5zdHJpbmdpZnkoYm9keSwgbnVsbCwgMikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2VSZXNwb25zZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGbHVzaGVzIGFuZCBjbG9zZXMgdGhlIEhUVFAgcmVzcG9uc2Ugc3RyZWFtLlxuICAgICAqL1xuICAgIGNsb3NlUmVzcG9uc2UoKTogdm9pZCB7XG4gICAgICAgIHJlc3BvbnNlLmZsdXNoKCk7XG4gICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gc29ydCBmdW5jdGlvbiBmb3IgbWF0Y2hlZCByb3V0ZSBkZWZpbml0aW9ucywgcHJlZmVycmluZyBleGFjdCBtYXRjaGVzIG92ZXIgdGhvc2Ugd2l0aCBwbGFjZWhvbGRlcnMuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZWRSb3V0ZURlZmluaXRpb25zU29ydGVyKHA6IGFueSwgbjogYW55KTogbnVtYmVyIHtcbiAgICBwLncgPSBjYWxjdWxhdGVNYXRjaGVkUm91dGVXZWlnaHQocCk7XG4gICAgbi53ID0gY2FsY3VsYXRlTWF0Y2hlZFJvdXRlV2VpZ2h0KG4pO1xuXG4gICAgaWYgKG4udyA9PT0gcC53KSB7XG4gICAgICAgIC8vIFRoZSBvbmUgd2l0aCBsZXNzIHBsYWNlaG9sZGVycyB3aW5zXG4gICAgICAgIGNvbnN0IG0xID0gcC5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDEgPSBtMSAhPT0gbnVsbCA/IG0xLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IG0yID0gbi5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDIgPSBtMiAhPT0gbnVsbCA/IG0yLmxlbmd0aCA6IDA7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnNDb3VudDEgPiBwbGFjZWhvbGRlcnNDb3VudDIpIHtcbiAgICAgICAgICAgIG4udyA9IG4udyArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2Vob2xkZXJzQ291bnQxIDwgcGxhY2Vob2xkZXJzQ291bnQyKSB7XG4gICAgICAgICAgICBwLncgPSBwLncgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuLncgLSBwLnc7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW5pdGlhbCB3ZWlnaHQgb2YgYSBtYXRjaGVkIHJvdXRlIGRlZmluaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1hdGNoZWRSb3V0ZVdlaWdodChtYXRjaGVkUm91dGU6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIChtYXRjaGVkUm91dGUucGFyYW1zICYmIE9iamVjdC5rZXlzKG1hdGNoZWRSb3V0ZS5wYXJhbXMpLmxlbmd0aCA+IDApID8gMCA6IDE7IC8vIGFsd2F5cyBwcmVmZXIgZXhhY3Qgcm91dGUgZGVmaW5pdGlvbnMgLSBzZXQgd2VpZ2h0IHRvIDFcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHBhdGggcGFyYW1ldGVycyBkZWNsYXJlZCBpbiBicmFjZXMgKGUuZy4sICcvYXBpL3twYXRoUGFyYW19JykgdG8gcGF0aC10by1yZWdleHAgZm9ybWF0IChlLmcuLCAnL2FwaS86cGF0aFBhcmFtJykuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKHBhdGhEZWZpbml0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdGhQYXJhbXNJbkJyYWNlc01hdGNoZXIgPSAvKHsoXFx3KlxcKj8pfSkvZzsgLy8gbWF0Y2hlcyBjYXNlcyBsaWtlICcvYXBpL3twYXRoUGFyYW19JyBvciAnL2FwaS97cGF0aFBhcmFtKn0nXG4gICAgcmV0dXJuIHBhdGhEZWZpbml0aW9uLnJlcGxhY2UocGF0aFBhcmFtc0luQnJhY2VzTWF0Y2hlciwgXCI6JDJcIik7IC8vIHRyYW5zZm9ybXMgbWF0Y2hlZCBjYXNlcyB0byAnL2FwaS86cGF0aFBhcmFtJyBvciAnL2FwaS86cGF0aFBhcmFtKidcbn1cblxuLyoqXG4gKiBGaW5kcyBhbGwgcm91dGVzIGluIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgbWF0Y2ggdGhlIHJlcXVlc3QgcGF0aCBhbmQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBtYXRjaFJlcXVlc3RVcmwocmVxdWVzdFBhdGg6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIGNmZzogYW55KTogYW55W10ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjZmcpXG4gICAgICAgIC5maWx0ZXIoKFtfLCBoYW5kbGVyc10pID0+IGhhbmRsZXJzICYmIChoYW5kbGVycyBhcyBhbnkpW21ldGhvZF0pXG4gICAgICAgIC5tYXAoKFtwYXRoLCBfXSkgPT4gcGF0aClcbiAgICAgICAgLnJlZHVjZSgobWF0Y2hlczogYW55W10sIHBhdGg6IHN0cmluZykgPT4gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVzLCBwYXRoLCByZXF1ZXN0UGF0aCksIFtdKVxuICAgICAgICAuc29ydChtYXRjaGVkUm91dGVEZWZpbml0aW9uc1NvcnRlcik7XG59XG5cbi8qKlxuICogUmVkdWNlciBmdW5jdGlvbiB0byBhdHRlbXB0IG1hdGNoaW5nIGEgZGVmaW5lZCBwYXRoIGFnYWluc3QgdGhlIHJlcXVlc3QgcGF0aCB1c2luZyBwYXRoLXRvLXJlZ2V4cC5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVkRGVmaW5pdGlvbnM6IGFueVtdLCBkZWZpbmVkUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogYW55W10ge1xuICAgIC8vICdtYXRjaCcgZnJvbSBwYXRoLXRvLXJlZ2V4cCBpcyB1c2VkIGhlcmVcbiAgICBjb25zdCBwYXRoTWF0Y2hlciA9IG1hdGNoKHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKGRlZmluZWRQYXRoKSk7XG4gICAgY29uc3QgbWF0Y2hlZCA9IHBhdGhNYXRjaGVyKHJlcXVlc3RQYXRoKTtcblxuICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgIC8vIEVuc3VyZSBwYXRoUGFyYW1zIGlzIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnNcbiAgICAgICAgY29uc3QgcGF0aFBhcmFtcyA9IG1hdGNoZWQucGFyYW1zO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZWREZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgcDogcmVxdWVzdFBhdGgsXG4gICAgICAgICAgICBkOiBkZWZpbmVkUGF0aCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXM6IHBhdGhQYXJhbXNcbiAgICAgICAgfTtcbiAgICAgICAgbWF0Y2hlZERlZmluaXRpb25zLnB1c2gobWF0Y2hlZERlZmluaXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlZERlZmluaXRpb25zO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW4gSFRUUCBtZWRpYSB0eXBlIGhlYWRlciB2YWx1ZSAoZS5nLiwgXCJ0ZXh0L3BsYWluOyBxPTAuOSwgYXBwbGljYXRpb24vanNvblwiKS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUoc01lZGlhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoc01lZGlhVHlwZSA9PT0gdW5kZWZpbmVkIHx8IHNNZWRpYVR5cGUgPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAvLyBjb252ZXJ0IHRvIGFycmF5IG9mIGluZGl2aWR1YWwgdHlwZXNcbiAgICBsZXQgYXJyTWVkaWFUeXBlID0gc01lZGlhVHlwZS5zcGxpdCgnLCcpO1xuICAgIGFyck1lZGlhVHlwZSA9IGFyck1lZGlhVHlwZS5tYXAoKG1pbWVUeXBlRW50cnkpID0+IHtcbiAgICAgICAgLy8gcmVtb3ZlIGVzY2FwaW5nLCByZW1vdmUgcXVhbGl0eSBvciBvdGhlciBhdHRyaWJ1dGVzIChlLmcuLCAnOyBxPTAuOScpXG4gICAgICAgIHJldHVybiBtaW1lVHlwZUVudHJ5LnJlcGxhY2UoJ1xcXFwnLCAnJykuc3BsaXQoJzsnKVswXS50cmltKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFyck1lZGlhVHlwZS5maWx0ZXIodHlwZSA9PiB0eXBlLmxlbmd0aCA+IDApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNvdXJjZSBNSU1FIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIGEgdGFyZ2V0IE1JTUUgdHlwZSwgc3VwcG9ydGluZyB3aWxkY2FyZHMgKCopLlxuICovXG5mdW5jdGlvbiBpc01pbWVUeXBlQ29tcGF0aWJsZShzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoc291cmNlID09PSB0YXJnZXQpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0TSA9IHRhcmdldC5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHNvdXJjZU0gPSBzb3VyY2Uuc3BsaXQoJy8nKTtcblxuICAgIC8vIFRhcmdldCBpcyB3aWxkY2FyZCB0eXBlLCBTb3VyY2UgaGFzIGEgc3BlY2lmaWMgc3VidHlwZSAoZS5nLiwgdGFyZ2V0PSovanNvbiwgc291cmNlPWFwcGxpY2F0aW9uL2pzb24pXG4gICAgaWYgKHRhcmdldE1bMF0gPT09ICcqJyAmJiB0YXJnZXRNWzFdID09PSBzb3VyY2VNWzFdKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBTb3VyY2UgaXMgd2lsZGNhcmQgdHlwZSwgVGFyZ2V0IGhhcyBhIHNwZWNpZmljIHN1YnR5cGUgKGUuZy4sIHNvdXJjZT0qL2pzb24sIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzBdID09PSAnKicgJiYgdGFyZ2V0TVsxXSA9PT0gc291cmNlTVsxXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBUYXJnZXQgaXMgd2lsZGNhcmQgc3VidHlwZSwgU291cmNlIGhhcyBhIHNwZWNpZmljIHR5cGUgKGUuZy4sIHRhcmdldD1hcHBsaWNhdGlvbi8qLCBzb3VyY2U9YXBwbGljYXRpb24vanNvbilcbiAgICBpZiAodGFyZ2V0TVsxXSA9PT0gJyonICYmIHRhcmdldE1bMF0gPT09IHNvdXJjZU1bMF0pXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFNvdXJjZSBpcyB3aWxkY2FyZCBzdWJ0eXBlLCBUYXJnZXQgaGFzIGEgc3BlY2lmaWMgdHlwZSAoZS5nLiwgc291cmNlPWFwcGxpY2F0aW9uLyosIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzFdID09PSAnKicgJiYgdGFyZ2V0TVswXSA9PT0gc291cmNlTVswXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogRGVmYXVsdCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLlxuICovXG5jb25zdCBjYXRjaEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uICh0aGlzOiBIdHRwQ29udHJvbGxlciwgbG9nY3R4OiBhbnksIGN0eDogUmVxdWVzdENvbnRleHQsIGVycjogYW55LCByZXF1ZXN0OiBhbnksIHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY3R4LnN1cHByZXNzU3RhY2spIHtcbiAgICAgICAgY29uc3QgZGV0YWlsc01zZyA9IChjdHguZXJyb3JOYW1lIHx8IFwiXCIpICsgKGN0eC5lcnJvckNvZGUgPyBcIiBbXCIgKyBjdHguZXJyb3JDb2RlICsgXCJdXCIgOiBcIlwiKSArIChjdHguZXJyb3JNZXNzYWdlID8gXCI6IFwiICsgY3R4LmVycm9yTWVzc2FnZSA6IFwiXCIpO1xuICAgICAgICBsb2dnZXIuaW5mbygnU2VydmluZyByZXNvdXJjZVt7fV0sIFZlcmJbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZpbmlzaGVkIGluIGVycm9yLiB7fScsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBkZXRhaWxzTXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ1NlcnZpbmcgcmVzb3VyY2Vbe31dLCBWZXJiW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCBpbiBlcnJvcicsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBlcnIpO1xuICAgIH1cblxuICAgIGNvbnN0IGh0dHBFcnJvckNvZGUgPSBjdHguaHR0cEVycm9yQ29kZSB8fCByZXNwb25zZS5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY3R4LmVycm9yTWVzc2FnZSB8fCAoZXJyICYmIGVyci5tZXNzYWdlKTtcbiAgICBjb25zdCBlcnJvck5hbWUgPSBjdHguZXJyb3JOYW1lIHx8IChlcnIgJiYgZXJyLm5hbWUpO1xuICAgIGNvbnN0IGVycm9yQ29kZSA9IGN0eC5lcnJvckNvZGU7XG5cbiAgICB0aGlzLnNlbmRFcnJvcihodHRwRXJyb3JDb2RlLCBlcnJvckNvZGUsIGVycm9yTmFtZSwgZXJyb3JNZXNzYWdlKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSByZXF1ZXN0IG1lZGlhIHR5cGVzIG1hdGNoIHRoZSByZXNvdXJjZSBoYW5kbGVyJ3MgY29uc3VtZXMgYW5kIHByb2R1Y2VzIGNvbnN0cmFpbnRzLlxuICovXG5jb25zdCBtYXRjaE1lZGlhVHlwZSA9IGZ1bmN0aW9uIChyZXF1ZXN0OiBhbnksIHByb2R1Y2VzTWVkaWFUeXBlczogc3RyaW5nW10sIGNvbnN1bWVzTWVkaWFUeXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBsZXQgaXNQcm9kdWNlTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFjY2VwdHNNZWRpYVR5cGVzID0gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUocmVxdWVzdC5nZXRIZWFkZXIoJ0FjY2VwdCcpKTtcblxuICAgIC8vIDEuIENoZWNrIFByb2R1Y2VzIChBY2NlcHRzIGhlYWRlcilcbiAgICBpZiAoIWFjY2VwdHNNZWRpYVR5cGVzIHx8IGFjY2VwdHNNZWRpYVR5cGVzLmxlbmd0aCA9PT0gMCB8fCBhY2NlcHRzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gT3V0cHV0IG1lZGlhIHR5cGUgaXMgbm90IHJlc3RyaWN0ZWQgYnkgY2xpZW50IG9yIGNsaWVudCBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzUHJvZHVjZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9kdWNlc01lZGlhVHlwZXMgJiYgcHJvZHVjZXNNZWRpYVR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFByb2R1Y2VzTUlNRSA9IGFjY2VwdHNNZWRpYVR5cGVzLmZpbHRlcigoYWNjZXB0c01lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWNlc01lZGlhVHlwZXMuc29tZSgocHJvZHVjZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGFjY2VwdHNNZWRpYVR5cGUsIHByb2R1Y2VzTWVkaWFUeXBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IG1hdGNoZWRQcm9kdWNlc01JTUUgJiYgbWF0Y2hlZFByb2R1Y2VzTUlNRS5sZW5ndGggPiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVzb3VyY2UgZG9lc24ndCBzcGVjaWZ5IHByb2R1Y2VzLCBzbyBpdCBtYXRjaGVzIGlmIHRoZSBjbGllbnQgYWNjZXB0cyBhbnl0aGluZyBvciBpZiBwcm9kdWNlcyBpcyBhbiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBDaGVjayBDb25zdW1lcyAoQ29udGVudC1UeXBlIGhlYWRlcilcbiAgICBsZXQgaXNDb25zdW1lTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlTWVkaWFUeXBlcyA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSk7XG5cbiAgICBpZiAoIWNvbnN1bWVzTWVkaWFUeXBlcyB8fCBjb25zdW1lc01lZGlhVHlwZXMubGVuZ3RoID09PSAwIHx8IGNvbnN1bWVzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gSW5wdXQgbWVkaWEgdHlwZSBpcyBub3QgcmVzdHJpY3RlZCBieSByZXNvdXJjZSBvciByZXNvdXJjZSBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250ZW50VHlwZU1lZGlhVHlwZXMgJiYgY29uc3VtZXNNZWRpYVR5cGVzICYmIGNvbnN1bWVzTWVkaWFUeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRDb25zdW1lc01JTUUgPSBjb250ZW50VHlwZU1lZGlhVHlwZXMuZmlsdGVyKChjb250ZW50VHlwZU1lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdW1lc01lZGlhVHlwZXMuc29tZSgoY29uc3VtZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGNvbnRlbnRUeXBlTWVkaWFUeXBlLCBjb25zdW1lc01lZGlhVHlwZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSBtYXRjaGVkQ29uc3VtZXNNSU1FICYmIG1hdGNoZWRDb25zdW1lc01JTUUubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1Byb2R1Y2VNYXRjaGVkICYmIGlzQ29uc3VtZU1hdGNoZWQ7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFBcUM7QUFDckMscUJBQW1DO0FBQ25DLCtCQUFpQztBQUNqQyxpQkFBd0I7QUFJeEIsTUFBTSxFQUFFLE1BQU0sSUFBSSxpQkFBaUIsZ0RBQWdEO0FBRW5GLE1BQU0sU0FBYyxtQkFBUSxVQUFVLG9CQUFvQjtBQW9CMUQsU0FBUyxhQUFrQjtBQUN2QixTQUFPLGVBQUFBO0FBQ1g7QUFDQSxTQUFTLGNBQW1CO0FBQ3hCLFNBQU8sZ0JBQUFDO0FBQ1g7QUFRTyxTQUFTLFFBQVEsU0FBK0I7QUFDbkQsTUFBSTtBQUNKLE1BQUksWUFBWSxRQUFXO0FBQ3ZCLFFBQUksT0FBTyxZQUFZLFlBQVksbUJBQW1CLDJDQUFrQjtBQUNwRSxlQUFTO0FBQUEsSUFDYjtBQUFBLEVBQ0o7QUFDQSxTQUFPLElBQUksZUFBZSxNQUFNO0FBQ3BDO0FBS08sTUFBTSxlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBY3hCLFlBQVksV0FBb0M7QUFDNUMsUUFBSSxxQkFBcUIsMkNBQWtCO0FBQ3ZDLFdBQUssbUJBQW1CO0FBQUEsSUFDNUIsV0FBVyxPQUFPLGNBQWMsWUFBWSxjQUFjLFFBQVc7QUFDakUsV0FBSyxtQkFBbUIsSUFBSSwwQ0FBaUIsV0FBVyxJQUFJO0FBQUEsSUFDaEUsT0FBTztBQUVILFdBQUssbUJBQW1CLElBQUksMENBQWlCLENBQUMsR0FBRyxJQUFJO0FBQUEsSUFDekQ7QUFHQSxTQUFLLFdBQVcsS0FBSyxlQUFlLEtBQUssaUJBQWlCLGFBQWEsS0FBSyxLQUFLLGdCQUFnQjtBQUdqRyxLQUFDLE9BQU8sUUFBUSxPQUFPLFVBQVUsVUFBVSxRQUFRLEVBQUUsUUFBUSxDQUFDLGdCQUF3QjtBQUNsRixXQUFLLFdBQVcsSUFBSSxJQUFJLGlCQUF3QztBQUM1RCxZQUFJLGFBQWEsU0FBUztBQUN0QixnQkFBTSxNQUFNLDhEQUE4RCxjQUFjLEdBQUc7QUFHL0YsWUFBSSxRQUFRLGFBQWEsQ0FBQztBQUMxQixZQUFJLFVBQVU7QUFDVixrQkFBUTtBQUdaLGNBQU0sUUFBUSxhQUFhLENBQUM7QUFDNUIsY0FBTSxjQUFjLGFBQWEsQ0FBQztBQUNsQyxjQUFNLGNBQWMsYUFBYSxDQUFDO0FBR2xDLGNBQU0sV0FBZ0IsS0FBSyxpQkFBaUIsS0FBSyxPQUFPLE9BQU8sYUFBYSxXQUFXLEtBQUssS0FBSyxpQkFBaUIsU0FBUyxLQUFLO0FBR2hJLGNBQU0scUJBQXFCLGFBQWEsTUFBTSxDQUFDO0FBRy9DLGlCQUFTLFdBQVcsRUFBRSxNQUFNLFVBQVUsa0JBQWtCO0FBRXhELGVBQU87QUFBQSxNQUNYO0FBQUEsSUFDSixDQUFDO0FBQUEsRUFDTDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBT0QsVUFBY0MsV0FBcUI7QUFDdEMsU0FBSyxRQUFRRCxVQUFTQyxTQUFRO0FBQUEsRUFDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFFBQVFELFVBQWVDLFdBQXNCO0FBQ3pDLElBQUFELFdBQVVBLFlBQVcsV0FBVztBQUNoQyxVQUFNLGNBQXNCQSxTQUFRLGdCQUFnQjtBQUNwRCxVQUFNLFNBQWlCQSxTQUFRLFVBQVUsRUFBRSxZQUFZO0FBQ3ZELFVBQU0sa0JBQXVCLEtBQUssaUJBQWlCLGNBQWM7QUFFakUsVUFBTSxVQUFpQixnQkFBZ0IsYUFBYSxRQUFRLGVBQWU7QUFDM0UsUUFBSTtBQUVKLFFBQUksV0FBVyxRQUFRLENBQUMsR0FBRztBQUN2QixZQUFNLGVBQXNCLGdCQUFnQixRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTTtBQUNoRSxVQUFJLGNBQWM7QUFDZCwwQkFBa0IsYUFBYSxPQUFPLENBQUMsZUFBZTtBQUNsRCxpQkFBTyxlQUFlQSxVQUFTLFdBQVcsVUFBVSxXQUFXLFFBQVE7QUFBQSxRQUMzRSxDQUFDLEVBQUUsQ0FBQztBQUFBLE1BQ1I7QUFBQSxJQUNKO0FBRUEsSUFBQUMsWUFBV0EsYUFBWSxZQUFZO0FBQ25DLFVBQU0sY0FBc0NELFNBQVEsc0JBQXNCLEtBQUssQ0FBQztBQUNoRixVQUFNLGdCQUEwQiw4QkFBOEJBLFNBQVEsVUFBVSxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQy9GLFVBQU0sb0JBQThCLDhCQUE4QkEsU0FBUSxVQUFVLGNBQWMsQ0FBQyxLQUFLLENBQUM7QUFDekcsVUFBTSxlQUF1QjtBQUU3QixRQUFJLGlCQUFpQjtBQUNqQixZQUFNLE1BQXNCO0FBQUEsUUFDeEIsa0JBQWtCLENBQUM7QUFBQSxRQUNuQixtQkFBbUIsQ0FBQztBQUFBLFFBQ3BCLFlBQVlDO0FBQUEsUUFDWixPQUFPQTtBQUFBLFFBQ1AsV0FBV0Q7QUFBQSxRQUNYLE9BQU9BO0FBQUEsTUFDWDtBQUNBLFVBQUksUUFBUSxDQUFDLEVBQUUsWUFBWTtBQUN2QixZQUFJLGlCQUFpQixRQUFRLENBQUMsRUFBRTtBQUFBLE1BQ3BDO0FBQ0EsVUFBSSxrQkFBa0I7QUFFdEIsWUFBTSxPQUFPLFdBQVk7QUFBQSxNQUFFO0FBQzNCLFVBQUksU0FBbUIsUUFBa0IsUUFBa0I7QUFDM0QsZ0JBQVUsZ0JBQWdCLFVBQVU7QUFDcEMsZUFBUyxnQkFBZ0IsV0FBVyxnQkFBZ0IsU0FBUztBQUM3RCxlQUFTLGdCQUFnQixTQUFTLGtCQUFrQixLQUFLLE1BQU07QUFBQSxRQUMzRCxNQUFNO0FBQUEsUUFDTixRQUFRLE9BQU8sWUFBWTtBQUFBLFFBQzNCLGFBQWEsa0JBQWtCLEtBQUssR0FBRztBQUFBLFFBQ3ZDLFNBQVMsY0FBYyxLQUFLLEdBQUc7QUFBQSxNQUNuQyxDQUFDO0FBQ0QsaUJBQVcsZ0JBQWdCLFdBQVc7QUFFdEMsWUFBTSxlQUFzQixDQUFDLEtBQUtBLFVBQVNDLFdBQVUsaUJBQWlCLElBQUk7QUFFMUUsVUFBSTtBQUNBLGVBQU8sTUFBTSxxRkFBcUYsY0FBYyxPQUFPLFlBQVksR0FBRyxtQkFBbUIsYUFBYTtBQUN0SyxnQkFBUSxNQUFNLE1BQU0sWUFBWTtBQUVoQyxZQUFJLENBQUNBLFVBQVMsWUFBWSxHQUFHO0FBQ3pCLGlCQUFPLE1BQU0sOEVBQThFLGNBQWMsT0FBTyxZQUFZLEdBQUcsbUJBQW1CLGFBQWE7QUFDL0osaUJBQU8sTUFBTSxNQUFNLFlBQVk7QUFDL0IsaUJBQU8sTUFBTSx1RkFBdUYsY0FBYyxPQUFPLFlBQVksR0FBRyxtQkFBbUIsYUFBYTtBQUFBLFFBQzVLO0FBQUEsTUFDSixTQUFTLEtBQVU7QUFDZixZQUFJO0FBQ0EsdUJBQWEsT0FBTyxHQUFHLEdBQUcsR0FBRztBQUM3QixpQkFBTyxNQUFNLE1BQU0sWUFBWTtBQUFBLFFBQ25DLFNBQVMsV0FBVztBQUNoQixpQkFBTyxNQUFNLHdHQUF3RyxTQUFTO0FBQzlILGdCQUFNO0FBQUEsUUFDVjtBQUFBLE1BQ0osVUFBRTtBQUNFLHVCQUFlLFVBQVUsY0FBYyxLQUFLLElBQUk7QUFDaEQsWUFBSTtBQUNBLG1CQUFTLE1BQU0sTUFBTSxDQUFDLENBQUM7QUFBQSxRQUMzQixTQUFTLGFBQWE7QUFDbEIsaUJBQU8sTUFBTSx1R0FBdUcsV0FBVztBQUFBLFFBQ25JO0FBQUEsTUFDSjtBQUFBLElBQ0osT0FBTztBQUNILGFBQU8sTUFBTSxpR0FBaUcsY0FBYyxPQUFPLFlBQVksR0FBRyxtQkFBbUIsYUFBYTtBQUMzTCxhQUFPLE1BQU0sMERBQTBELGNBQWMsS0FBSyxVQUFVLGVBQWUsQ0FBQztBQUMzRyxXQUFLLFVBQVVBLFVBQVMsYUFBYSxRQUFXLGVBQWUseUNBQXlDO0FBQUEsSUFDNUc7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxXQUE2QjtBQUN6QixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsVUFBVSxlQUF1QixzQkFBMkIsV0FBbUIsY0FBNEI7QUFDdkcsVUFBTSx5QkFBbUMsOEJBQThCLGVBQUFELFFBQVEsVUFBVSxRQUFRLENBQUMsS0FBSyxDQUFDLGtCQUFrQjtBQUMxSCxVQUFNLFNBQWtCLHVCQUF1QixLQUFLLENBQUMsb0JBQW9CLHFCQUFxQixVQUFVLGVBQWUsQ0FBQztBQUV4SCxvQkFBQUMsU0FBUyxVQUFVLGlCQUFpQixnQkFBQUEsU0FBUyxxQkFBcUI7QUFFbEUsUUFBSSxRQUFRO0FBQ1IsWUFBTSxVQUFrQixhQUFhLHlCQUF5QixTQUFZLE1BQU0sdUJBQXVCLE1BQU0sT0FBTyxlQUFlLE9BQU8sZUFBZTtBQUN6SixzQkFBQUEsU0FBUyxVQUFVLGlCQUFpQixnQkFBQUEsU0FBUyx1QkFBdUIsT0FBTztBQUFBLElBQy9FLE9BQU87QUFDSCxZQUFNLE9BQU87QUFBQSxRQUNULFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQSxRQUNULFdBQVc7QUFBQSxNQUNmO0FBQ0Esc0JBQUFBLFNBQVMsVUFBVSxnQkFBZ0Isa0JBQWtCO0FBQ3JELHNCQUFBQSxTQUFTLE1BQU0sS0FBSyxVQUFVLE1BQU0sTUFBTSxDQUFDLENBQUM7QUFBQSxJQUNoRDtBQUNBLFNBQUssY0FBYztBQUFBLEVBQ3ZCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxnQkFBc0I7QUFDbEIsb0JBQUFBLFNBQVMsTUFBTTtBQUNmLG9CQUFBQSxTQUFTLE1BQU07QUFBQSxFQUNuQjtBQUNKO0FBS0EsU0FBUyw4QkFBOEIsR0FBUSxHQUFnQjtBQUMzRCxJQUFFLElBQUksNEJBQTRCLENBQUM7QUFDbkMsSUFBRSxJQUFJLDRCQUE0QixDQUFDO0FBRW5DLE1BQUksRUFBRSxNQUFNLEVBQUUsR0FBRztBQUViLFVBQU0sS0FBSyxFQUFFLEVBQUUsTUFBTSxVQUFVO0FBQy9CLFVBQU0scUJBQXFCLE9BQU8sT0FBTyxHQUFHLFNBQVM7QUFDckQsVUFBTSxLQUFLLEVBQUUsRUFBRSxNQUFNLFVBQVU7QUFDL0IsVUFBTSxxQkFBcUIsT0FBTyxPQUFPLEdBQUcsU0FBUztBQUNyRCxRQUFJLHFCQUFxQixvQkFBb0I7QUFDekMsUUFBRSxJQUFJLEVBQUUsSUFBSTtBQUFBLElBQ2hCLFdBQVcscUJBQXFCLG9CQUFvQjtBQUNoRCxRQUFFLElBQUksRUFBRSxJQUFJO0FBQUEsSUFDaEI7QUFBQSxFQUNKO0FBQ0EsU0FBTyxFQUFFLElBQUksRUFBRTtBQUNuQjtBQUtBLFNBQVMsNEJBQTRCLGNBQTJCO0FBQzVELFNBQVEsYUFBYSxVQUFVLE9BQU8sS0FBSyxhQUFhLE1BQU0sRUFBRSxTQUFTLElBQUssSUFBSTtBQUN0RjtBQUtBLFNBQVMsb0NBQW9DLGdCQUFnQztBQUN6RSxRQUFNLDRCQUE0QjtBQUNsQyxTQUFPLGVBQWUsUUFBUSwyQkFBMkIsS0FBSztBQUNsRTtBQUtBLFNBQVMsZ0JBQWdCLGFBQXFCLFFBQWdCLEtBQWlCO0FBQzNFLFNBQU8sT0FBTyxRQUFRLEdBQUcsRUFDcEIsT0FBTyxDQUFDLENBQUMsR0FBRyxRQUFRLE1BQU0sWUFBYSxTQUFpQixNQUFNLENBQUMsRUFDL0QsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUN2QixPQUFPLENBQUMsU0FBZ0IsU0FBaUIsZ0NBQWdDLFNBQVMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQ3hHLEtBQUssNkJBQTZCO0FBQzNDO0FBS0EsU0FBUyxnQ0FBZ0Msb0JBQTJCLGFBQXFCLGFBQTRCO0FBRWpILFFBQU0sY0FBYyxNQUFNLG9DQUFvQyxXQUFXLENBQUM7QUFDMUUsUUFBTSxVQUFVLFlBQVksV0FBVztBQUV2QyxNQUFJLFNBQVM7QUFFVCxVQUFNLGFBQWEsUUFBUTtBQUUzQixVQUFNLG9CQUFvQjtBQUFBLE1BQ3RCLEdBQUc7QUFBQSxNQUNILEdBQUc7QUFBQSxNQUNIO0FBQUEsSUFDSjtBQUNBLHVCQUFtQixLQUFLLGlCQUFpQjtBQUFBLEVBQzdDO0FBQ0EsU0FBTztBQUNYO0FBS0EsU0FBUyw4QkFBOEIsWUFBNkQ7QUFDaEcsTUFBSSxlQUFlLFVBQWEsZUFBZTtBQUMzQztBQUVKLE1BQUksZUFBZSxXQUFXLE1BQU0sR0FBRztBQUN2QyxpQkFBZSxhQUFhLElBQUksQ0FBQyxrQkFBa0I7QUFFL0MsV0FBTyxjQUFjLFFBQVEsTUFBTSxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUs7QUFBQSxFQUM5RCxDQUFDO0FBQ0QsU0FBTyxhQUFhLE9BQU8sVUFBUSxLQUFLLFNBQVMsQ0FBQztBQUN0RDtBQUtBLFNBQVMscUJBQXFCLFFBQWdCLFFBQXlCO0FBQ25FLE1BQUksV0FBVztBQUNYLFdBQU87QUFFWCxRQUFNLFVBQVUsT0FBTyxNQUFNLEdBQUc7QUFDaEMsUUFBTSxVQUFVLE9BQU8sTUFBTSxHQUFHO0FBR2hDLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUVYLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUdYLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUVYLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUVYLFNBQU87QUFDWDtBQUtBLE1BQU0sb0JBQW9CLFNBQWdDLFFBQWEsS0FBcUIsS0FBVUQsVUFBY0MsV0FBcUI7QUFDckksTUFBSSxJQUFJLGVBQWU7QUFDbkIsVUFBTSxjQUFjLElBQUksYUFBYSxPQUFPLElBQUksWUFBWSxPQUFPLElBQUksWUFBWSxNQUFNLE9BQU8sSUFBSSxlQUFlLE9BQU8sSUFBSSxlQUFlO0FBQzdJLFdBQU8sS0FBSyxzRkFBc0YsT0FBTyxNQUFNLE9BQU8sUUFBUSxPQUFPLGFBQWEsT0FBTyxTQUFTLFVBQVU7QUFBQSxFQUNoTCxPQUFPO0FBQ0gsV0FBTyxNQUFNLGtGQUFrRixPQUFPLE1BQU0sT0FBTyxRQUFRLE9BQU8sYUFBYSxPQUFPLFNBQVMsR0FBRztBQUFBLEVBQ3RLO0FBRUEsUUFBTSxnQkFBZ0IsSUFBSSxpQkFBaUJBLFVBQVM7QUFDcEQsUUFBTSxlQUFlLElBQUksZ0JBQWlCLE9BQU8sSUFBSTtBQUNyRCxRQUFNLFlBQVksSUFBSSxhQUFjLE9BQU8sSUFBSTtBQUMvQyxRQUFNLFlBQVksSUFBSTtBQUV0QixPQUFLLFVBQVUsZUFBZSxXQUFXLFdBQVcsWUFBWTtBQUNwRTtBQUtBLE1BQU0saUJBQWlCLFNBQVVELFVBQWMsb0JBQThCLG9CQUF1QztBQUNoSCxNQUFJLG1CQUFtQjtBQUN2QixRQUFNLG9CQUFvQiw4QkFBOEJBLFNBQVEsVUFBVSxRQUFRLENBQUM7QUFHbkYsTUFBSSxDQUFDLHFCQUFxQixrQkFBa0IsV0FBVyxLQUFLLGtCQUFrQixTQUFTLEtBQUssR0FBRztBQUUzRix1QkFBbUI7QUFBQSxFQUN2QixPQUFPO0FBQ0gsUUFBSSxzQkFBc0IsbUJBQW1CLFFBQVE7QUFDakQsWUFBTSxzQkFBc0Isa0JBQWtCLE9BQU8sQ0FBQyxxQkFBcUI7QUFDdkUsZUFBTyxtQkFBbUIsS0FBSyxDQUFDLHNCQUFzQjtBQUNsRCxpQkFBTyxxQkFBcUIsa0JBQWtCLGlCQUFpQjtBQUFBLFFBQ25FLENBQUM7QUFBQSxNQUNMLENBQUM7QUFDRCx5QkFBbUIsdUJBQXVCLG9CQUFvQixTQUFTO0FBQUEsSUFDM0UsT0FBTztBQUVILHlCQUFtQjtBQUFBLElBQ3ZCO0FBQUEsRUFDSjtBQUdBLE1BQUksbUJBQW1CO0FBQ3ZCLFFBQU0sd0JBQXdCLDhCQUE4QkEsU0FBUSxlQUFlLENBQUM7QUFFcEYsTUFBSSxDQUFDLHNCQUFzQixtQkFBbUIsV0FBVyxLQUFLLG1CQUFtQixTQUFTLEtBQUssR0FBRztBQUU5Rix1QkFBbUI7QUFBQSxFQUN2QixPQUFPO0FBQ0gsUUFBSSx5QkFBeUIsc0JBQXNCLG1CQUFtQixRQUFRO0FBQzFFLFlBQU0sc0JBQXNCLHNCQUFzQixPQUFPLENBQUMseUJBQXlCO0FBQy9FLGVBQU8sbUJBQW1CLEtBQUssQ0FBQyxzQkFBc0I7QUFDbEQsaUJBQU8scUJBQXFCLHNCQUFzQixpQkFBaUI7QUFBQSxRQUN2RSxDQUFDO0FBQUEsTUFDTCxDQUFDO0FBQ0QseUJBQW1CLHVCQUF1QixvQkFBb0IsU0FBUztBQUFBLElBQzNFO0FBQUEsRUFDSjtBQUVBLFNBQU8sb0JBQW9CO0FBQy9COyIsCiAgIm5hbWVzIjogWyJyZXF1ZXN0IiwgInJlc3BvbnNlIl0KfQo=
310
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2h0dHAvcnMvcmVzb3VyY2UtaHR0cC1jb250cm9sbGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSZXNwb25zZSBhcyByZXNwb25zZSB9IGZyb20gXCIuLi9yZXNwb25zZVwiO1xuaW1wb3J0IHsgUmVxdWVzdCBhcyByZXF1ZXN0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IFJlc291cmNlTWFwcGluZ3MgfSBmcm9tIFwiLi9yZXNvdXJjZS1tYXBwaW5nc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvbG9nXCI7XG5cbi8vIERlY2xhcmF0aW9uIGZvciB0aGUgZXh0ZXJuYWwgZGlyaWdpYmxlUmVxdWlyZSBmdW5jdGlvbiBhbmQgaXRzIGRlcGVuZGVuY3lcbmRlY2xhcmUgZnVuY3Rpb24gZGlyaWdpYmxlUmVxdWlyZShtb2R1bGU6IHN0cmluZyk6IGFueTtcbmNvbnN0IHsgbWF0Y2ggfSA9IGRpcmlnaWJsZVJlcXVpcmUoXCJtb2R1bGVzL3NyYy9odHRwL3BhdGgtdG8tcmVnZXhwLzYuMi4xL2luZGV4LmpzXCIpO1xuXG5jb25zdCBsb2dnZXI6IGFueSA9IExvZ2dpbmcuZ2V0TG9nZ2VyKCdodHRwLnJzLmNvbnRyb2xsZXInKTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgdG8gaGFuZGxlciBmdW5jdGlvbnMgKGJlZm9yZSwgc2VydmUsIGNhdGNoKS5cbiAqL1xuaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0IHtcbiAgICBwYXRoUGFyYW1ldGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBxdWVyeVBhcmFtZXRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgcmVzcG9uc2U6IGFueTtcbiAgICByZXM6IGFueTtcbiAgICByZXF1ZXN0OiBhbnk7XG4gICAgcmVxOiBhbnk7XG4gICAgLy8gQ29udGV4dCBwcm9wZXJ0aWVzIGZvciBlcnJvciBoYW5kbGluZyBtaWdodCBhbHNvIGJlIGF0dGFjaGVkIGhlcmVcbiAgICBzdXBwcmVzc1N0YWNrPzogYm9vbGVhbjtcbiAgICBodHRwRXJyb3JDb2RlPzogbnVtYmVyO1xuICAgIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgICBlcnJvck5hbWU/OiBzdHJpbmc7XG4gICAgZXJyb3JDb2RlPzogYW55O1xufVxuXG5mdW5jdGlvbiBnZXRSZXF1ZXN0KCk6IGFueSB7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG59XG5mdW5jdGlvbiBnZXRSZXNwb25zZSgpOiBhbnkge1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2VydmljZSAoSHR0cENvbnRyb2xsZXIpIGluc3RhbmNlLCBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggb01hcHBpbmdzLlxuICpcbiAqIEBwYXJhbSBvQ29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IG9yIGNvbmZpZ3VyYXRpb24gYnVpbGRlciB3aXRoIGNvbmZpZ3VyYXRpb24oKSBnZXR0ZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIG5ldyBIdHRwQ29udHJvbGxlciBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2Uob0NvbmZpZz86IGFueSk6IEh0dHBDb250cm9sbGVyIHtcbiAgICBsZXQgY29uZmlnOiBSZXNvdXJjZU1hcHBpbmdzIHwgYW55O1xuICAgIGlmIChvQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvQ29uZmlnID09PSAnb2JqZWN0JyB8fCBvQ29uZmlnIGluc3RhbmNlb2YgUmVzb3VyY2VNYXBwaW5ncykge1xuICAgICAgICAgICAgY29uZmlnID0gb0NvbmZpZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEh0dHBDb250cm9sbGVyKGNvbmZpZyk7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgZm9yIGhhbmRsaW5nIEhUVFAgcmVxdWVzdHMgYW5kIHJvdXRpbmcgdGhlbSB0byB0aGUgY29ycmVjdCByZXNvdXJjZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBDb250cm9sbGVyIHtcblxuICAgIHJlc291cmNlOiBGdW5jdGlvbjtcbiAgICByZXNvdXJjZVBhdGg6IEZ1bmN0aW9uO1xuICAgIHJlc291cmNlTWFwcGluZ3M6IFJlc291cmNlTWFwcGluZ3M7XG5cbiAgICAvLyBJbmRleCBzaWduYXR1cmUgdG8gYWxsb3cgZHluYW1pYyBtZXRob2QgYXNzaWdubWVudCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgSHR0cENvbnRyb2xsZXIgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9NYXBwaW5ncyBUaGUgbWFwcGluZ3MgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBjb250cm9sbGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9NYXBwaW5ncz86IFJlc291cmNlTWFwcGluZ3MgfCBhbnkpIHtcbiAgICAgICAgaWYgKG9NYXBwaW5ncyBpbnN0YW5jZW9mIFJlc291cmNlTWFwcGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VNYXBwaW5ncyA9IG9NYXBwaW5ncztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb01hcHBpbmdzID09PSAnb2JqZWN0JyB8fCBvTWFwcGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Mob01hcHBpbmdzLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgaW5pdGlhbGl6YXRpb24gaWYgaW5wdXQgaXMgdW5leHBlY3RlZFxuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Moe30sIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxpYXMgZm9yIHJlc291cmNlTWFwcGluZ3MucmVzb3VyY2VcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZU1hcHBpbmdzLnJlc291cmNlUGF0aC5iaW5kKHRoaXMucmVzb3VyY2VNYXBwaW5ncyk7XG5cbiAgICAgICAgLy8gd2VhdmUtaW4gSFRUUCBtZXRob2QtYmFzZWQgZmFjdG9yeSBmdW5jdGlvbnMgLSBzaG9ydGN1dCBmb3Igc2VydmljZSgpLnJlc291cmNlKHNQYXRoKS5tZXRob2RcbiAgICAgICAgWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3JlbW92ZScsICdtZXRob2QnXS5mb3JFYWNoKChzTWV0aG9kTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzW3NNZXRob2ROYW1lXSA9ICguLi5hbGxBcmd1bWVudHM6IGFueVtdKTogSHR0cENvbnRyb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbGxBcmd1bWVudHMubGVuZ3RoIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0luc3VmZmljaWVudCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gSHR0cENvbnRyb2xsZXIgbWV0aG9kICcgKyBzTWV0aG9kTmFtZSArICcuJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBzUGF0aCBpcyBhbHdheXMgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICAgICAgICAgICAgbGV0IHNQYXRoID0gYWxsQXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChzUGF0aCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBzUGF0aCA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBhcmd1bWVudHMgKHNWZXJiLCBhcnJDb25zdW1lcywgYXJyUHJvZHVjZXMpIGFyZSB1c2VkIGJ5IFJlc291cmNlTWFwcGluZ3MuZmluZC9yZXNvdXJjZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNWZXJiID0gYWxsQXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyckNvbnN1bWVzID0gYWxsQXJndW1lbnRzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyclByb2R1Y2VzID0gYWxsQXJndW1lbnRzWzNdO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluZCBleGlzdGluZyByZXNvdXJjZSBvciBjcmVhdGUgYSBuZXcgb25lIGJhc2VkIG9uIHRoZSBwYXRoIChhbmQgb3RoZXIgb3B0aW9uYWwgY29uc3RyYWludHMpXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2U6IGFueSA9IHRoaXMucmVzb3VyY2VNYXBwaW5ncy5maW5kKHNQYXRoLCBzVmVyYiwgYXJyQ29uc3VtZXMsIGFyclByb2R1Y2VzKSB8fCB0aGlzLnJlc291cmNlTWFwcGluZ3MucmVzb3VyY2Uoc1BhdGgpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFzcyBhbGwgYXJndW1lbnRzICpleGNlcHQqIHRoZSBzUGF0aCB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb2YgdGhlIHJlc291cmNlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VNZXRob2RBcmdzID0gYWxsQXJndW1lbnRzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIG1ldGhvZCBvbiB0aGUgcmVzb3VyY2UgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICByZXNvdXJjZVtzTWV0aG9kTmFtZV0uYXBwbHkocmVzb3VyY2UsIHJlc291cmNlTWV0aG9kQXJncyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZXhlY3V0ZS5cbiAgICAgKi9cbiAgICBsaXN0ZW4ocmVxdWVzdDogYW55LCByZXNwb25zZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXhlY3V0ZShyZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHJlcXVlc3QgaGFuZGxpbmcgbG9naWMsIGZpbmRpbmcgdGhlIGJlc3QgbWF0Y2hpbmcgcmVzb3VyY2UgYW5kIGhhbmRsZXIuXG4gICAgICovXG4gICAgZXhlY3V0ZShyZXF1ZXN0PzogYW55LCByZXNwb25zZT86IGFueSk6IHZvaWQge1xuICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdCB8fCBnZXRSZXF1ZXN0KCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXRoOiBzdHJpbmcgPSByZXF1ZXN0LmdldFJlc291cmNlUGF0aCgpO1xuICAgICAgICBjb25zdCBtZXRob2Q6IHN0cmluZyA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgX29Db25maWd1cmF0aW9uOiBhbnkgPSB0aGlzLnJlc291cmNlTWFwcGluZ3MuY29uZmlndXJhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZXM6IGFueVtdID0gbWF0Y2hSZXF1ZXN0VXJsKHJlcXVlc3RQYXRoLCBtZXRob2QsIF9vQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGxldCByZXNvdXJjZUhhbmRsZXI6IGFueTtcblxuICAgICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzWzBdKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiSGFuZGxlcnM6IGFueVtdID0gX29Db25maWd1cmF0aW9uW21hdGNoZXNbMF0uZF1bbWV0aG9kXTtcbiAgICAgICAgICAgIGlmICh2ZXJiSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICByZXNvdXJjZUhhbmRsZXIgPSB2ZXJiSGFuZGxlcnMuZmlsdGVyKChoYW5kbGVyRGVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaE1lZGlhVHlwZShyZXF1ZXN0LCBoYW5kbGVyRGVmLnByb2R1Y2VzLCBoYW5kbGVyRGVmLmNvbnN1bWVzKTtcbiAgICAgICAgICAgICAgICB9KVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UgfHwgZ2V0UmVzcG9uc2UoKTtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSByZXF1ZXN0LmdldFF1ZXJ5UGFyYW1ldGVyc01hcCgpIHx8IHt9O1xuICAgICAgICBjb25zdCBhY2NlcHRzSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdBY2NlcHQnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IHJlc291cmNlUGF0aDogc3RyaW5nID0gcmVxdWVzdFBhdGg7XG5cbiAgICAgICAgaWYgKHJlc291cmNlSGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgY3R4OiBSZXF1ZXN0Q29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICBcInBhdGhQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicXVlcnlQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicmVzcG9uc2VcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXNcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXF1ZXN0XCI6IHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgXCJyZXFcIjogcmVxdWVzdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzWzBdLnBhdGhQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBjdHgucGF0aFBhcmFtZXRlcnMgPSBtYXRjaGVzWzBdLnBhdGhQYXJhbXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHgucXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbXM7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vb3AgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgICAgICBsZXQgX2JlZm9yZTogRnVuY3Rpb24sIF9zZXJ2ZTogRnVuY3Rpb24sIF9jYXRjaDogRnVuY3Rpb24sIF9maW5hbGx5OiBGdW5jdGlvbjtcbiAgICAgICAgICAgIF9iZWZvcmUgPSByZXNvdXJjZUhhbmRsZXIuYmVmb3JlIHx8IG5vb3A7XG4gICAgICAgICAgICBfc2VydmUgPSByZXNvdXJjZUhhbmRsZXIuaGFuZGxlciB8fCByZXNvdXJjZUhhbmRsZXIuc2VydmUgfHwgbm9vcDtcbiAgICAgICAgICAgIF9jYXRjaCA9IHJlc291cmNlSGFuZGxlci5jYXRjaCB8fCBjYXRjaEVycm9ySGFuZGxlci5iaW5kKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiByZXNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogY29udGVudFR5cGVIZWFkZXIuam9pbignLCcpLFxuICAgICAgICAgICAgICAgIGFjY2VwdHM6IGFjY2VwdHNIZWFkZXIuam9pbignLCcpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9maW5hbGx5ID0gcmVzb3VyY2VIYW5kbGVyLmZpbmFsbHkgfHwgbm9vcDtcblxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tBcmdzOiBhbnlbXSA9IFtjdHgsIHJlcXVlc3QsIHJlc3BvbnNlLCByZXNvdXJjZUhhbmRsZXIsIHRoaXNdO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgnQmVmb3JlIHNlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgIF9iZWZvcmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcblxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuaXNDb21taXR0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoJ1NlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgICAgICBfc2VydmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCdTZXJ2aW5nIHJlcXVlc3QgZm9yIFJlc291cmNlW3t9XSwgTWV0aG9kW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCcsIHJlc291cmNlUGF0aCwgbWV0aG9kLnRvVXBwZXJDYXNlKCksIGNvbnRlbnRUeXBlSGVhZGVyLCBhY2NlcHRzSGVhZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrQXJncy5zcGxpY2UoMSwgMCwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgX2NhdGNoLmFwcGx5KHRoaXMsIGNhbGxiYWNrQXJncyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoX2NhdGNoRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gZXJyb3IgaGFuZGxlciB0aHJldyBlcnJvcicsIF9jYXRjaEVycik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IF9jYXRjaEVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIEh0dHBDb250cm9sbGVyLnByb3RvdHlwZS5jbG9zZVJlc3BvbnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgX2ZpbmFsbHkuYXBwbHkodGhpcywgW10pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF9maW5hbGx5RXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gcG9zdCBoYW5kbGVyIHRocmV3IGVycm9yJywgX2ZpbmFsbHlFcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTm8gc3VpdGFibGUgcmVzb3VyY2UgaGFuZGxlciBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZvdW5kJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuXHRcdFx0bG9nZ2VyLmVycm9yKCdSZWdpc3RlcmVkIHJlc291cmNlIGhhbmRsZXJzIGZvciBSZXNvdXJjZVt7fV0gYXJlIFt7fV0nLCByZXNvdXJjZVBhdGgsIEpTT04uc3RyaW5naWZ5KF9vQ29uZmlndXJhdGlvbikpO1xuICAgICAgICAgICAgdGhpcy5zZW5kRXJyb3IocmVzcG9uc2UuQkFEX1JFUVVFU1QsIHVuZGVmaW5lZCwgJ0JhZCBSZXF1ZXN0JywgJ05vIHN1aXRhYmxlIHByb2Nlc3NvciBmb3IgdGhpcyByZXF1ZXN0LicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgUmVzb3VyY2VNYXBwaW5ncyBpbnN0YW5jZSBvZiB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgbWFwcGluZ3MoKTogUmVzb3VyY2VNYXBwaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlTWFwcGluZ3M7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIGVycm9yIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQsIGZvcm1hdHRlZCBiYXNlZCBvbiB0aGUgYWNjZXB0ZWQgbWVkaWEgdHlwZS5cbiAgICAgKi9cbiAgICBzZW5kRXJyb3IoaHR0cEVycm9yQ29kZTogbnVtYmVyLCBhcHBsaWNhdGlvbkVycm9yQ29kZTogYW55LCBlcnJvck5hbWU6IHN0cmluZywgZXJyb3JEZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2xpZW50QWNjZXB0TWVkaWFUeXBlczogc3RyaW5nW10gPSBub3JtYWxpemVNZWRpYVR5cGVIZWFkZXJWYWx1ZShyZXF1ZXN0LmdldEhlYWRlcignQWNjZXB0JykpIHx8IFsnYXBwbGljYXRpb24vanNvbiddO1xuICAgICAgICBjb25zdCBpc0h0bWw6IGJvb2xlYW4gPSBjbGllbnRBY2NlcHRNZWRpYVR5cGVzLnNvbWUoKGFjY2VwdE1lZGlhVHlwZSkgPT4gaXNNaW1lVHlwZUNvbXBhdGlibGUoJyovaHRtbCcsIGFjY2VwdE1lZGlhVHlwZSkpO1xuXG4gICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhodHRwRXJyb3JDb2RlIHx8IHJlc3BvbnNlLklOVEVSTkFMX1NFUlZFUl9FUlJPUik7XG5cbiAgICAgICAgaWYgKGlzSHRtbCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZTogc3RyaW5nID0gZXJyb3JOYW1lICsgKGFwcGxpY2F0aW9uRXJyb3JDb2RlICE9PSB1bmRlZmluZWQgPyAnWycgKyBhcHBsaWNhdGlvbkVycm9yQ29kZSArICddJyA6ICcnKSArIChlcnJvckRldGFpbHMgPyAnOiAnICsgZXJyb3JEZXRhaWxzIDogJycpO1xuICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKGh0dHBFcnJvckNvZGUgfHwgcmVzcG9uc2UuSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBtZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgICAgICAgXCJjb2RlXCI6IGFwcGxpY2F0aW9uRXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgIFwiZGV0YWlsc1wiOiBlcnJvckRldGFpbHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgcmVzcG9uc2UucHJpbnQoSlNPTi5zdHJpbmdpZnkoYm9keSwgbnVsbCwgMikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2VSZXNwb25zZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGbHVzaGVzIGFuZCBjbG9zZXMgdGhlIEhUVFAgcmVzcG9uc2Ugc3RyZWFtLlxuICAgICAqL1xuICAgIGNsb3NlUmVzcG9uc2UoKTogdm9pZCB7XG4gICAgICAgIHJlc3BvbnNlLmZsdXNoKCk7XG4gICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gc29ydCBmdW5jdGlvbiBmb3IgbWF0Y2hlZCByb3V0ZSBkZWZpbml0aW9ucywgcHJlZmVycmluZyBleGFjdCBtYXRjaGVzIG92ZXIgdGhvc2Ugd2l0aCBwbGFjZWhvbGRlcnMuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZWRSb3V0ZURlZmluaXRpb25zU29ydGVyKHA6IGFueSwgbjogYW55KTogbnVtYmVyIHtcbiAgICBwLncgPSBjYWxjdWxhdGVNYXRjaGVkUm91dGVXZWlnaHQocCk7XG4gICAgbi53ID0gY2FsY3VsYXRlTWF0Y2hlZFJvdXRlV2VpZ2h0KG4pO1xuXG4gICAgaWYgKG4udyA9PT0gcC53KSB7XG4gICAgICAgIC8vIFRoZSBvbmUgd2l0aCBsZXNzIHBsYWNlaG9sZGVycyB3aW5zXG4gICAgICAgIGNvbnN0IG0xID0gcC5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDEgPSBtMSAhPT0gbnVsbCA/IG0xLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IG0yID0gbi5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDIgPSBtMiAhPT0gbnVsbCA/IG0yLmxlbmd0aCA6IDA7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnNDb3VudDEgPiBwbGFjZWhvbGRlcnNDb3VudDIpIHtcbiAgICAgICAgICAgIG4udyA9IG4udyArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2Vob2xkZXJzQ291bnQxIDwgcGxhY2Vob2xkZXJzQ291bnQyKSB7XG4gICAgICAgICAgICBwLncgPSBwLncgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuLncgLSBwLnc7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW5pdGlhbCB3ZWlnaHQgb2YgYSBtYXRjaGVkIHJvdXRlIGRlZmluaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1hdGNoZWRSb3V0ZVdlaWdodChtYXRjaGVkUm91dGU6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIChtYXRjaGVkUm91dGUucGFyYW1zICYmIE9iamVjdC5rZXlzKG1hdGNoZWRSb3V0ZS5wYXJhbXMpLmxlbmd0aCA+IDApID8gMCA6IDE7IC8vIGFsd2F5cyBwcmVmZXIgZXhhY3Qgcm91dGUgZGVmaW5pdGlvbnMgLSBzZXQgd2VpZ2h0IHRvIDFcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHBhdGggcGFyYW1ldGVycyBkZWNsYXJlZCBpbiBicmFjZXMgKGUuZy4sICcvYXBpL3twYXRoUGFyYW19JykgdG8gcGF0aC10by1yZWdleHAgZm9ybWF0IChlLmcuLCAnL2FwaS86cGF0aFBhcmFtJykuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKHBhdGhEZWZpbml0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdGhQYXJhbXNJbkJyYWNlc01hdGNoZXIgPSAvKHsoXFx3KlxcKj8pfSkvZzsgLy8gbWF0Y2hlcyBjYXNlcyBsaWtlICcvYXBpL3twYXRoUGFyYW19JyBvciAnL2FwaS97cGF0aFBhcmFtKn0nXG4gICAgcmV0dXJuIHBhdGhEZWZpbml0aW9uLnJlcGxhY2UocGF0aFBhcmFtc0luQnJhY2VzTWF0Y2hlciwgXCI6JDJcIik7IC8vIHRyYW5zZm9ybXMgbWF0Y2hlZCBjYXNlcyB0byAnL2FwaS86cGF0aFBhcmFtJyBvciAnL2FwaS86cGF0aFBhcmFtKidcbn1cblxuLyoqXG4gKiBGaW5kcyBhbGwgcm91dGVzIGluIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgbWF0Y2ggdGhlIHJlcXVlc3QgcGF0aCBhbmQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBtYXRjaFJlcXVlc3RVcmwocmVxdWVzdFBhdGg6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIGNmZzogYW55KTogYW55W10ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjZmcpXG4gICAgICAgIC5maWx0ZXIoKFtfLCBoYW5kbGVyc10pID0+IGhhbmRsZXJzICYmIChoYW5kbGVycyBhcyBhbnkpW21ldGhvZF0pXG4gICAgICAgIC5tYXAoKFtwYXRoLCBfXSkgPT4gcGF0aClcbiAgICAgICAgLnJlZHVjZSgobWF0Y2hlczogYW55W10sIHBhdGg6IHN0cmluZykgPT4gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVzLCBwYXRoLCByZXF1ZXN0UGF0aCksIFtdKVxuICAgICAgICAuc29ydChtYXRjaGVkUm91dGVEZWZpbml0aW9uc1NvcnRlcik7XG59XG5cbi8qKlxuICogUmVkdWNlciBmdW5jdGlvbiB0byBhdHRlbXB0IG1hdGNoaW5nIGEgZGVmaW5lZCBwYXRoIGFnYWluc3QgdGhlIHJlcXVlc3QgcGF0aCB1c2luZyBwYXRoLXRvLXJlZ2V4cC5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVkRGVmaW5pdGlvbnM6IGFueVtdLCBkZWZpbmVkUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogYW55W10ge1xuICAgIC8vICdtYXRjaCcgZnJvbSBwYXRoLXRvLXJlZ2V4cCBpcyB1c2VkIGhlcmVcbiAgICBjb25zdCBwYXRoTWF0Y2hlciA9IG1hdGNoKHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKGRlZmluZWRQYXRoKSk7XG4gICAgY29uc3QgbWF0Y2hlZCA9IHBhdGhNYXRjaGVyKHJlcXVlc3RQYXRoKTtcblxuICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgIC8vIEVuc3VyZSBwYXRoUGFyYW1zIGlzIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnNcbiAgICAgICAgY29uc3QgcGF0aFBhcmFtcyA9IG1hdGNoZWQucGFyYW1zO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZWREZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgcDogcmVxdWVzdFBhdGgsXG4gICAgICAgICAgICBkOiBkZWZpbmVkUGF0aCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXM6IHBhdGhQYXJhbXNcbiAgICAgICAgfTtcbiAgICAgICAgbWF0Y2hlZERlZmluaXRpb25zLnB1c2gobWF0Y2hlZERlZmluaXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlZERlZmluaXRpb25zO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW4gSFRUUCBtZWRpYSB0eXBlIGhlYWRlciB2YWx1ZSAoZS5nLiwgXCJ0ZXh0L3BsYWluOyBxPTAuOSwgYXBwbGljYXRpb24vanNvblwiKS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUoc01lZGlhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoc01lZGlhVHlwZSA9PT0gdW5kZWZpbmVkIHx8IHNNZWRpYVR5cGUgPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAvLyBjb252ZXJ0IHRvIGFycmF5IG9mIGluZGl2aWR1YWwgdHlwZXNcbiAgICBsZXQgYXJyTWVkaWFUeXBlID0gc01lZGlhVHlwZS5zcGxpdCgnLCcpO1xuICAgIGFyck1lZGlhVHlwZSA9IGFyck1lZGlhVHlwZS5tYXAoKG1pbWVUeXBlRW50cnkpID0+IHtcbiAgICAgICAgLy8gcmVtb3ZlIGVzY2FwaW5nLCByZW1vdmUgcXVhbGl0eSBvciBvdGhlciBhdHRyaWJ1dGVzIChlLmcuLCAnOyBxPTAuOScpXG4gICAgICAgIHJldHVybiBtaW1lVHlwZUVudHJ5LnJlcGxhY2UoJ1xcXFwnLCAnJykuc3BsaXQoJzsnKVswXS50cmltKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFyck1lZGlhVHlwZS5maWx0ZXIodHlwZSA9PiB0eXBlLmxlbmd0aCA+IDApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNvdXJjZSBNSU1FIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIGEgdGFyZ2V0IE1JTUUgdHlwZSwgc3VwcG9ydGluZyB3aWxkY2FyZHMgKCopLlxuICovXG5mdW5jdGlvbiBpc01pbWVUeXBlQ29tcGF0aWJsZShzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoc291cmNlID09PSB0YXJnZXQpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0TSA9IHRhcmdldC5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHNvdXJjZU0gPSBzb3VyY2Uuc3BsaXQoJy8nKTtcblxuICAgIC8vIFRhcmdldCBpcyB3aWxkY2FyZCB0eXBlLCBTb3VyY2UgaGFzIGEgc3BlY2lmaWMgc3VidHlwZSAoZS5nLiwgdGFyZ2V0PSovanNvbiwgc291cmNlPWFwcGxpY2F0aW9uL2pzb24pXG4gICAgaWYgKHRhcmdldE1bMF0gPT09ICcqJyAmJiB0YXJnZXRNWzFdID09PSBzb3VyY2VNWzFdKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBTb3VyY2UgaXMgd2lsZGNhcmQgdHlwZSwgVGFyZ2V0IGhhcyBhIHNwZWNpZmljIHN1YnR5cGUgKGUuZy4sIHNvdXJjZT0qL2pzb24sIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzBdID09PSAnKicgJiYgdGFyZ2V0TVsxXSA9PT0gc291cmNlTVsxXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBUYXJnZXQgaXMgd2lsZGNhcmQgc3VidHlwZSwgU291cmNlIGhhcyBhIHNwZWNpZmljIHR5cGUgKGUuZy4sIHRhcmdldD1hcHBsaWNhdGlvbi8qLCBzb3VyY2U9YXBwbGljYXRpb24vanNvbilcbiAgICBpZiAodGFyZ2V0TVsxXSA9PT0gJyonICYmIHRhcmdldE1bMF0gPT09IHNvdXJjZU1bMF0pXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFNvdXJjZSBpcyB3aWxkY2FyZCBzdWJ0eXBlLCBUYXJnZXQgaGFzIGEgc3BlY2lmaWMgdHlwZSAoZS5nLiwgc291cmNlPWFwcGxpY2F0aW9uLyosIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzFdID09PSAnKicgJiYgdGFyZ2V0TVswXSA9PT0gc291cmNlTVswXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogRGVmYXVsdCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLlxuICovXG5jb25zdCBjYXRjaEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uICh0aGlzOiBIdHRwQ29udHJvbGxlciwgbG9nY3R4OiBhbnksIGN0eDogUmVxdWVzdENvbnRleHQsIGVycjogYW55LCByZXF1ZXN0OiBhbnksIHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY3R4LnN1cHByZXNzU3RhY2spIHtcbiAgICAgICAgY29uc3QgZGV0YWlsc01zZyA9IChjdHguZXJyb3JOYW1lIHx8IFwiXCIpICsgKGN0eC5lcnJvckNvZGUgPyBcIiBbXCIgKyBjdHguZXJyb3JDb2RlICsgXCJdXCIgOiBcIlwiKSArIChjdHguZXJyb3JNZXNzYWdlID8gXCI6IFwiICsgY3R4LmVycm9yTWVzc2FnZSA6IFwiXCIpO1xuICAgICAgICBsb2dnZXIuaW5mbygnU2VydmluZyByZXNvdXJjZVt7fV0sIFZlcmJbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZpbmlzaGVkIGluIGVycm9yLiB7fScsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBkZXRhaWxzTXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ1NlcnZpbmcgcmVzb3VyY2Vbe31dLCBWZXJiW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCBpbiBlcnJvcicsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBlcnIpO1xuICAgIH1cblxuICAgIGNvbnN0IGh0dHBFcnJvckNvZGUgPSBjdHguaHR0cEVycm9yQ29kZSB8fCByZXNwb25zZS5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY3R4LmVycm9yTWVzc2FnZSB8fCAoZXJyICYmIGVyci5tZXNzYWdlKTtcbiAgICBjb25zdCBlcnJvck5hbWUgPSBjdHguZXJyb3JOYW1lIHx8IChlcnIgJiYgZXJyLm5hbWUpO1xuICAgIGNvbnN0IGVycm9yQ29kZSA9IGN0eC5lcnJvckNvZGU7XG5cbiAgICB0aGlzLnNlbmRFcnJvcihodHRwRXJyb3JDb2RlLCBlcnJvckNvZGUsIGVycm9yTmFtZSwgZXJyb3JNZXNzYWdlKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSByZXF1ZXN0IG1lZGlhIHR5cGVzIG1hdGNoIHRoZSByZXNvdXJjZSBoYW5kbGVyJ3MgY29uc3VtZXMgYW5kIHByb2R1Y2VzIGNvbnN0cmFpbnRzLlxuICovXG5jb25zdCBtYXRjaE1lZGlhVHlwZSA9IGZ1bmN0aW9uIChyZXF1ZXN0OiBhbnksIHByb2R1Y2VzTWVkaWFUeXBlczogc3RyaW5nW10sIGNvbnN1bWVzTWVkaWFUeXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBsZXQgaXNQcm9kdWNlTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFjY2VwdHNNZWRpYVR5cGVzID0gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUocmVxdWVzdC5nZXRIZWFkZXIoJ0FjY2VwdCcpKTtcblxuICAgIC8vIDEuIENoZWNrIFByb2R1Y2VzIChBY2NlcHRzIGhlYWRlcilcbiAgICBpZiAoIWFjY2VwdHNNZWRpYVR5cGVzIHx8IGFjY2VwdHNNZWRpYVR5cGVzLmxlbmd0aCA9PT0gMCB8fCBhY2NlcHRzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gT3V0cHV0IG1lZGlhIHR5cGUgaXMgbm90IHJlc3RyaWN0ZWQgYnkgY2xpZW50IG9yIGNsaWVudCBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzUHJvZHVjZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9kdWNlc01lZGlhVHlwZXMgJiYgcHJvZHVjZXNNZWRpYVR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFByb2R1Y2VzTUlNRSA9IGFjY2VwdHNNZWRpYVR5cGVzLmZpbHRlcigoYWNjZXB0c01lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWNlc01lZGlhVHlwZXMuc29tZSgocHJvZHVjZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGFjY2VwdHNNZWRpYVR5cGUsIHByb2R1Y2VzTWVkaWFUeXBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IG1hdGNoZWRQcm9kdWNlc01JTUUgJiYgbWF0Y2hlZFByb2R1Y2VzTUlNRS5sZW5ndGggPiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVzb3VyY2UgZG9lc24ndCBzcGVjaWZ5IHByb2R1Y2VzLCBzbyBpdCBtYXRjaGVzIGlmIHRoZSBjbGllbnQgYWNjZXB0cyBhbnl0aGluZyBvciBpZiBwcm9kdWNlcyBpcyBhbiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBDaGVjayBDb25zdW1lcyAoQ29udGVudC1UeXBlIGhlYWRlcilcbiAgICBsZXQgaXNDb25zdW1lTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlTWVkaWFUeXBlcyA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSk7XG5cbiAgICBpZiAoIWNvbnN1bWVzTWVkaWFUeXBlcyB8fCBjb25zdW1lc01lZGlhVHlwZXMubGVuZ3RoID09PSAwIHx8IGNvbnN1bWVzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gSW5wdXQgbWVkaWEgdHlwZSBpcyBub3QgcmVzdHJpY3RlZCBieSByZXNvdXJjZSBvciByZXNvdXJjZSBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250ZW50VHlwZU1lZGlhVHlwZXMgJiYgY29uc3VtZXNNZWRpYVR5cGVzICYmIGNvbnN1bWVzTWVkaWFUeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRDb25zdW1lc01JTUUgPSBjb250ZW50VHlwZU1lZGlhVHlwZXMuZmlsdGVyKChjb250ZW50VHlwZU1lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdW1lc01lZGlhVHlwZXMuc29tZSgoY29uc3VtZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGNvbnRlbnRUeXBlTWVkaWFUeXBlLCBjb25zdW1lc01lZGlhVHlwZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSBtYXRjaGVkQ29uc3VtZXNNSU1FICYmIG1hdGNoZWRDb25zdW1lc01JTUUubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1Byb2R1Y2VNYXRjaGVkICYmIGlzQ29uc3VtZU1hdGNoZWQ7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFBcUM7QUFDckMscUJBQW1DO0FBQ25DLCtCQUFpQztBQUNqQyxpQkFBd0I7QUFJeEIsTUFBTSxFQUFFLE1BQU0sSUFBSSxpQkFBaUIsZ0RBQWdEO0FBRW5GLE1BQU0sU0FBYyxtQkFBUSxVQUFVLG9CQUFvQjtBQW9CMUQsU0FBUyxhQUFrQjtBQUN2QixTQUFPLGVBQUFBO0FBQ1g7QUFDQSxTQUFTLGNBQW1CO0FBQ3hCLFNBQU8sZ0JBQUFDO0FBQ1g7QUFRTyxTQUFTLFFBQVEsU0FBK0I7QUFDbkQsTUFBSTtBQUNKLE1BQUksWUFBWSxRQUFXO0FBQ3ZCLFFBQUksT0FBTyxZQUFZLFlBQVksbUJBQW1CLDJDQUFrQjtBQUNwRSxlQUFTO0FBQUEsSUFDYjtBQUFBLEVBQ0o7QUFDQSxTQUFPLElBQUksZUFBZSxNQUFNO0FBQ3BDO0FBS08sTUFBTSxlQUFlO0FBQUEsRUFFeEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLFlBQVksV0FBb0M7QUFDNUMsUUFBSSxxQkFBcUIsMkNBQWtCO0FBQ3ZDLFdBQUssbUJBQW1CO0FBQUEsSUFDNUIsV0FBVyxPQUFPLGNBQWMsWUFBWSxjQUFjLFFBQVc7QUFDakUsV0FBSyxtQkFBbUIsSUFBSSwwQ0FBaUIsV0FBVyxJQUFJO0FBQUEsSUFDaEUsT0FBTztBQUVILFdBQUssbUJBQW1CLElBQUksMENBQWlCLENBQUMsR0FBRyxJQUFJO0FBQUEsSUFDekQ7QUFHQSxTQUFLLFdBQVcsS0FBSyxlQUFlLEtBQUssaUJBQWlCLGFBQWEsS0FBSyxLQUFLLGdCQUFnQjtBQUdqRyxLQUFDLE9BQU8sUUFBUSxPQUFPLFVBQVUsVUFBVSxRQUFRLEVBQUUsUUFBUSxDQUFDLGdCQUF3QjtBQUNsRixXQUFLLFdBQVcsSUFBSSxJQUFJLGlCQUF3QztBQUM1RCxZQUFJLGFBQWEsU0FBUztBQUN0QixnQkFBTSxNQUFNLDhEQUE4RCxjQUFjLEdBQUc7QUFHL0YsWUFBSSxRQUFRLGFBQWEsQ0FBQztBQUMxQixZQUFJLFVBQVU7QUFDVixrQkFBUTtBQUdaLGNBQU0sUUFBUSxhQUFhLENBQUM7QUFDNUIsY0FBTSxjQUFjLGFBQWEsQ0FBQztBQUNsQyxjQUFNLGNBQWMsYUFBYSxDQUFDO0FBR2xDLGNBQU0sV0FBZ0IsS0FBSyxpQkFBaUIsS0FBSyxPQUFPLE9BQU8sYUFBYSxXQUFXLEtBQUssS0FBSyxpQkFBaUIsU0FBUyxLQUFLO0FBR2hJLGNBQU0scUJBQXFCLGFBQWEsTUFBTSxDQUFDO0FBRy9DLGlCQUFTLFdBQVcsRUFBRSxNQUFNLFVBQVUsa0JBQWtCO0FBRXhELGVBQU87QUFBQSxNQUNYO0FBQUEsSUFDSixDQUFDO0FBQUEsRUFDTDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBT0QsVUFBY0MsV0FBcUI7QUFDdEMsU0FBSyxRQUFRRCxVQUFTQyxTQUFRO0FBQUEsRUFDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFFBQVFELFVBQWVDLFdBQXNCO0FBQ3pDLElBQUFELFdBQVVBLFlBQVcsV0FBVztBQUNoQyxVQUFNLGNBQXNCQSxTQUFRLGdCQUFnQjtBQUNwRCxVQUFNLFNBQWlCQSxTQUFRLFVBQVUsRUFBRSxZQUFZO0FBQ3ZELFVBQU0sa0JBQXVCLEtBQUssaUJBQWlCLGNBQWM7QUFFakUsVUFBTSxVQUFpQixnQkFBZ0IsYUFBYSxRQUFRLGVBQWU7QUFDM0UsUUFBSTtBQUVKLFFBQUksV0FBVyxRQUFRLENBQUMsR0FBRztBQUN2QixZQUFNLGVBQXNCLGdCQUFnQixRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTTtBQUNoRSxVQUFJLGNBQWM7QUFDZCwwQkFBa0IsYUFBYSxPQUFPLENBQUMsZUFBZTtBQUNsRCxpQkFBTyxlQUFlQSxVQUFTLFdBQVcsVUFBVSxXQUFXLFFBQVE7QUFBQSxRQUMzRSxDQUFDLEVBQUUsQ0FBQztBQUFBLE1BQ1I7QUFBQSxJQUNKO0FBRUEsSUFBQUMsWUFBV0EsYUFBWSxZQUFZO0FBQ25DLFVBQU0sY0FBc0NELFNBQVEsc0JBQXNCLEtBQUssQ0FBQztBQUNoRixVQUFNLGdCQUEwQiw4QkFBOEJBLFNBQVEsVUFBVSxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQy9GLFVBQU0sb0JBQThCLDhCQUE4QkEsU0FBUSxVQUFVLGNBQWMsQ0FBQyxLQUFLLENBQUM7QUFDekcsVUFBTSxlQUF1QjtBQUU3QixRQUFJLGlCQUFpQjtBQUNqQixZQUFNLE1BQXNCO0FBQUEsUUFDeEIsa0JBQWtCLENBQUM7QUFBQSxRQUNuQixtQkFBbUIsQ0FBQztBQUFBLFFBQ3BCLFlBQVlDO0FBQUEsUUFDWixPQUFPQTtBQUFBLFFBQ1AsV0FBV0Q7QUFBQSxRQUNYLE9BQU9BO0FBQUEsTUFDWDtBQUNBLFVBQUksUUFBUSxDQUFDLEVBQUUsWUFBWTtBQUN2QixZQUFJLGlCQUFpQixRQUFRLENBQUMsRUFBRTtBQUFBLE1BQ3BDO0FBQ0EsVUFBSSxrQkFBa0I7QUFFdEIsWUFBTSxPQUFPLFdBQVk7QUFBQSxNQUFFO0FBQzNCLFVBQUksU0FBbUIsUUFBa0IsUUFBa0I7QUFDM0QsZ0JBQVUsZ0JBQWdCLFVBQVU7QUFDcEMsZUFBUyxnQkFBZ0IsV0FBVyxnQkFBZ0IsU0FBUztBQUM3RCxlQUFTLGdCQUFnQixTQUFTLGtCQUFrQixLQUFLLE1BQU07QUFBQSxRQUMzRCxNQUFNO0FBQUEsUUFDTixRQUFRLE9BQU8sWUFBWTtBQUFBLFFBQzNCLGFBQWEsa0JBQWtCLEtBQUssR0FBRztBQUFBLFFBQ3ZDLFNBQVMsY0FBYyxLQUFLLEdBQUc7QUFBQSxNQUNuQyxDQUFDO0FBQ0QsaUJBQVcsZ0JBQWdCLFdBQVc7QUFFdEMsWUFBTSxlQUFzQixDQUFDLEtBQUtBLFVBQVNDLFdBQVUsaUJBQWlCLElBQUk7QUFFMUUsVUFBSTtBQUNBLGVBQU8sTUFBTSxxRkFBcUYsY0FBYyxPQUFPLFlBQVksR0FBRyxtQkFBbUIsYUFBYTtBQUN0SyxnQkFBUSxNQUFNLE1BQU0sWUFBWTtBQUVoQyxZQUFJLENBQUNBLFVBQVMsWUFBWSxHQUFHO0FBQ3pCLGlCQUFPLE1BQU0sOEVBQThFLGNBQWMsT0FBTyxZQUFZLEdBQUcsbUJBQW1CLGFBQWE7QUFDL0osaUJBQU8sTUFBTSxNQUFNLFlBQVk7QUFDL0IsaUJBQU8sTUFBTSx1RkFBdUYsY0FBYyxPQUFPLFlBQVksR0FBRyxtQkFBbUIsYUFBYTtBQUFBLFFBQzVLO0FBQUEsTUFDSixTQUFTLEtBQVU7QUFDZixZQUFJO0FBQ0EsdUJBQWEsT0FBTyxHQUFHLEdBQUcsR0FBRztBQUM3QixpQkFBTyxNQUFNLE1BQU0sWUFBWTtBQUFBLFFBQ25DLFNBQVMsV0FBVztBQUNoQixpQkFBTyxNQUFNLHdHQUF3RyxTQUFTO0FBQzlILGdCQUFNO0FBQUEsUUFDVjtBQUFBLE1BQ0osVUFBRTtBQUNFLHVCQUFlLFVBQVUsY0FBYyxLQUFLLElBQUk7QUFDaEQsWUFBSTtBQUNBLG1CQUFTLE1BQU0sTUFBTSxDQUFDLENBQUM7QUFBQSxRQUMzQixTQUFTLGFBQWE7QUFDbEIsaUJBQU8sTUFBTSx1R0FBdUcsV0FBVztBQUFBLFFBQ25JO0FBQUEsTUFDSjtBQUFBLElBQ0osT0FBTztBQUNILGFBQU8sTUFBTSxpR0FBaUcsY0FBYyxPQUFPLFlBQVksR0FBRyxtQkFBbUIsYUFBYTtBQUMzTCxhQUFPLE1BQU0sMERBQTBELGNBQWMsS0FBSyxVQUFVLGVBQWUsQ0FBQztBQUMzRyxXQUFLLFVBQVVBLFVBQVMsYUFBYSxRQUFXLGVBQWUseUNBQXlDO0FBQUEsSUFDNUc7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxXQUE2QjtBQUN6QixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsVUFBVSxlQUF1QixzQkFBMkIsV0FBbUIsY0FBNEI7QUFDdkcsVUFBTSx5QkFBbUMsOEJBQThCLGVBQUFELFFBQVEsVUFBVSxRQUFRLENBQUMsS0FBSyxDQUFDLGtCQUFrQjtBQUMxSCxVQUFNLFNBQWtCLHVCQUF1QixLQUFLLENBQUMsb0JBQW9CLHFCQUFxQixVQUFVLGVBQWUsQ0FBQztBQUV4SCxvQkFBQUMsU0FBUyxVQUFVLGlCQUFpQixnQkFBQUEsU0FBUyxxQkFBcUI7QUFFbEUsUUFBSSxRQUFRO0FBQ1IsWUFBTSxVQUFrQixhQUFhLHlCQUF5QixTQUFZLE1BQU0sdUJBQXVCLE1BQU0sT0FBTyxlQUFlLE9BQU8sZUFBZTtBQUN6SixzQkFBQUEsU0FBUyxVQUFVLGlCQUFpQixnQkFBQUEsU0FBUyx1QkFBdUIsT0FBTztBQUFBLElBQy9FLE9BQU87QUFDSCxZQUFNLE9BQU87QUFBQSxRQUNULFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQSxRQUNULFdBQVc7QUFBQSxNQUNmO0FBQ0Esc0JBQUFBLFNBQVMsVUFBVSxnQkFBZ0Isa0JBQWtCO0FBQ3JELHNCQUFBQSxTQUFTLE1BQU0sS0FBSyxVQUFVLE1BQU0sTUFBTSxDQUFDLENBQUM7QUFBQSxJQUNoRDtBQUNBLFNBQUssY0FBYztBQUFBLEVBQ3ZCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxnQkFBc0I7QUFDbEIsb0JBQUFBLFNBQVMsTUFBTTtBQUNmLG9CQUFBQSxTQUFTLE1BQU07QUFBQSxFQUNuQjtBQUNKO0FBS0EsU0FBUyw4QkFBOEIsR0FBUSxHQUFnQjtBQUMzRCxJQUFFLElBQUksNEJBQTRCLENBQUM7QUFDbkMsSUFBRSxJQUFJLDRCQUE0QixDQUFDO0FBRW5DLE1BQUksRUFBRSxNQUFNLEVBQUUsR0FBRztBQUViLFVBQU0sS0FBSyxFQUFFLEVBQUUsTUFBTSxVQUFVO0FBQy9CLFVBQU0scUJBQXFCLE9BQU8sT0FBTyxHQUFHLFNBQVM7QUFDckQsVUFBTSxLQUFLLEVBQUUsRUFBRSxNQUFNLFVBQVU7QUFDL0IsVUFBTSxxQkFBcUIsT0FBTyxPQUFPLEdBQUcsU0FBUztBQUNyRCxRQUFJLHFCQUFxQixvQkFBb0I7QUFDekMsUUFBRSxJQUFJLEVBQUUsSUFBSTtBQUFBLElBQ2hCLFdBQVcscUJBQXFCLG9CQUFvQjtBQUNoRCxRQUFFLElBQUksRUFBRSxJQUFJO0FBQUEsSUFDaEI7QUFBQSxFQUNKO0FBQ0EsU0FBTyxFQUFFLElBQUksRUFBRTtBQUNuQjtBQUtBLFNBQVMsNEJBQTRCLGNBQTJCO0FBQzVELFNBQVEsYUFBYSxVQUFVLE9BQU8sS0FBSyxhQUFhLE1BQU0sRUFBRSxTQUFTLElBQUssSUFBSTtBQUN0RjtBQUtBLFNBQVMsb0NBQW9DLGdCQUFnQztBQUN6RSxRQUFNLDRCQUE0QjtBQUNsQyxTQUFPLGVBQWUsUUFBUSwyQkFBMkIsS0FBSztBQUNsRTtBQUtBLFNBQVMsZ0JBQWdCLGFBQXFCLFFBQWdCLEtBQWlCO0FBQzNFLFNBQU8sT0FBTyxRQUFRLEdBQUcsRUFDcEIsT0FBTyxDQUFDLENBQUMsR0FBRyxRQUFRLE1BQU0sWUFBYSxTQUFpQixNQUFNLENBQUMsRUFDL0QsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUN2QixPQUFPLENBQUMsU0FBZ0IsU0FBaUIsZ0NBQWdDLFNBQVMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQ3hHLEtBQUssNkJBQTZCO0FBQzNDO0FBS0EsU0FBUyxnQ0FBZ0Msb0JBQTJCLGFBQXFCLGFBQTRCO0FBRWpILFFBQU0sY0FBYyxNQUFNLG9DQUFvQyxXQUFXLENBQUM7QUFDMUUsUUFBTSxVQUFVLFlBQVksV0FBVztBQUV2QyxNQUFJLFNBQVM7QUFFVCxVQUFNLGFBQWEsUUFBUTtBQUUzQixVQUFNLG9CQUFvQjtBQUFBLE1BQ3RCLEdBQUc7QUFBQSxNQUNILEdBQUc7QUFBQSxNQUNIO0FBQUEsSUFDSjtBQUNBLHVCQUFtQixLQUFLLGlCQUFpQjtBQUFBLEVBQzdDO0FBQ0EsU0FBTztBQUNYO0FBS0EsU0FBUyw4QkFBOEIsWUFBNkQ7QUFDaEcsTUFBSSxlQUFlLFVBQWEsZUFBZTtBQUMzQztBQUVKLE1BQUksZUFBZSxXQUFXLE1BQU0sR0FBRztBQUN2QyxpQkFBZSxhQUFhLElBQUksQ0FBQyxrQkFBa0I7QUFFL0MsV0FBTyxjQUFjLFFBQVEsTUFBTSxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUs7QUFBQSxFQUM5RCxDQUFDO0FBQ0QsU0FBTyxhQUFhLE9BQU8sVUFBUSxLQUFLLFNBQVMsQ0FBQztBQUN0RDtBQUtBLFNBQVMscUJBQXFCLFFBQWdCLFFBQXlCO0FBQ25FLE1BQUksV0FBVztBQUNYLFdBQU87QUFFWCxRQUFNLFVBQVUsT0FBTyxNQUFNLEdBQUc7QUFDaEMsUUFBTSxVQUFVLE9BQU8sTUFBTSxHQUFHO0FBR2hDLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUVYLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUdYLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUVYLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUVYLFNBQU87QUFDWDtBQUtBLE1BQU0sb0JBQW9CLFNBQWdDLFFBQWEsS0FBcUIsS0FBVUQsVUFBY0MsV0FBcUI7QUFDckksTUFBSSxJQUFJLGVBQWU7QUFDbkIsVUFBTSxjQUFjLElBQUksYUFBYSxPQUFPLElBQUksWUFBWSxPQUFPLElBQUksWUFBWSxNQUFNLE9BQU8sSUFBSSxlQUFlLE9BQU8sSUFBSSxlQUFlO0FBQzdJLFdBQU8sS0FBSyxzRkFBc0YsT0FBTyxNQUFNLE9BQU8sUUFBUSxPQUFPLGFBQWEsT0FBTyxTQUFTLFVBQVU7QUFBQSxFQUNoTCxPQUFPO0FBQ0gsV0FBTyxNQUFNLGtGQUFrRixPQUFPLE1BQU0sT0FBTyxRQUFRLE9BQU8sYUFBYSxPQUFPLFNBQVMsR0FBRztBQUFBLEVBQ3RLO0FBRUEsUUFBTSxnQkFBZ0IsSUFBSSxpQkFBaUJBLFVBQVM7QUFDcEQsUUFBTSxlQUFlLElBQUksZ0JBQWlCLE9BQU8sSUFBSTtBQUNyRCxRQUFNLFlBQVksSUFBSSxhQUFjLE9BQU8sSUFBSTtBQUMvQyxRQUFNLFlBQVksSUFBSTtBQUV0QixPQUFLLFVBQVUsZUFBZSxXQUFXLFdBQVcsWUFBWTtBQUNwRTtBQUtBLE1BQU0saUJBQWlCLFNBQVVELFVBQWMsb0JBQThCLG9CQUF1QztBQUNoSCxNQUFJLG1CQUFtQjtBQUN2QixRQUFNLG9CQUFvQiw4QkFBOEJBLFNBQVEsVUFBVSxRQUFRLENBQUM7QUFHbkYsTUFBSSxDQUFDLHFCQUFxQixrQkFBa0IsV0FBVyxLQUFLLGtCQUFrQixTQUFTLEtBQUssR0FBRztBQUUzRix1QkFBbUI7QUFBQSxFQUN2QixPQUFPO0FBQ0gsUUFBSSxzQkFBc0IsbUJBQW1CLFFBQVE7QUFDakQsWUFBTSxzQkFBc0Isa0JBQWtCLE9BQU8sQ0FBQyxxQkFBcUI7QUFDdkUsZUFBTyxtQkFBbUIsS0FBSyxDQUFDLHNCQUFzQjtBQUNsRCxpQkFBTyxxQkFBcUIsa0JBQWtCLGlCQUFpQjtBQUFBLFFBQ25FLENBQUM7QUFBQSxNQUNMLENBQUM7QUFDRCx5QkFBbUIsdUJBQXVCLG9CQUFvQixTQUFTO0FBQUEsSUFDM0UsT0FBTztBQUVILHlCQUFtQjtBQUFBLElBQ3ZCO0FBQUEsRUFDSjtBQUdBLE1BQUksbUJBQW1CO0FBQ3ZCLFFBQU0sd0JBQXdCLDhCQUE4QkEsU0FBUSxlQUFlLENBQUM7QUFFcEYsTUFBSSxDQUFDLHNCQUFzQixtQkFBbUIsV0FBVyxLQUFLLG1CQUFtQixTQUFTLEtBQUssR0FBRztBQUU5Rix1QkFBbUI7QUFBQSxFQUN2QixPQUFPO0FBQ0gsUUFBSSx5QkFBeUIsc0JBQXNCLG1CQUFtQixRQUFRO0FBQzFFLFlBQU0sc0JBQXNCLHNCQUFzQixPQUFPLENBQUMseUJBQXlCO0FBQy9FLGVBQU8sbUJBQW1CLEtBQUssQ0FBQyxzQkFBc0I7QUFDbEQsaUJBQU8scUJBQXFCLHNCQUFzQixpQkFBaUI7QUFBQSxRQUN2RSxDQUFDO0FBQUEsTUFDTCxDQUFDO0FBQ0QseUJBQW1CLHVCQUF1QixvQkFBb0IsU0FBUztBQUFBLElBQzNFO0FBQUEsRUFDSjtBQUVBLFNBQU8sb0JBQW9CO0FBQy9COyIsCiAgIm5hbWVzIjogWyJyZXF1ZXN0IiwgInJlc3BvbnNlIl0KfQo=