@rdfc/js-runner 3.0.3 → 3.1.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.
@@ -0,0 +1,194 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="http://lnkd.tech/editor#BuiltinGlobalGraphs">
4
+ <option name="disabled">
5
+ <set>
6
+ <option value="DC_AM" />
7
+ <option value="DC_E" />
8
+ <option value="DC_T" />
9
+ <option value="DC_TYPE" />
10
+ <option value="FOAF" />
11
+ <option value="FOAF_ORG" />
12
+ <option value="ML_XS" />
13
+ <option value="OWL2" />
14
+ <option value="RDF" />
15
+ <option value="RDFS" />
16
+ <option value="SHACL" />
17
+ <option value="SHACL_SHACL" />
18
+ <option value="SKOS" />
19
+ <option value="SKOS_ORG" />
20
+ <option value="SPIN_MODELING" />
21
+ <option value="SPIN_MODELING_ORG" />
22
+ <option value="SPIN_SPARQL" />
23
+ <option value="SPIN_SPARQL_ORG" />
24
+ <option value="SPIN_STD" />
25
+ <option value="SPIN_STD_ORG" />
26
+ <option value="VANN" />
27
+ <option value="VOAF" />
28
+ <option value="schemaorg_all_http" />
29
+ <option value="schemaorg_all_https" />
30
+ </set>
31
+ </option>
32
+ </component>
33
+ <component name="http://lnkd.tech/editor#GlobalGraphsAssignments">
34
+ <option name="assignments">
35
+ <map>
36
+ <entry key="urn:tag:lnslr.eu,2018:java:eu.lunisolar.lava.rdfvocab.get.lava.LavaCatalog">
37
+ <value>
38
+ <map>
39
+ <entry key="http://purl.org/dc/dcam">
40
+ <value>
41
+ <set>
42
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/58ABCE836B2D0022BF4C4C921A8C34C6E2F4B4AB015C4649FCAFD9572ED4DB47" />
43
+ </set>
44
+ </value>
45
+ </entry>
46
+ <entry key="http://purl.org/dc/dcmitype">
47
+ <value>
48
+ <set>
49
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/F987B11D556E556FEF95D7E9410C1C561FC1B7AC05CCD457128DC8962641B01E" />
50
+ </set>
51
+ </value>
52
+ </entry>
53
+ <entry key="http://purl.org/dc/elements/1.1">
54
+ <value>
55
+ <set>
56
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/FFB46B7A21E40344B93BC4AD2E6808B24DD53E261995EC3A926DF6BCD87BBFA5" />
57
+ </set>
58
+ </value>
59
+ </entry>
60
+ <entry key="http://purl.org/dc/terms">
61
+ <value>
62
+ <set>
63
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/13DF401072DD7015BF9D75162F3E41C8138075304B7B9CC1AA1E9C16DB976797" />
64
+ </set>
65
+ </value>
66
+ </entry>
67
+ <entry key="http://purl.org/vocab/vann">
68
+ <value>
69
+ <set>
70
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/96DE3675A0EAE0C2979D58A21FB808417E0C75DA18EFB9FEB050135BBAC790CA" />
71
+ </set>
72
+ </value>
73
+ </entry>
74
+ <entry key="http://purl.org/vocommons/voaf">
75
+ <value>
76
+ <set>
77
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/8FF39E5D8A3A8DBE88C790E499F2DAA0FC520CD825EBBE59E79A388361839150" />
78
+ </set>
79
+ </value>
80
+ </entry>
81
+ <entry key="http://schema.org">
82
+ <value>
83
+ <set>
84
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/62854C817CF24454C9FC1D9DDB605C7B6A4FDE0FF574960D40B0E150166997B6" />
85
+ </set>
86
+ </value>
87
+ </entry>
88
+ <entry key="http://spinrdf.org/sp">
89
+ <value>
90
+ <set>
91
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/FD2A599D1CE5D78A65896D5CE0A34553533715EE61388AD5F6E2AC75CF36FE94" />
92
+ </set>
93
+ </value>
94
+ </entry>
95
+ <entry key="http://spinrdf.org/spin">
96
+ <value>
97
+ <set>
98
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/CC3E56C1F2BC6D4213BAF662C0A1FEB97ED968FA21D6C0ED7E44887747C74BC3" />
99
+ </set>
100
+ </value>
101
+ </entry>
102
+ <entry key="http://spinrdf.org/spl">
103
+ <value>
104
+ <set>
105
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/EAD726323D0CC38A6FD1D332E1781E2601C32537102E82A0995E7FBA87BEF306" />
106
+ </set>
107
+ </value>
108
+ </entry>
109
+ <entry key="http://www.w3.org/1999/02/22-rdf-syntax-ns">
110
+ <value>
111
+ <set>
112
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/93D52B1A5824C7DD6504CA79C16205C0B740A0BA68B7A14952780F52561186A2" />
113
+ </set>
114
+ </value>
115
+ </entry>
116
+ <entry key="http://www.w3.org/2000/01/rdf-schema">
117
+ <value>
118
+ <set>
119
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/164A70B28D9AC4B828EEC7D9E4B548A9465A5E2C154D53A142CC5E18566E04EC" />
120
+ </set>
121
+ </value>
122
+ </entry>
123
+ <entry key="http://www.w3.org/2002/07/owl">
124
+ <value>
125
+ <set>
126
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/718FA1DB7840D3315BFCE94398543F91437EF6FE933054FD93F5471D19262FC5" />
127
+ </set>
128
+ </value>
129
+ </entry>
130
+ <entry key="http://www.w3.org/2004/02/skos/core">
131
+ <value>
132
+ <set>
133
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/2D0AC9174D7C53393C546802A19669534B44590EA00D807F4C149C6FFB4CF6BB" />
134
+ </set>
135
+ </value>
136
+ </entry>
137
+ <entry key="http://www.w3.org/ns/shacl">
138
+ <value>
139
+ <set>
140
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/0E5D8AEA0EAB98A072D4A02FAAEE1EE914EC99EAB2CA473429726FAED4A13F69" />
141
+ </set>
142
+ </value>
143
+ </entry>
144
+ <entry key="http://www.w3.org/ns/shacl-shacl">
145
+ <value>
146
+ <set>
147
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/250D6274CADC8FA5359D5DBC28BC943F1DE01ADB7FFC3369681216B583122E4A" />
148
+ </set>
149
+ </value>
150
+ </entry>
151
+ <entry key="http://xmlns.com/foaf/0.1">
152
+ <value>
153
+ <set>
154
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/630DAF410F3C34ED9FE7302E4A8A5439488B68375789E7CF5DD137892DAC6789" />
155
+ </set>
156
+ </value>
157
+ </entry>
158
+ <entry key="https://schema.org">
159
+ <value>
160
+ <set>
161
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/24D9BBA4119AA8C8708767B12B3BCACBC8BB8750CDB111F573996899AA29F089" />
162
+ </set>
163
+ </value>
164
+ </entry>
165
+ <entry key="urn:tag:lnkd.tech,2020:MissingLink:XMLDataTypes">
166
+ <value>
167
+ <set>
168
+ <option value="urn:tag:lnkd.tech,2023:digest:sha-256/E7430AD6C9345DEC6A8C7E0665607B34D1F6B6FDC47A30FAC3FB146179213174" />
169
+ </set>
170
+ </value>
171
+ </entry>
172
+ </map>
173
+ </value>
174
+ </entry>
175
+ </map>
176
+ </option>
177
+ </component>
178
+ <component name="http://lnkd.tech/editor#GraphVisibilityConfig">
179
+ <option name="visibility">
180
+ <map>
181
+ <entry key="DOCUMENTATION">
182
+ <value>
183
+ <Visibility />
184
+ </value>
185
+ </entry>
186
+ <entry key="GENERAL">
187
+ <value>
188
+ <Visibility />
189
+ </value>
190
+ </entry>
191
+ </map>
192
+ </option>
193
+ </component>
194
+ </project>
@@ -0,0 +1,52 @@
1
+ <component name="ProjectCodeStyleConfiguration">
2
+ <code_scheme name="Project" version="173">
3
+ <HTMLCodeStyleSettings>
4
+ <option name="HTML_SPACE_INSIDE_EMPTY_TAG" value="true" />
5
+ </HTMLCodeStyleSettings>
6
+ <JSCodeStyleSettings version="0">
7
+ <option name="FORCE_SEMICOLON_STYLE" value="true" />
8
+ <option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
9
+ <option name="FORCE_QUOTE_STYlE" value="true" />
10
+ <option name="ENFORCE_TRAILING_COMMA" value="WhenMultiline" />
11
+ <option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
12
+ <option name="SPACES_WITHIN_IMPORTS" value="true" />
13
+ </JSCodeStyleSettings>
14
+ <TypeScriptCodeStyleSettings version="0">
15
+ <option name="FORCE_SEMICOLON_STYLE" value="true" />
16
+ <option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
17
+ <option name="FORCE_QUOTE_STYlE" value="true" />
18
+ <option name="ENFORCE_TRAILING_COMMA" value="WhenMultiline" />
19
+ <option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
20
+ <option name="SPACES_WITHIN_IMPORTS" value="true" />
21
+ </TypeScriptCodeStyleSettings>
22
+ <VueCodeStyleSettings>
23
+ <option name="INTERPOLATION_NEW_LINE_AFTER_START_DELIMITER" value="false" />
24
+ <option name="INTERPOLATION_NEW_LINE_BEFORE_END_DELIMITER" value="false" />
25
+ </VueCodeStyleSettings>
26
+ <codeStyleSettings language="HTML">
27
+ <option name="SOFT_MARGINS" value="80" />
28
+ <indentOptions>
29
+ <option name="CONTINUATION_INDENT_SIZE" value="4" />
30
+ </indentOptions>
31
+ </codeStyleSettings>
32
+ <codeStyleSettings language="JavaScript">
33
+ <option name="INDENT_CASE_FROM_SWITCH" value="false" />
34
+ <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
35
+ <option name="ALIGN_MULTILINE_FOR" value="false" />
36
+ <option name="SOFT_MARGINS" value="80" />
37
+ </codeStyleSettings>
38
+ <codeStyleSettings language="TypeScript">
39
+ <option name="INDENT_CASE_FROM_SWITCH" value="false" />
40
+ <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
41
+ <option name="ALIGN_MULTILINE_FOR" value="false" />
42
+ <option name="SOFT_MARGINS" value="80" />
43
+ </codeStyleSettings>
44
+ <codeStyleSettings language="Vue">
45
+ <option name="SOFT_MARGINS" value="80" />
46
+ <indentOptions>
47
+ <option name="INDENT_SIZE" value="4" />
48
+ <option name="TAB_SIZE" value="4" />
49
+ </indentOptions>
50
+ </codeStyleSettings>
51
+ </code_scheme>
52
+ </component>
@@ -0,0 +1,5 @@
1
+ <component name="ProjectCodeStyleConfiguration">
2
+ <state>
3
+ <option name="USE_PER_PROJECT_SETTINGS" value="true" />
4
+ </state>
5
+ </component>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AgentMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AskMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Ask2AgentMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="EditMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
+ </profile>
6
+ </component>
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="WEB_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$">
5
+ <excludeFolder url="file://$MODULE_DIR$/.tmp" />
6
+ <excludeFolder url="file://$MODULE_DIR$/temp" />
7
+ <excludeFolder url="file://$MODULE_DIR$/tmp" />
8
+ </content>
9
+ <orderEntry type="inheritedJdk" />
10
+ <orderEntry type="sourceFolder" forTests="false" />
11
+ </component>
12
+ </module>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/js-runner.iml" filepath="$PROJECT_DIR$/.idea/js-runner.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, test, vi } from 'vitest'
2
- import { StreamMsgMock } from '../src/testUtils'
2
+ import { channel, createRunner, StreamMsgMock } from '../src/testUtils'
3
3
  import { WriterInstance } from '../src/writer'
4
4
  import { FromRunner, StreamIdentify } from '@rdfc/proto'
5
5
  import { createLogger, transports } from 'winston'
@@ -109,6 +109,8 @@ describe('Writer', async () => {
109
109
 
110
110
  await writer.close()
111
111
 
112
+ expect(writer.canceled).toBe(false)
113
+
112
114
  expect(msgs.length).toBe(1)
113
115
  expect(msgs.map((x) => x.close!.channel)).toEqual([uri])
114
116
 
@@ -150,4 +152,71 @@ describe('Writer', async () => {
150
152
  'world',
151
153
  ])
152
154
  })
155
+
156
+ test('is marked canceled when connected reader cancels', async () => {
157
+ const runner = createRunner()
158
+ const [writer, reader] = channel(runner, 'cancel-channel')
159
+
160
+ await reader.cancel()
161
+
162
+ expect(writer.canceled).toBe(true)
163
+ await expect(writer.string('hello')).rejects.toThrow(/canceled/i)
164
+ })
165
+
166
+ test('emits a cancel event when connected reader cancels', async () => {
167
+ const runner = createRunner()
168
+ const [writer, reader] = channel(runner, 'cancel-listener-channel')
169
+ const onCancel = vi.fn()
170
+
171
+ writer.on('cancel', onCancel)
172
+ await reader.cancel()
173
+
174
+ expect(onCancel).toHaveBeenCalledTimes(1)
175
+ })
176
+
177
+ test('does not emit a cancel event on a local close', async () => {
178
+ const uri = 'someUri'
179
+ const runner = 'myRunner'
180
+ const client = new StreamMsgMock(() => 1)
181
+ const write = async (_msg: FromRunner) => undefined
182
+ const writer = new WriterInstance(uri, client as any, write, runner, logger)
183
+ const onCancel = vi.fn()
184
+
185
+ writer.on('cancel', onCancel)
186
+ await writer.close()
187
+
188
+ expect(onCancel).not.toHaveBeenCalled()
189
+ })
190
+
191
+ test('throws when writing to a canceled writer', async () => {
192
+ const uri = 'someUri'
193
+ const runner = 'myRunner'
194
+ const client = new StreamMsgMock(() => 1)
195
+ const write = async (_msg: FromRunner) => undefined
196
+ const writer = new WriterInstance(uri, client as any, write, runner, logger)
197
+
198
+ await writer.close(true)
199
+
200
+ expect(writer.canceled).toBe(true)
201
+ await expect(writer.buffer(encoder.encode('x'))).rejects.toThrow(
202
+ /canceled/i,
203
+ )
204
+ })
205
+
206
+ test('rejects in-flight writes when reader cancels', async () => {
207
+ const runner = createRunner()
208
+ const [writer, reader] = channel(runner, 'cancel-in-flight')
209
+
210
+ // Register a reader consumer without draining it so the writer waits for processed.
211
+ reader.strings()
212
+
213
+ // Set reader to canceled, without informing the writer of it, mimicking race condition where reader cancels while writer is writing, but before the writer receives the cancel message.
214
+ // @ts-ignore
215
+ reader['canceled'] = true
216
+ // @ts-ignore
217
+ reader['closed'] = true
218
+
219
+ const pendingWrite = writer.string('hello')
220
+ await expect(pendingWrite).rejects.toThrow(/canceled/i)
221
+ })
153
222
  })
package/lib/reader.d.ts CHANGED
@@ -14,6 +14,7 @@ export interface Reader {
14
14
  streams(): AsyncIterable<AsyncGenerator<Uint8Array>>;
15
15
  buffers(): AsyncIterable<Uint8Array>;
16
16
  anys(): AsyncIterable<Any>;
17
+ cancel(): Promise<void>;
17
18
  }
18
19
  export declare class ReaderInstance implements Reader {
19
20
  private client;
@@ -21,6 +22,8 @@ export declare class ReaderInstance implements Reader {
21
22
  private logger;
22
23
  private readonly notifyOrchestrator;
23
24
  private consumers;
25
+ private closed;
26
+ private canceled;
24
27
  constructor(uri: string, client: RunnerClient, notifyOrchestrator: Writable, logger: Logger);
25
28
  anys(): AsyncIterable<Any>;
26
29
  strings(): AsyncIterable<string>;
@@ -28,5 +31,6 @@ export declare class ReaderInstance implements Reader {
28
31
  streams(): AsyncIterable<AsyncGenerator<Uint8Array>>;
29
32
  handleMsg(msg: ReceivingMessage): void;
30
33
  close(): void;
34
+ cancel(): Promise<void>;
31
35
  handleStreamingMessage({ channel, globalSequenceNumber, }: ReceivingStreamMessage): Promise<void>;
32
36
  }
package/lib/reader.js CHANGED
@@ -4,10 +4,15 @@ class MyIter {
4
4
  convertor;
5
5
  queue = [];
6
6
  resolveNext = null;
7
+ closed = false;
7
8
  constructor(convertor) {
8
9
  this.convertor = convertor;
9
10
  }
10
11
  push(buffer, onComplete) {
12
+ if (this.closed) {
13
+ onComplete();
14
+ return;
15
+ }
11
16
  const item = this.convertor.from(buffer);
12
17
  this.queue.push({ item, onComplete });
13
18
  if (this.resolveNext) {
@@ -16,6 +21,11 @@ class MyIter {
16
21
  }
17
22
  }
18
23
  close(onComplete) {
24
+ if (this.closed) {
25
+ onComplete();
26
+ return;
27
+ }
28
+ this.closed = true;
19
29
  this.queue.push({ item: undefined, onComplete });
20
30
  if (this.resolveNext) {
21
31
  this.resolveNext(undefined);
@@ -23,6 +33,10 @@ class MyIter {
23
33
  }
24
34
  }
25
35
  async pushStream(chunks, onComplete) {
36
+ if (this.closed) {
37
+ onComplete();
38
+ return;
39
+ }
26
40
  const stream = (async function* (stream) {
27
41
  for await (const chunk of stream) {
28
42
  yield chunk.data;
@@ -58,6 +72,8 @@ export class ReaderInstance {
58
72
  logger;
59
73
  notifyOrchestrator;
60
74
  consumers = [];
75
+ closed = false;
76
+ canceled = false;
61
77
  constructor(uri, client, notifyOrchestrator, logger) {
62
78
  this.uri = uri;
63
79
  this.client = client;
@@ -86,6 +102,16 @@ export class ReaderInstance {
86
102
  }
87
103
  handleMsg(msg) {
88
104
  this.logger.debug(`${this.uri} handling message`);
105
+ if (this.closed) {
106
+ this.notifyOrchestrator({
107
+ processed: {
108
+ globalSequenceNumber: msg.globalSequenceNumber,
109
+ channel: this.uri,
110
+ error: 'reader is canceled; message has not been processed by the processor',
111
+ },
112
+ });
113
+ return;
114
+ }
89
115
  const promises = [];
90
116
  for (const iter of this.consumers) {
91
117
  promises.push(new Promise((res) => iter.push(msg.data, () => res(null))));
@@ -98,12 +124,32 @@ export class ReaderInstance {
98
124
  }));
99
125
  }
100
126
  close() {
127
+ if (this.closed) {
128
+ return;
129
+ }
130
+ this.closed = true;
101
131
  for (const iter of this.consumers) {
102
132
  iter.close(() => { });
103
133
  }
104
134
  }
135
+ async cancel() {
136
+ if (this.canceled) {
137
+ return;
138
+ }
139
+ this.canceled = true;
140
+ this.close();
141
+ await this.notifyOrchestrator({
142
+ close: { channel: this.uri },
143
+ });
144
+ }
105
145
  async handleStreamingMessage({ channel, globalSequenceNumber, }) {
106
146
  this.logger.debug(`${this.uri} handling streaming message`);
147
+ if (this.closed) {
148
+ await this.notifyOrchestrator({
149
+ processed: { globalSequenceNumber, channel },
150
+ });
151
+ return;
152
+ }
107
153
  const chunks = this.client.receiveStreamMessage();
108
154
  const writeControlMessage = promisify(chunks.write.bind(chunks));
109
155
  const consumersConsumed = [];
@@ -208,4 +254,4 @@ function fanoutStream(stream, numConsumers, onAllHandled) {
208
254
  const rawIterables = Array.from({ length: numConsumers }, makeIterable);
209
255
  return rawIterables.map(wrap);
210
256
  }
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQ0wsWUFBWSxFQUVaLFdBQVcsRUFDWCxlQUFlLEVBQ2YsZUFBZSxHQUNoQixNQUFNLGFBQWEsQ0FBQTtBQUVwQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBMEJoQyxNQUFNLE1BQU07SUFDRixTQUFTLENBQWM7SUFDdkIsS0FBSyxHQUEwQixFQUFFLENBQUE7SUFDakMsV0FBVyxHQUF3QyxJQUFJLENBQUE7SUFFL0QsWUFBWSxTQUF1QjtRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtJQUM1QixDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQWtCLEVBQUUsVUFBc0I7UUFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQXNCO1FBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7UUFDekIsQ0FBQztJQUNILENB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S0FBSyxDQUFDLE1BQU07d0JBQ1YsZUFBZSxFQUFFLENBQUE7d0JBQ2pCLElBQUksZUFBZSxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUMxQixHQUFHLEVBQUUsQ0FBQTt3QkFDUCxDQUFDO3dCQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQTtvQkFDekMsQ0FBQztpQkFDRixDQUFBO1lBQ0gsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0lBRUQsS0FBSyxVQUFVLEdBQUc7UUFDaEIsV0FBVyxFQUFFLENBQUE7UUFDYixJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUV0QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDZCxNQUFNLFlBQVksRUFBRSxDQUFBO1lBQ3BCLEtBQUssRUFBRSxDQUFBO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFHRCxTQUFTLElBQUksQ0FBQyxRQUEwQjtRQUN0QyxPQUFPO1lBQ0wsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO2dCQUMzQixJQUFJLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDbEMsTUFBTSxJQUFJLENBQUE7b0JBQ1YsTUFBTSxHQUFHLEVBQUUsQ0FBQTtnQkFDYixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUN2RSxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsaWVudFJlYWRhYmxlU3RyZWFtIH0gZnJvbSAnQGdycGMvZ3JwYy1qcydcbmltcG9ydCB7XG4gIERhdGFDaHVuayxcbiAgUmVjZWl2aW5nTWVzc2FnZSxcbiAgUmVjZWl2aW5nU3RyZWFtTWVzc2FnZSxcbiAgUnVubmVyQ2xpZW50LFxufSBmcm9tICdAcmRmYy9wcm90bydcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ3dpbnN0b24nXG5pbXBvcnQge1xuICBBbnlDb252ZXJ0b3IsXG4gIENvbnZlcnRvcixcbiAgTm9Db252ZXJ0b3IsXG4gIFN0cmVhbUNvbnZlcnRvcixcbiAgU3RyaW5nQ29udmVydG9yLFxufSBmcm9tICcuL2NvbnZlcnRvcidcbmltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSAnLi9ydW5uZXInXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJ1xuXG5leHBvcnQgdHlwZSBBbnkgPVxuICB8IHtcbiAgICAgIHN0cmluZzogc3RyaW5nXG4gICAgfVxuICB8IHtcbiAgICAgIHN0cmVhbTogQXN5bmNHZW5lcmF0b3I8VWludDhBcnJheT5cbiAgICB9XG4gIHwge1xuICAgICAgYnVmZmVyOiBVaW50OEFycmF5XG4gICAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRlciB7XG4gIHJlYWRvbmx5IHVyaTogc3RyaW5nXG4gIHN0cmluZ3MoKTogQXN5bmNJdGVyYWJsZTxzdHJpbmc+XG4gIHN0cmVhbXMoKTogQXN5bmNJdGVyYWJsZTxBc3luY0dlbmVyYXRvcjxVaW50OEFycmF5Pj5cbiAgYnVmZmVycygpOiBBc3luY0l0ZXJhYmxlPFVpbnQ4QXJyYXk+XG4gIGFueXMoKTogQXN5bmNJdGVyYWJsZTxBbnk+XG59XG5cbnR5cGUgVG9kbzxUPiA9IHtcbiAgaXRlbTogVFxuICBvbkNvbXBsZXRlOiAoKSA9PiB2b2lkXG59XG5cbmNsYXNzIE15SXRlcjxUPiBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8VD4ge1xuICBwcml2YXRlIGNvbnZlcnRvcjogQ29udmVydG9yPFQ+XG4gIHByaXZhdGUgcXVldWU6IFRvZG88VCB8IHVuZGVmaW5lZD5bXSA9IFtdXG4gIHByaXZhdGUgcmVzb2x2ZU5leHQ6ICgodmFsdWU6IHVuZGVmaW5lZCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yKGNvbnZlcnRvcjogQ29udmVydG9yPFQ+KSB7XG4gICAgdGhpcy5jb252ZXJ0b3IgPSBjb252ZXJ0b3JcbiAgfVxuXG4gIHB1c2goYnVmZmVyOiBVaW50OEFycmF5LCBvbkNvbXBsZXRlOiAoKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuY29udmVydG9yLmZyb20oYnVmZmVyKVxuICAgIHRoaXMucXVldWUucHVzaCh7IGl0ZW0sIG9uQ29tcGxldGUgfSlcbiAgICBpZiAodGhpcy5yZXNvbHZlTmV4dCkge1xuICAgICAgdGhpcy5yZXNvbHZlTmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLnJlc29sdmVOZXh0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNsb3NlKG9uQ29tcGxldGU6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLnF1ZXVlLnB1c2goeyBpdGVtOiB1bmRlZmluZWQsIG9uQ29tcGxldGUgfSlcbiAgICBpZiAodGhpcy5yZXNvbHZlTmV4dCkge1xuICAgICAgdGhpcy5yZXNvbHZlTmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLnJlc29sdmVOZXh0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHB1c2hTdHJlYW0oY2h1bmtzOiBBc3luY0l0ZXJhYmxlPERhdGFDaHVuaz4sIG9uQ29tcGxldGU6ICgpID0+IHZvaWQpIHtcbiAgICAvLyBUaGlzIGlzIGFuIGFzeW5jIGdlbmVyYXRvciB0aGF0IHRyYW5zZm9ybXMgRGF0YUNodW5rcyB0byBCdWZmZXJzXG4gICAgY29uc3Qgc3RyZWFtID0gKGFzeW5jIGZ1bmN0aW9uKiAoc3RyZWFtKSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbSkge1xuICAgICAgICB5aWVsZCBjaHVuay5kYXRhXG4gICAgICB9XG4gICAgfSkoY2h1bmtzKVxuXG4gICAgY29uc3QgaXRlbSA9IGF3YWl0IHRoaXMuY29udmVydG9yLmZyb21TdHJlYW0oc3RyZWFtKVxuICAgIHRoaXMucXVldWUucHVzaCh7IGl0ZW0sIG9uQ29tcGxldGUgfSlcbiAgICBpZiAodGhpcy5yZXNvbHZlTmV4dCkge1xuICAgICAgdGhpcy5yZXNvbHZlTmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLnJlc29sdmVOZXh0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHsgaXRlbSwgb25Db21wbGV0ZSB9ID0gdGhpcy5xdWV1ZS5zaGlmdCgpIVxuICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb25Db21wbGV0ZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBpdGVtXG4gICAgICAgIC8vIE5vdGU6IGV4ZWN1dGlvbiBwYXVzZXMgYXQgYHlpZWxkYCB1bnRpbCB0aGUgY29uc3VtZXIgY2FsbHMgYC5uZXh0KClgIGFnYWluLlxuICAgICAgICAvLyBXZSBjYWxsIG9uQ29tcGxldGUgKmFmdGVyKiByZXN1bWluZywgc28gdGhlIHByb2R1Y2VyIGtub3dzIHRoZSBpdGVtIHdhcyBhY3R1YWxseSBjb25zdW1lZC5cbiAgICAgICAgb25Db21wbGV0ZSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx1bmRlZmluZWQ+KChyZXNvbHZlKSA9PiAodGhpcy5yZXNvbHZlTmV4dCA9IHJlc29sdmUpKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVhZGVySW5zdGFuY2UgaW1wbGVtZW50cyBSZWFkZXIge1xuICBwcml2YXRlIGNsaWVudDogUnVubmVyQ2xpZW50XG4gIHJlYWRvbmx5IHVyaTogc3RyaW5nXG4gIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJcbiAgcHJpdmF0ZSByZWFkb25seSBub3RpZnlPcmNoZXN0cmF0b3I6IFdyaXRhYmxlXG5cbiAgcHJpdmF0ZSBjb25zdW1lcnM6IE15SXRlcjx1bmtub3duPltdID0gW11cblxuICBjb25zdHJ1Y3RvcihcbiAgICB1cmk6IHN0cmluZyxcbiAgICBjbGllbnQ6IFJ1bm5lckNsaWVudCxcbiAgICBub3RpZnlPcmNoZXN0cmF0b3I6IFdyaXRhYmxlLFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLnVyaSA9IHVyaVxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICB0aGlzLm5vdGlmeU9yY2hlc3RyYXRvciA9IG5vdGlmeU9yY2hlc3RyYXRvclxuICB9XG5cbiAgYW55cygpOiBBc3luY0l0ZXJhYmxlPEFueT4ge1xuICAgIGNvbnN0IGl0ZXIgPSBuZXcgTXlJdGVyKEFueUNvbnZlcnRvcilcbiAgICB0aGlzLmNvbnN1bWVycy5wdXNoKGl0ZXIpXG4gICAgcmV0dXJuIGl0ZXJcbiAgfVxuXG4gIHN0cmluZ3MoKTogQXN5bmNJdGVyYWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpdGVyID0gbmV3IE15SXRlcihTdHJpbmdDb252ZXJ0b3IpXG4gICAgdGhpcy5jb25zdW1lcnMucHVzaChpdGVyKVxuICAgIHJldHVybiBpdGVyXG4gIH1cblxuICBidWZmZXJzKCk6IEFzeW5jSXRlcmFibGU8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGl0ZXIgPSBuZXcgTXlJdGVyKE5vQ29udmVydG9yKVxuICAgIHRoaXMuY29uc3VtZXJzLnB1c2goaXRlcilcbiAgICByZXR1cm4gaXRlclxuICB9XG5cbiAgc3RyZWFtcygpOiBBc3luY0l0ZXJhYmxlPEFzeW5jR2VuZXJhdG9yPFVpbnQ4QXJyYXk+PiB7XG4gICAgY29uc3QgaXRlciA9IG5ldyBNeUl0ZXIoU3RyZWFtQ29udmVydG9yKVxuICAgIHRoaXMuY29uc3VtZXJzLnB1c2goaXRlcilcbiAgICByZXR1cm4gaXRlclxuICB9XG5cbiAgaGFuZGxlTXNnKG1zZzogUmVjZWl2aW5nTWVzc2FnZSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke3RoaXMudXJpfSBoYW5kbGluZyBtZXNzYWdlYClcblxuICAgIGNvbnN0IHByb21pc2VzID0gW11cbiAgICBmb3IgKGNvbnN0IGl0ZXIgb2YgdGhpcy5jb25zdW1lcnMpIHtcbiAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlcykgPT4gaXRlci5wdXNoKG1zZy5kYXRhLCAoKSA9PiByZXMobnVsbCkpKSlcbiAgICB9XG5cbiAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PlxuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3Ioe1xuICAgICAgICBwcm9jZXNzZWQ6IHtcbiAgICAgICAgICBnbG9iYWxTZXF1ZW5jZU51bWJlcjogbXNnLmdsb2JhbFNlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIGNoYW5uZWw6IHRoaXMudXJpLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKVxuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgZm9yIChjb25zdCBpdGVyIG9mIHRoaXMuY29uc3VtZXJzKSB7XG4gICAgICBpdGVyLmNsb3NlKCgpID0+IHt9KVxuICAgIH1cbiAgfVxuXG4gIC8vIFRoZXJlIGlzIGEgc3RyZWFtIG1lc3NhZ2UgYXZhaWxhYmxlIGZvciB0aGlzIHJlYWRlclxuICBhc3luYyBoYW5kbGVTdHJlYW1pbmdNZXNzYWdlKHtcbiAgICBjaGFubmVsLFxuICAgIGdsb2JhbFNlcXVlbmNlTnVtYmVyLFxuICB9OiBSZWNlaXZpbmdTdHJlYW1NZXNzYWdlKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7dGhpcy51cml9IGhhbmRsaW5nIHN0cmVhbWluZyBtZXNzYWdlYClcblxuICAgIGNvbnN0IGNodW5rcyA9IHRoaXMuY2xpZW50LnJlY2VpdmVTdHJlYW1NZXNzYWdlKClcbiAgICBjb25zdCB3cml0ZUNvbnRyb2xNZXNzYWdlID0gcHJvbWlzaWZ5KGNodW5rcy53cml0ZS5iaW5kKGNodW5rcykpXG4gICAgY29uc3QgY29uc3VtZXJzQ29uc3VtZWQgPSBbXVxuXG4gICAgLy8gQWZ0ZXIgZWFjaCBjaHVuayBpcyBoYW5kbGVkIGJ5IGFsbCBjb25zdW1lciwgZW1pdCBhIHByb2Nlc3NlZCBtZXNzYWdlXG4gICAgbGV0IGlkeCA9IDBcbiAgICBjb25zdCBtZXNzYWdlSXRlcmF0b3JzID0gZmFub3V0U3RyZWFtKFxuICAgICAgY2h1bmtzLFxuICAgICAgdGhpcy5jb25zdW1lcnMubGVuZ3RoLFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB3cml0ZUNvbnRyb2xNZXNzYWdlKHsgc3RyZWFtU2VxdWVuY2VOdW1iZXI6IGlkeCsrIH0pXG4gICAgICB9LFxuICAgIClcblxuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5jb25zdW1lcnMpIHtcbiAgICAgIGNvbnN1bWVyc0NvbnN1bWVkLnB1c2goXG4gICAgICAgIG5ldyBQcm9taXNlKChyZXMpID0+XG4gICAgICAgICAgY29uc3VtZXIucHVzaFN0cmVhbShtZXNzYWdlSXRlcmF0b3JzLnBvcCgpISwgKCkgPT4gcmVzKG51bGwpKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICBhd2FpdCB3cml0ZUNvbnRyb2xNZXNzYWdlKHsgZ2xvYmFsU2VxdWVuY2VOdW1iZXIgfSlcblxuICAgIFByb21pc2UuYWxsKGNvbnN1bWVyc0NvbnN1bWVkKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdXcml0aW5nIHByb2Nlc3NlZCBmb3Igc3RyZWFtaW5nIG1lc3NhZ2UnKVxuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3IoeyBwcm9jZXNzZWQ6IHsgZ2xvYmFsU2VxdWVuY2VOdW1iZXIsIGNoYW5uZWwgfSB9KVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gdGVlIGEgc3RyZWFtIGBudW1Db25zdW1lcnNgIHRpbWVzXG4gKiBXaGVuIGVhY2ggdGVlJ2Qgc3RyZWFtIGhhcyBoYW5kbGVkIGEgY2h1bmssIGNhbGwge0BsaW5rIG9uQWxsSGFuZGxlZH1cbiAqL1xuZnVuY3Rpb24gZmFub3V0U3RyZWFtPFQ+KFxuICBzdHJlYW06IENsaWVudFJlYWRhYmxlU3RyZWFtPFQ+LFxuICBudW1Db25zdW1lcnM6IG51bWJlcixcbiAgb25BbGxIYW5kbGVkOiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbik6IEFzeW5jSXRlcmFibGU8VD5bXSB7XG4gIHR5cGUgV2FpdGVyID0gKHZhbHVlOiBJdGVyYXRvclJlc3VsdDxUPikgPT4gdm9pZFxuXG4gIGxldCBlbmRlZCA9IGZhbHNlXG4gIGNvbnN0IGJ1ZmZlcjogVFtdID0gW11cbiAgY29uc3QgcGVuZGluZzogV2FpdGVyW10gPSBbXVxuICBsZXQgYWN0aXZlQ29uc3VtZXJzID0gbnVtQ29uc3VtZXJzXG5cbiAgLy8gY29uc3VtZXIgYm9va2tlZXBpbmdcbiAgbGV0IGF3YWl0aW5nQWNrID0gMFxuXG4gIGZ1bmN0aW9uIHB1c2hDaHVuayhjaHVuazogVCkge1xuICAgIGJ1ZmZlci5wdXNoKGNodW5rKVxuICAgIGZsdXNoKClcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID4gMCAmJiBwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNodW5rID0gYnVmZmVyWzBdIC8vIGtlZXAgdW50aWwgYWxsIGNvbnN1bWVycyBhY2tcbiAgICAgIGNvbnN0IHdhaXRlciA9IHBlbmRpbmcuc2hpZnQoKSFcbiAgICAgIHdhaXRlcih7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSlcbiAgICAgIGF3YWl0aW5nQWNrKytcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbmQoKSB7XG4gICAgZW5kZWQgPSB0cnVlXG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd2FpdGVyID0gcGVuZGluZy5zaGlmdCgpIVxuICAgICAgd2FpdGVyKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbS5vbignZGF0YScsIChjaHVuazogVCkgPT4ge1xuICAgIHB1c2hDaHVuayhjaHVuaylcbiAgfSlcblxuICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHtcbiAgICBlbmQoKVxuICB9KVxuXG4gIHN0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd2FpdGVyID0gcGVuZGluZy5zaGlmdCgpIVxuICAgICAgd2FpdGVyKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgIH1cbiAgICB0aHJvdyBlcnJcbiAgfSlcblxuICBmdW5jdGlvbiBtYWtlSXRlcmFibGUoKTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBidWZmZXJbMF1cbiAgICAgICAgICAgICAgYXdhaXRpbmdBY2srK1xuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgcGVuZGluZy5wdXNoKHJlc29sdmUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXN5bmMgcmV0dXJuKCkge1xuICAgICAgICAgICAgYWN0aXZlQ29uc3VtZXJzLS1cbiAgICAgICAgICAgIGlmIChhY3RpdmVDb25zdW1lcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgZW5kKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYWNrKCkge1xuICAgIGF3YWl0aW5nQWNrLS1cbiAgICBpZiAoYXdhaXRpbmdBY2sgPT09IDApIHtcbiAgICAgIC8vIGFsbCBjb25zdW1lcnMgZG9uZSB3aXRoIHRoZSBjdXJyZW50IGNodW5rXG4gICAgICBidWZmZXIuc2hpZnQoKSAvLyBkcm9wIGl0XG4gICAgICBhd2FpdCBvbkFsbEhhbmRsZWQoKVxuICAgICAgZmx1c2goKSAvLyBjb250aW51ZSB3aXRoIG5leHQgY2h1bmtcbiAgICB9XG4gIH1cblxuICAvLyB3cmFwIGNvbnN1bWVyIHNvIHRoZXkgKm11c3QqIGNhbGwgYWNrKCkgYWZ0ZXIgcHJvY2Vzc2luZ1xuICBmdW5jdGlvbiB3cmFwKGl0ZXJhYmxlOiBBc3luY0l0ZXJhYmxlPFQ+KTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICB5aWVsZCBpdGVtXG4gICAgICAgICAgYXdhaXQgYWNrKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH1cblxuICBjb25zdCByYXdJdGVyYWJsZXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBudW1Db25zdW1lcnMgfSwgbWFrZUl0ZXJhYmxlKVxuICByZXR1cm4gcmF3SXRlcmFibGVzLm1hcCh3cmFwKVxufVxuIl19
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQ0wsWUFBWSxFQUVaLFdBQVcsRUFDWCxlQUFlLEVBQ2YsZUFBZSxHQUNoQixNQUFNLGFBQWEsQ0FBQTtBQUVwQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBMkJoQyxNQUFNLE1BQU07SUFDRixTQUFTLENBQWM7SUFDdkIsS0FBSyxHQUEwQixFQUFFLENBQUE7SUFDakMsV0FBVyxHQUF3QyxJQUFJLENBQUE7SUFDdkQsTUFBTSxHQUFHLEtBQUssQ0FBQTtJQUV0QixZQUFZLFNBQXVCO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO0lBQzVCLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBa0IsRUFBRSxVQUFzQjtRQUM3QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixVQUFVLEVBQUUsQ0FBQTtZQUNaLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQXNCO1FBQzFCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLFVBQVUsRUFBRSxDQUFBO1lBQ1osT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FB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QUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDbGllbnRSZWFkYWJsZVN0cmVhbSB9IGZyb20gJ0BncnBjL2dycGMtanMnXG5pbXBvcnQge1xuICBEYXRhQ2h1bmssXG4gIFJlY2VpdmluZ01lc3NhZ2UsXG4gIFJlY2VpdmluZ1N0cmVhbU1lc3NhZ2UsXG4gIFJ1bm5lckNsaWVudCxcbn0gZnJvbSAnQHJkZmMvcHJvdG8nXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICd3aW5zdG9uJ1xuaW1wb3J0IHtcbiAgQW55Q29udmVydG9yLFxuICBDb252ZXJ0b3IsXG4gIE5vQ29udmVydG9yLFxuICBTdHJlYW1Db252ZXJ0b3IsXG4gIFN0cmluZ0NvbnZlcnRvcixcbn0gZnJvbSAnLi9jb252ZXJ0b3InXG5pbXBvcnQgeyBXcml0YWJsZSB9IGZyb20gJy4vcnVubmVyJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCdcblxuZXhwb3J0IHR5cGUgQW55ID1cbiAgfCB7XG4gICAgICBzdHJpbmc6IHN0cmluZ1xuICAgIH1cbiAgfCB7XG4gICAgICBzdHJlYW06IEFzeW5jR2VuZXJhdG9yPFVpbnQ4QXJyYXk+XG4gICAgfVxuICB8IHtcbiAgICAgIGJ1ZmZlcjogVWludDhBcnJheVxuICAgIH1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkZXIge1xuICByZWFkb25seSB1cmk6IHN0cmluZ1xuICBzdHJpbmdzKCk6IEFzeW5jSXRlcmFibGU8c3RyaW5nPlxuICBzdHJlYW1zKCk6IEFzeW5jSXRlcmFibGU8QXN5bmNHZW5lcmF0b3I8VWludDhBcnJheT4+XG4gIGJ1ZmZlcnMoKTogQXN5bmNJdGVyYWJsZTxVaW50OEFycmF5PlxuICBhbnlzKCk6IEFzeW5jSXRlcmFibGU8QW55PlxuICBjYW5jZWwoKTogUHJvbWlzZTx2b2lkPlxufVxuXG50eXBlIFRvZG88VD4gPSB7XG4gIGl0ZW06IFRcbiAgb25Db21wbGV0ZTogKCkgPT4gdm9pZFxufVxuXG5jbGFzcyBNeUl0ZXI8VD4gaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPFQ+IHtcbiAgcHJpdmF0ZSBjb252ZXJ0b3I6IENvbnZlcnRvcjxUPlxuICBwcml2YXRlIHF1ZXVlOiBUb2RvPFQgfCB1bmRlZmluZWQ+W10gPSBbXVxuICBwcml2YXRlIHJlc29sdmVOZXh0OiAoKHZhbHVlOiB1bmRlZmluZWQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKGNvbnZlcnRvcjogQ29udmVydG9yPFQ+KSB7XG4gICAgdGhpcy5jb252ZXJ0b3IgPSBjb252ZXJ0b3JcbiAgfVxuXG4gIHB1c2goYnVmZmVyOiBVaW50OEFycmF5LCBvbkNvbXBsZXRlOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICBvbkNvbXBsZXRlKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNvbnZlcnRvci5mcm9tKGJ1ZmZlcilcbiAgICB0aGlzLnF1ZXVlLnB1c2goeyBpdGVtLCBvbkNvbXBsZXRlIH0pXG4gICAgaWYgKHRoaXMucmVzb2x2ZU5leHQpIHtcbiAgICAgIHRoaXMucmVzb2x2ZU5leHQodW5kZWZpbmVkKVxuICAgICAgdGhpcy5yZXNvbHZlTmV4dCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBjbG9zZShvbkNvbXBsZXRlOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICBvbkNvbXBsZXRlKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuY2xvc2VkID0gdHJ1ZVxuICAgIHRoaXMucXVldWUucHVzaCh7IGl0ZW06IHVuZGVmaW5lZCwgb25Db21wbGV0ZSB9KVxuICAgIGlmICh0aGlzLnJlc29sdmVOZXh0KSB7XG4gICAgICB0aGlzLnJlc29sdmVOZXh0KHVuZGVmaW5lZClcbiAgICAgIHRoaXMucmVzb2x2ZU5leHQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcHVzaFN0cmVhbShjaHVua3M6IEFzeW5jSXRlcmFibGU8RGF0YUNodW5rPiwgb25Db21wbGV0ZTogKCkgPT4gdm9pZCkge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgb25Db21wbGV0ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIGFuIGFzeW5jIGdlbmVyYXRvciB0aGF0IHRyYW5zZm9ybXMgRGF0YUNodW5rcyB0byBCdWZmZXJzXG4gICAgY29uc3Qgc3RyZWFtID0gKGFzeW5jIGZ1bmN0aW9uKiAoc3RyZWFtKSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbSkge1xuICAgICAgICB5aWVsZCBjaHVuay5kYXRhXG4gICAgICB9XG4gICAgfSkoY2h1bmtzKVxuXG4gICAgY29uc3QgaXRlbSA9IGF3YWl0IHRoaXMuY29udmVydG9yLmZyb21TdHJlYW0oc3RyZWFtKVxuICAgIHRoaXMucXVldWUucHVzaCh7IGl0ZW0sIG9uQ29tcGxldGUgfSlcbiAgICBpZiAodGhpcy5yZXNvbHZlTmV4dCkge1xuICAgICAgdGhpcy5yZXNvbHZlTmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLnJlc29sdmVOZXh0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHsgaXRlbSwgb25Db21wbGV0ZSB9ID0gdGhpcy5xdWV1ZS5zaGlmdCgpIVxuICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb25Db21wbGV0ZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBpdGVtXG4gICAgICAgIC8vIE5vdGU6IGV4ZWN1dGlvbiBwYXVzZXMgYXQgYHlpZWxkYCB1bnRpbCB0aGUgY29uc3VtZXIgY2FsbHMgYC5uZXh0KClgIGFnYWluLlxuICAgICAgICAvLyBXZSBjYWxsIG9uQ29tcGxldGUgKmFmdGVyKiByZXN1bWluZywgc28gdGhlIHByb2R1Y2VyIGtub3dzIHRoZSBpdGVtIHdhcyBhY3R1YWxseSBjb25zdW1lZC5cbiAgICAgICAgb25Db21wbGV0ZSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx1bmRlZmluZWQ+KChyZXNvbHZlKSA9PiAodGhpcy5yZXNvbHZlTmV4dCA9IHJlc29sdmUpKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVhZGVySW5zdGFuY2UgaW1wbGVtZW50cyBSZWFkZXIge1xuICBwcml2YXRlIGNsaWVudDogUnVubmVyQ2xpZW50XG4gIHJlYWRvbmx5IHVyaTogc3RyaW5nXG4gIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJcbiAgcHJpdmF0ZSByZWFkb25seSBub3RpZnlPcmNoZXN0cmF0b3I6IFdyaXRhYmxlXG5cbiAgcHJpdmF0ZSBjb25zdW1lcnM6IE15SXRlcjx1bmtub3duPltdID0gW11cbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZVxuICBwcml2YXRlIGNhbmNlbGVkID0gZmFsc2VcblxuICBjb25zdHJ1Y3RvcihcbiAgICB1cmk6IHN0cmluZyxcbiAgICBjbGllbnQ6IFJ1bm5lckNsaWVudCxcbiAgICBub3RpZnlPcmNoZXN0cmF0b3I6IFdyaXRhYmxlLFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLnVyaSA9IHVyaVxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICB0aGlzLm5vdGlmeU9yY2hlc3RyYXRvciA9IG5vdGlmeU9yY2hlc3RyYXRvclxuICB9XG5cbiAgYW55cygpOiBBc3luY0l0ZXJhYmxlPEFueT4ge1xuICAgIGNvbnN0IGl0ZXIgPSBuZXcgTXlJdGVyKEFueUNvbnZlcnRvcilcbiAgICB0aGlzLmNvbnN1bWVycy5wdXNoKGl0ZXIpXG4gICAgcmV0dXJuIGl0ZXJcbiAgfVxuXG4gIHN0cmluZ3MoKTogQXN5bmNJdGVyYWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpdGVyID0gbmV3IE15SXRlcihTdHJpbmdDb252ZXJ0b3IpXG4gICAgdGhpcy5jb25zdW1lcnMucHVzaChpdGVyKVxuICAgIHJldHVybiBpdGVyXG4gIH1cblxuICBidWZmZXJzKCk6IEFzeW5jSXRlcmFibGU8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGl0ZXIgPSBuZXcgTXlJdGVyKE5vQ29udmVydG9yKVxuICAgIHRoaXMuY29uc3VtZXJzLnB1c2goaXRlcilcbiAgICByZXR1cm4gaXRlclxuICB9XG5cbiAgc3RyZWFtcygpOiBBc3luY0l0ZXJhYmxlPEFzeW5jR2VuZXJhdG9yPFVpbnQ4QXJyYXk+PiB7XG4gICAgY29uc3QgaXRlciA9IG5ldyBNeUl0ZXIoU3RyZWFtQ29udmVydG9yKVxuICAgIHRoaXMuY29uc3VtZXJzLnB1c2goaXRlcilcbiAgICByZXR1cm4gaXRlclxuICB9XG5cbiAgaGFuZGxlTXNnKG1zZzogUmVjZWl2aW5nTWVzc2FnZSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke3RoaXMudXJpfSBoYW5kbGluZyBtZXNzYWdlYClcblxuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3Ioe1xuICAgICAgICBwcm9jZXNzZWQ6IHtcbiAgICAgICAgICBnbG9iYWxTZXF1ZW5jZU51bWJlcjogbXNnLmdsb2JhbFNlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIGNoYW5uZWw6IHRoaXMudXJpLFxuICAgICAgICAgIGVycm9yOlxuICAgICAgICAgICAgJ3JlYWRlciBpcyBjYW5jZWxlZDsgbWVzc2FnZSBoYXMgbm90IGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBwcm9jZXNzb3InLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VzID0gW11cbiAgICBmb3IgKGNvbnN0IGl0ZXIgb2YgdGhpcy5jb25zdW1lcnMpIHtcbiAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlcykgPT4gaXRlci5wdXNoKG1zZy5kYXRhLCAoKSA9PiByZXMobnVsbCkpKSlcbiAgICB9XG5cbiAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PlxuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3Ioe1xuICAgICAgICBwcm9jZXNzZWQ6IHtcbiAgICAgICAgICBnbG9iYWxTZXF1ZW5jZU51bWJlcjogbXNnLmdsb2JhbFNlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIGNoYW5uZWw6IHRoaXMudXJpLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKVxuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlZCA9IHRydWVcbiAgICBmb3IgKGNvbnN0IGl0ZXIgb2YgdGhpcy5jb25zdW1lcnMpIHtcbiAgICAgIGl0ZXIuY2xvc2UoKCkgPT4ge30pXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2FuY2VsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNhbmNlbGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZVxuICAgIHRoaXMuY2xvc2UoKVxuICAgIGF3YWl0IHRoaXMubm90aWZ5T3JjaGVzdHJhdG9yKHtcbiAgICAgIGNsb3NlOiB7IGNoYW5uZWw6IHRoaXMudXJpIH0sXG4gICAgfSlcbiAgfVxuXG4gIC8vIFRoZXJlIGlzIGEgc3RyZWFtIG1lc3NhZ2UgYXZhaWxhYmxlIGZvciB0aGlzIHJlYWRlclxuICBhc3luYyBoYW5kbGVTdHJlYW1pbmdNZXNzYWdlKHtcbiAgICBjaGFubmVsLFxuICAgIGdsb2JhbFNlcXVlbmNlTnVtYmVyLFxuICB9OiBSZWNlaXZpbmdTdHJlYW1NZXNzYWdlKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7dGhpcy51cml9IGhhbmRsaW5nIHN0cmVhbWluZyBtZXNzYWdlYClcblxuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgYXdhaXQgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3Ioe1xuICAgICAgICBwcm9jZXNzZWQ6IHsgZ2xvYmFsU2VxdWVuY2VOdW1iZXIsIGNoYW5uZWwgfSxcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaHVua3MgPSB0aGlzLmNsaWVudC5yZWNlaXZlU3RyZWFtTWVzc2FnZSgpXG4gICAgY29uc3Qgd3JpdGVDb250cm9sTWVzc2FnZSA9IHByb21pc2lmeShjaHVua3Mud3JpdGUuYmluZChjaHVua3MpKVxuICAgIGNvbnN0IGNvbnN1bWVyc0NvbnN1bWVkID0gW11cblxuICAgIC8vIEFmdGVyIGVhY2ggY2h1bmsgaXMgaGFuZGxlZCBieSBhbGwgY29uc3VtZXIsIGVtaXQgYSBwcm9jZXNzZWQgbWVzc2FnZVxuICAgIGxldCBpZHggPSAwXG4gICAgY29uc3QgbWVzc2FnZUl0ZXJhdG9ycyA9IGZhbm91dFN0cmVhbShcbiAgICAgIGNodW5rcyxcbiAgICAgIHRoaXMuY29uc3VtZXJzLmxlbmd0aCxcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVDb250cm9sTWVzc2FnZSh7IHN0cmVhbVNlcXVlbmNlTnVtYmVyOiBpZHgrKyB9KVxuICAgICAgfSxcbiAgICApXG5cbiAgICBmb3IgKGNvbnN0IGNvbnN1bWVyIG9mIHRoaXMuY29uc3VtZXJzKSB7XG4gICAgICBjb25zdW1lcnNDb25zdW1lZC5wdXNoKFxuICAgICAgICBuZXcgUHJvbWlzZSgocmVzKSA9PlxuICAgICAgICAgIGNvbnN1bWVyLnB1c2hTdHJlYW0obWVzc2FnZUl0ZXJhdG9ycy5wb3AoKSEsICgpID0+IHJlcyhudWxsKSksXG4gICAgICAgICksXG4gICAgICApXG4gICAgfVxuXG4gICAgYXdhaXQgd3JpdGVDb250cm9sTWVzc2FnZSh7IGdsb2JhbFNlcXVlbmNlTnVtYmVyIH0pXG5cbiAgICBQcm9taXNlLmFsbChjb25zdW1lcnNDb25zdW1lZCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnV3JpdGluZyBwcm9jZXNzZWQgZm9yIHN0cmVhbWluZyBtZXNzYWdlJylcbiAgICAgIHRoaXMubm90aWZ5T3JjaGVzdHJhdG9yKHsgcHJvY2Vzc2VkOiB7IGdsb2JhbFNlcXVlbmNlTnVtYmVyLCBjaGFubmVsIH0gfSlcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHRlZSBhIHN0cmVhbSBgbnVtQ29uc3VtZXJzYCB0aW1lc1xuICogV2hlbiBlYWNoIHRlZSdkIHN0cmVhbSBoYXMgaGFuZGxlZCBhIGNodW5rLCBjYWxsIHtAbGluayBvbkFsbEhhbmRsZWR9XG4gKi9cbmZ1bmN0aW9uIGZhbm91dFN0cmVhbTxUPihcbiAgc3RyZWFtOiBDbGllbnRSZWFkYWJsZVN0cmVhbTxUPixcbiAgbnVtQ29uc3VtZXJzOiBudW1iZXIsXG4gIG9uQWxsSGFuZGxlZDogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4sXG4pOiBBc3luY0l0ZXJhYmxlPFQ+W10ge1xuICB0eXBlIFdhaXRlciA9ICh2YWx1ZTogSXRlcmF0b3JSZXN1bHQ8VD4pID0+IHZvaWRcblxuICBsZXQgZW5kZWQgPSBmYWxzZVxuICBjb25zdCBidWZmZXI6IFRbXSA9IFtdXG4gIGNvbnN0IHBlbmRpbmc6IFdhaXRlcltdID0gW11cbiAgbGV0IGFjdGl2ZUNvbnN1bWVycyA9IG51bUNvbnN1bWVyc1xuXG4gIC8vIGNvbnN1bWVyIGJvb2trZWVwaW5nXG4gIGxldCBhd2FpdGluZ0FjayA9IDBcblxuICBmdW5jdGlvbiBwdXNoQ2h1bmsoY2h1bms6IFQpIHtcbiAgICBidWZmZXIucHVzaChjaHVuaylcbiAgICBmbHVzaCgpXG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+IDAgJiYgcGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaHVuayA9IGJ1ZmZlclswXSAvLyBrZWVwIHVudGlsIGFsbCBjb25zdW1lcnMgYWNrXG4gICAgICBjb25zdCB3YWl0ZXIgPSBwZW5kaW5nLnNoaWZ0KCkhXG4gICAgICB3YWl0ZXIoeyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH0pXG4gICAgICBhd2FpdGluZ0FjaysrXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW5kKCkge1xuICAgIGVuZGVkID0gdHJ1ZVxuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHdhaXRlciA9IHBlbmRpbmcuc2hpZnQoKSFcbiAgICAgIHdhaXRlcih7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICB9XG4gIH1cblxuICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bms6IFQpID0+IHtcbiAgICBwdXNoQ2h1bmsoY2h1bmspXG4gIH0pXG5cbiAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgZW5kKClcbiAgfSlcblxuICBzdHJlYW0ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHdhaXRlciA9IHBlbmRpbmcuc2hpZnQoKSFcbiAgICAgIHdhaXRlcih7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICB9XG4gICAgdGhyb3cgZXJyXG4gIH0pXG5cbiAgZnVuY3Rpb24gbWFrZUl0ZXJhYmxlKCk6IEFzeW5jSXRlcmFibGU8VD4ge1xuICAgIHJldHVybiB7XG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gYnVmZmVyWzBdXG4gICAgICAgICAgICAgIGF3YWl0aW5nQWNrKytcbiAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgIHBlbmRpbmcucHVzaChyZXNvbHZlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFzeW5jIHJldHVybigpIHtcbiAgICAgICAgICAgIGFjdGl2ZUNvbnN1bWVycy0tXG4gICAgICAgICAgICBpZiAoYWN0aXZlQ29uc3VtZXJzID09PSAwKSB7XG4gICAgICAgICAgICAgIGVuZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFjaygpIHtcbiAgICBhd2FpdGluZ0Fjay0tXG4gICAgaWYgKGF3YWl0aW5nQWNrID09PSAwKSB7XG4gICAgICAvLyBhbGwgY29uc3VtZXJzIGRvbmUgd2l0aCB0aGUgY3VycmVudCBjaHVua1xuICAgICAgYnVmZmVyLnNoaWZ0KCkgLy8gZHJvcCBpdFxuICAgICAgYXdhaXQgb25BbGxIYW5kbGVkKClcbiAgICAgIGZsdXNoKCkgLy8gY29udGludWUgd2l0aCBuZXh0IGNodW5rXG4gICAgfVxuICB9XG5cbiAgLy8gd3JhcCBjb25zdW1lciBzbyB0aGV5ICptdXN0KiBjYWxsIGFjaygpIGFmdGVyIHByb2Nlc3NpbmdcbiAgZnVuY3Rpb24gd3JhcChpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxUPik6IEFzeW5jSXRlcmFibGU8VD4ge1xuICAgIHJldHVybiB7XG4gICAgICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgeWllbGQgaXRlbVxuICAgICAgICAgIGF3YWl0IGFjaygpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmF3SXRlcmFibGVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtQ29uc3VtZXJzIH0sIG1ha2VJdGVyYWJsZSlcbiAgcmV0dXJuIHJhd0l0ZXJhYmxlcy5tYXAod3JhcClcbn1cbiJdfQ==