specificjson 0.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.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +17 -0
  3. data/bin/specificjson +2863 -0
  4. metadata +52 -0
data/bin/specificjson ADDED
@@ -0,0 +1,2863 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Copyright © 2020-2021 Ismo Kärkkäinen
4
+ # Licensed under Universal Permissive License. See LICENSE.txt.
5
+
6
+ require 'optparse'
7
+ require 'yaml'
8
+ require 'json'
9
+ require 'base64'
10
+
11
+ $CLEAN = false
12
+ $DOC = false
13
+ $RECIPE = nil
14
+ $LIST = false
15
+ $WARN = false
16
+ $EXPORT = false
17
+ $BUILD = nil
18
+ $IN = nil
19
+
20
+ parser = OptionParser.new do |opts|
21
+ opts.summary_indent = ' '
22
+ opts.summary_width = 24
23
+ opts.banner = 'Usage: build [options]'
24
+ opts.separator ''
25
+ opts.separator 'Options (handled in presented order):'
26
+ opts.on('--clean', 'Ignore embedded information.') { $CLEAN = true }
27
+ opts.on('--document', 'Print default values and information.') { $DOC = true }
28
+ opts.on('--import FILELIST', 'Piece YAML file list as YAML array.') { |f| $RECIPE = f }
29
+ opts.on('--list', 'List the names that are available.') { $LIST = true }
30
+ opts.on('--warn', 'Warn about missing requirements instead of an error.') { $WARN = true }
31
+ opts.on('--export', 'Export data to current directory as separate files.') { $EXPORT = true }
32
+ opts.on('--build OUTPUT', 'Re-build to named script.') { |f| $BUILD = f }
33
+ opts.on('-i', '--input FILENAME', 'Specifications to use.') { |f| $IN = f }
34
+ opts.on('-h', '--help', 'Print this help and exit.') do
35
+ $stdout.puts opts
36
+ exit 0
37
+ end
38
+ end
39
+ parser.parse!
40
+
41
+ #PIECESASSIGNMENTSTART#
42
+
43
+ $PIECES = YAML.load(%(---
44
+ Exception:
45
+ description: Exception class.
46
+ declaration: |
47
+ class Exception;
48
+ class ContextException;
49
+ external: false
50
+ header: Exception.hpp
51
+ source: Exception.cpp
52
+ license: "../LICENSE.txt"
53
+ includes:
54
+ - "#include <exception>"
55
+ source_includes:
56
+ - "#include <cstring>"
57
+ header_stored: c0
58
+ source_stored: c1
59
+ license_stored: c2
60
+ requires: &2 []
61
+ writer: false
62
+ scalar: true
63
+ parsername:
64
+ pooled:
65
+ poolindexes:
66
+ poolparsers:
67
+ poolparsertypes:
68
+ ParseArrayContainer:
69
+ external: false
70
+ description: Parses an array into a container.
71
+ header: ParseArrayContainer.hpp
72
+ source: ParseArrayContainer.cpp
73
+ license: "../LICENSE.txt"
74
+ requires:
75
+ - ValueParser
76
+ - Exception
77
+ includes:
78
+ - "#include <utility>"
79
+ header_stored: c3
80
+ source_stored: c4
81
+ license_stored: c2
82
+ source_includes: &1 []
83
+ writer: false
84
+ scalar: true
85
+ declaration:
86
+ parsername:
87
+ pooled:
88
+ poolindexes:
89
+ poolparsers:
90
+ poolparsertypes:
91
+ ParseObject:
92
+ external: false
93
+ description: Parses an object into an instance.
94
+ header: ParseObject.hpp
95
+ source: ParseObject.cpp
96
+ license: "../LICENSE.txt"
97
+ requires:
98
+ - ValueParser
99
+ - Exception
100
+ includes:
101
+ - "#include <tuple>"
102
+ - "#include <utility>"
103
+ - "#include <vector>"
104
+ header_stored: c5
105
+ source_stored: c6
106
+ license_stored: c2
107
+ source_includes: *1
108
+ writer: false
109
+ scalar: true
110
+ declaration:
111
+ parsername:
112
+ pooled:
113
+ poolindexes:
114
+ poolparsers:
115
+ poolparsertypes:
116
+ ParserPool:
117
+ description: 'Generated class to provide a shared buffer for all scalar value parsers.
118
+
119
+ '
120
+ external: false
121
+ declaration: class ParserPool;
122
+ header: ParserPool.hpp
123
+ source: ParserPool.cpp
124
+ poolindexes: PoolIndexes
125
+ poolparsers: PoolParsers
126
+ poolparsertypes: PoolParserTypes
127
+ license: "../LICENSE.txt"
128
+ header_stored: c7
129
+ source_stored: c8
130
+ license_stored: c2
131
+ includes: &3 []
132
+ source_includes: *1
133
+ requires: *2
134
+ writer: false
135
+ scalar: true
136
+ parsername:
137
+ pooled:
138
+ ValueParser:
139
+ description: Base class for all parsers.
140
+ external: false
141
+ header: ValueParser.hpp
142
+ source: ValueParser.cpp
143
+ license: "../LICENSE.txt"
144
+ requires:
145
+ - ParserPool
146
+ header_stored: c9
147
+ source_stored: c10
148
+ license_stored: c2
149
+ includes: *3
150
+ source_includes: *1
151
+ writer: false
152
+ scalar: true
153
+ declaration:
154
+ parsername:
155
+ pooled:
156
+ poolindexes:
157
+ poolparsers:
158
+ poolparsertypes:
159
+ ParseInteger:
160
+ external: false
161
+ declaration: |
162
+ template<typename T, intmax_t Minimum, uintmax_t Maximum>
163
+ const char* parse_integer(T& Out, const char* Begin, const char* End, std::vector<char>& Buffer, bool Finished) noexcept(false);
164
+ header: ParseInteger.hpp
165
+ source: ParseInteger.cpp
166
+ license: "../LICENSE.txt"
167
+ requires:
168
+ - Exception
169
+ includes:
170
+ - "#include <vector>"
171
+ - "#include <cstdlib>"
172
+ - "#include <cinttypes>"
173
+ - "#include <sys/errno.h>"
174
+ header_stored: c11
175
+ source_stored: c12
176
+ license_stored: c2
177
+ source_includes: *1
178
+ writer: false
179
+ scalar: true
180
+ parsername:
181
+ pooled:
182
+ poolindexes:
183
+ poolparsers:
184
+ poolparsertypes:
185
+ ContainerStdVector:
186
+ description: Parses an array of containers into std::vector.
187
+ parsername: ParseContainerStdVector
188
+ header: read_ContainerStdVector.hpp
189
+ license: "../LICENSE.txt"
190
+ requires:
191
+ - ParseArrayContainer
192
+ includes:
193
+ - "#include <vector>"
194
+ header_stored: c13
195
+ source:
196
+ source_stored:
197
+ license_stored: c2
198
+ source_includes: *1
199
+ writer: false
200
+ scalar: true
201
+ external: true
202
+ declaration:
203
+ pooled:
204
+ poolindexes:
205
+ poolparsers:
206
+ poolparsertypes:
207
+ ContainerStdVectorEqSize:
208
+ description: |
209
+ Parses an array of containers into std::vector and checks that their sizes
210
+ are the same.
211
+ parsername: ParseContainerStdVectorEqSize
212
+ header: read_ContainerStdVectorEqSize.hpp
213
+ license: "../LICENSE.txt"
214
+ requires:
215
+ - ParseArrayContainer
216
+ includes:
217
+ - "#include <vector>"
218
+ header_stored: c14
219
+ source:
220
+ source_stored:
221
+ license_stored: c2
222
+ source_includes: *1
223
+ writer: false
224
+ scalar: true
225
+ external: true
226
+ declaration:
227
+ pooled:
228
+ poolindexes:
229
+ poolparsers:
230
+ poolparsertypes:
231
+ Bool:
232
+ description: Parses Boolean value into bool.
233
+ parsername: ParseBool
234
+ declaration: class ParseBool;
235
+ pooled: PoolIndex
236
+ header: read_Bool.hpp
237
+ source: read_Bool.cpp
238
+ license: "../LICENSE.txt"
239
+ requires:
240
+ - ValueParser
241
+ - Exception
242
+ includes:
243
+ - "#include <cstdlib>"
244
+ header_stored: c15
245
+ source_stored: c16
246
+ license_stored: c2
247
+ source_includes: *1
248
+ writer: false
249
+ scalar: true
250
+ external: true
251
+ poolindexes:
252
+ poolparsers:
253
+ poolparsertypes:
254
+ Double:
255
+ description: Parses number into double using strtod. Expects LC_NUMERIC C.
256
+ parsername: ParseDouble
257
+ declaration: class ParseDouble;
258
+ pooled: PoolIndex
259
+ header: read_Double.hpp
260
+ source: read_Double.cpp
261
+ license: "../LICENSE.txt"
262
+ requires:
263
+ - ValueParser
264
+ - Exception
265
+ includes:
266
+ - |
267
+ #if !defined(__GNUG__)
268
+ #include <cmath>
269
+ #else
270
+ #include <math.h>
271
+ #endif
272
+ header_stored: c17
273
+ source_stored: c18
274
+ license_stored: c2
275
+ source_includes: *1
276
+ writer: false
277
+ scalar: true
278
+ external: true
279
+ poolindexes:
280
+ poolparsers:
281
+ poolparsertypes:
282
+ Float:
283
+ description: Parses number into float using strtof. Expects LC_NUMERIC C.
284
+ parsername: ParseFloat
285
+ declaration: class ParseFloat;
286
+ pooled: PoolIndex
287
+ header: read_Float.hpp
288
+ source: read_Float.cpp
289
+ license: "../LICENSE.txt"
290
+ requires:
291
+ - ValueParser
292
+ - Exception
293
+ includes:
294
+ - |
295
+ #if !defined(__GNUG__)
296
+ #include <cmath>
297
+ #else
298
+ #include <math.h>
299
+ #endif
300
+ header_stored: c19
301
+ source_stored: c20
302
+ license_stored: c2
303
+ source_includes: *1
304
+ writer: false
305
+ scalar: true
306
+ external: true
307
+ poolindexes:
308
+ poolparsers:
309
+ poolparsertypes:
310
+ Int8:
311
+ description: Parses number into 8-bit integer.
312
+ parsername: ParseInt8
313
+ declaration: class ParseInt8;
314
+ pooled: PoolIndex
315
+ header: read_Int8.hpp
316
+ source: read_Int8.cpp
317
+ license: "../LICENSE.txt"
318
+ requires:
319
+ - ValueParser
320
+ - ParseInteger
321
+ source_includes:
322
+ - "#include <limits>"
323
+ header_stored: c21
324
+ source_stored: c22
325
+ license_stored: c2
326
+ includes: *3
327
+ writer: false
328
+ scalar: true
329
+ external: true
330
+ poolindexes:
331
+ poolparsers:
332
+ poolparsertypes:
333
+ Int16:
334
+ description: Parses number into 16-bit integer.
335
+ parsername: ParseInt16
336
+ declaration: class ParseInt16;
337
+ pooled: PoolIndex
338
+ header: read_Int16.hpp
339
+ source: read_Int16.cpp
340
+ license: "../LICENSE.txt"
341
+ requires:
342
+ - ValueParser
343
+ - ParseInteger
344
+ source_includes:
345
+ - "#include <limits>"
346
+ header_stored: c23
347
+ source_stored: c24
348
+ license_stored: c2
349
+ includes: *3
350
+ writer: false
351
+ scalar: true
352
+ external: true
353
+ poolindexes:
354
+ poolparsers:
355
+ poolparsertypes:
356
+ Int32:
357
+ description: Parses number into 32-bit integer.
358
+ parsername: ParseInt32
359
+ declaration: class ParseInt32;
360
+ pooled: PoolIndex
361
+ header: read_Int32.hpp
362
+ source: read_Int32.cpp
363
+ license: "../LICENSE.txt"
364
+ requires:
365
+ - ValueParser
366
+ - ParseInteger
367
+ source_includes:
368
+ - "#include <limits>"
369
+ header_stored: c25
370
+ source_stored: c26
371
+ license_stored: c2
372
+ includes: *3
373
+ writer: false
374
+ scalar: true
375
+ external: true
376
+ poolindexes:
377
+ poolparsers:
378
+ poolparsertypes:
379
+ Int64:
380
+ description: Parses number into 64-bit integer.
381
+ parsername: ParseInt64
382
+ declaration: class ParseInt64;
383
+ pooled: PoolIndex
384
+ header: read_Int64.hpp
385
+ source: read_Int64.cpp
386
+ license: "../LICENSE.txt"
387
+ requires:
388
+ - ValueParser
389
+ - ParseInteger
390
+ source_includes:
391
+ - "#include <limits>"
392
+ header_stored: c27
393
+ source_stored: c28
394
+ license_stored: c2
395
+ includes: *3
396
+ writer: false
397
+ scalar: true
398
+ external: true
399
+ poolindexes:
400
+ poolparsers:
401
+ poolparsertypes:
402
+ UInt8:
403
+ description: Parses number into 8-bit unsigned integer.
404
+ parsername: ParseUInt8
405
+ declaration: class ParseUInt8;
406
+ pooled: PoolIndex
407
+ header: read_UInt8.hpp
408
+ source: read_UInt8.cpp
409
+ license: "../LICENSE.txt"
410
+ requires:
411
+ - ValueParser
412
+ - ParseInteger
413
+ source_includes:
414
+ - "#include <limits>"
415
+ header_stored: c29
416
+ source_stored: c30
417
+ license_stored: c2
418
+ includes: *3
419
+ writer: false
420
+ scalar: true
421
+ external: true
422
+ poolindexes:
423
+ poolparsers:
424
+ poolparsertypes:
425
+ UInt16:
426
+ description: Parses number into 16-bit unsigned integer.
427
+ parsername: ParseUInt16
428
+ declaration: class ParseUInt16;
429
+ pooled: PoolIndex
430
+ header: read_UInt16.hpp
431
+ source: read_UInt16.cpp
432
+ license: "../LICENSE.txt"
433
+ requires:
434
+ - ValueParser
435
+ - ParseInteger
436
+ source_includes:
437
+ - "#include <limits>"
438
+ header_stored: c31
439
+ source_stored: c32
440
+ license_stored: c2
441
+ includes: *3
442
+ writer: false
443
+ scalar: true
444
+ external: true
445
+ poolindexes:
446
+ poolparsers:
447
+ poolparsertypes:
448
+ UInt32:
449
+ description: Parses number into 32-bit unsigned integer.
450
+ parsername: ParseUInt32
451
+ declaration: class ParseUInt32;
452
+ pooled: PoolIndex
453
+ header: read_UInt32.hpp
454
+ source: read_UInt32.cpp
455
+ license: "../LICENSE.txt"
456
+ requires:
457
+ - ValueParser
458
+ - ParseInteger
459
+ source_includes:
460
+ - "#include <limits>"
461
+ header_stored: c33
462
+ source_stored: c34
463
+ license_stored: c2
464
+ includes: *3
465
+ writer: false
466
+ scalar: true
467
+ external: true
468
+ poolindexes:
469
+ poolparsers:
470
+ poolparsertypes:
471
+ UInt64:
472
+ description: Parses number into 64-bit unsigned integer.
473
+ parsername: ParseUInt64
474
+ declaration: class ParseUInt64;
475
+ pooled: PoolIndex
476
+ header: read_UInt64.hpp
477
+ source: read_UInt64.cpp
478
+ license: "../LICENSE.txt"
479
+ requires:
480
+ - ValueParser
481
+ - ParseInteger
482
+ source_includes:
483
+ - "#include <limits>"
484
+ header_stored: c35
485
+ source_stored: c36
486
+ license_stored: c2
487
+ includes: *3
488
+ writer: false
489
+ scalar: true
490
+ external: true
491
+ poolindexes:
492
+ poolparsers:
493
+ poolparsertypes:
494
+ StdVector:
495
+ description: Parses an array of scalars into std::vector.
496
+ parsername: ParseStdVector
497
+ header: read_StdVector.hpp
498
+ license: "../LICENSE.txt"
499
+ requires:
500
+ - ParseArrayContainer
501
+ includes:
502
+ - "#include <vector>"
503
+ header_stored: c37
504
+ source:
505
+ source_stored:
506
+ license_stored: c2
507
+ source_includes: *1
508
+ writer: false
509
+ scalar: true
510
+ external: true
511
+ declaration:
512
+ pooled:
513
+ poolindexes:
514
+ poolparsers:
515
+ poolparsertypes:
516
+ String:
517
+ description: Parses a string into std::string.
518
+ parsername: ParseString
519
+ declaration: class ParseString;
520
+ pooled: PoolIndex
521
+ header: read_String.hpp
522
+ source: read_String.cpp
523
+ license: "../LICENSE.txt"
524
+ requires:
525
+ - ValueParser
526
+ - Exception
527
+ includes:
528
+ - "#include <string>"
529
+ header_stored: c38
530
+ source_stored: c39
531
+ license_stored: c2
532
+ source_includes: *1
533
+ writer: false
534
+ scalar: true
535
+ external: true
536
+ poolindexes:
537
+ poolparsers:
538
+ poolparsertypes:
539
+ writeBool:
540
+ writer: true
541
+ declaration: |
542
+ template<typename Sink>
543
+ void Write(Sink& S, bool Value, std::vector<char>& Buffer);
544
+ header: write_Bool.hpp
545
+ license: "../LICENSE.txt"
546
+ includes:
547
+ - "#include <vector>"
548
+ header_stored: c40
549
+ source:
550
+ source_stored:
551
+ license_stored: c2
552
+ source_includes: *1
553
+ requires: *2
554
+ scalar: true
555
+ external: false
556
+ parsername:
557
+ pooled:
558
+ poolindexes:
559
+ poolparsers:
560
+ poolparsertypes:
561
+ writeDouble:
562
+ writer: true
563
+ declaration: |
564
+ template<typename Sink>
565
+ void Write(Sink& S, double Value, std::vector<char>& Buffer);
566
+ header: write_Double.hpp
567
+ source: write_Double.cpp
568
+ license: "../LICENSE.txt"
569
+ requires:
570
+ - Exception
571
+ - writeScalarType
572
+ includes:
573
+ - "#include <vector>"
574
+ header_stored: c41
575
+ source_stored: c42
576
+ license_stored: c2
577
+ source_includes: *1
578
+ scalar: true
579
+ external: false
580
+ parsername:
581
+ pooled:
582
+ poolindexes:
583
+ poolparsers:
584
+ poolparsertypes:
585
+ writeFloat:
586
+ writer: true
587
+ declaration: |
588
+ template<typename Sink>
589
+ void Write(Sink& S, float Value, std::vector<char>& Buffer);
590
+ header: write_Float.hpp
591
+ source: write_Float.cpp
592
+ license: "../LICENSE.txt"
593
+ requires:
594
+ - Exception
595
+ - writeScalarType
596
+ includes:
597
+ - "#include <vector>"
598
+ header_stored: c43
599
+ source_stored: c44
600
+ license_stored: c2
601
+ source_includes: *1
602
+ scalar: true
603
+ external: false
604
+ parsername:
605
+ pooled:
606
+ poolindexes:
607
+ poolparsers:
608
+ poolparsertypes:
609
+ writeScalarType:
610
+ writer: true
611
+ declaration: |
612
+ template<typename Sink, typename T, const auto& Format>
613
+ void WriteScalarType(Sink& S, T Value, std::vector<char>& Buffer);
614
+ header: write_ScalarType.hpp
615
+ source: write_ScalarType.cpp
616
+ license: "../LICENSE.txt"
617
+ includes:
618
+ - "#include <cstdio>"
619
+ - "#include <vector>"
620
+ source_includes:
621
+ - "#include <limits>"
622
+ header_stored: c45
623
+ source_stored: c46
624
+ license_stored: c2
625
+ requires: *2
626
+ scalar: true
627
+ external: false
628
+ parsername:
629
+ pooled:
630
+ poolindexes:
631
+ poolparsers:
632
+ poolparsertypes:
633
+ writeForwardIterator:
634
+ writer: true
635
+ scalar: false
636
+ declaration: |
637
+ template<typename Sink, typename ForwardIterator>
638
+ void Write(Sink& S, ForwardIterator& Begin, ForwardIterator& End, std::vector<char>& Buffer);
639
+ header: write_ForwardIterator.hpp
640
+ requires:
641
+ - writePointer
642
+ license: "../LICENSE.txt"
643
+ includes:
644
+ - "#include <vector>"
645
+ header_stored: c47
646
+ source:
647
+ source_stored:
648
+ license_stored: c2
649
+ source_includes: *1
650
+ external: false
651
+ parsername:
652
+ pooled:
653
+ poolindexes:
654
+ poolparsers:
655
+ poolparsertypes:
656
+ writeInt8:
657
+ writer: true
658
+ declaration: |
659
+ template<typename Sink>
660
+ void Write(Sink& S, std::int8_t Value, std::vector<char>& Buffer);
661
+ header: write_Int8.hpp
662
+ source: write_Int8.cpp
663
+ license: "../LICENSE.txt"
664
+ requires:
665
+ - writeScalarType
666
+ includes:
667
+ - "#include <cstdint>"
668
+ - "#include <vector>"
669
+ source_includes:
670
+ - "#include <cinttypes>"
671
+ header_stored: c48
672
+ source_stored: c49
673
+ license_stored: c2
674
+ scalar: true
675
+ external: false
676
+ parsername:
677
+ pooled:
678
+ poolindexes:
679
+ poolparsers:
680
+ poolparsertypes:
681
+ writeInt16:
682
+ writer: true
683
+ declaration: |
684
+ template<typename Sink>
685
+ void Write(Sink& S, std::int16_t Value, std::vector<char>& Buffer);
686
+ header: write_Int16.hpp
687
+ source: write_Int16.cpp
688
+ license: "../LICENSE.txt"
689
+ requires:
690
+ - writeScalarType
691
+ includes:
692
+ - "#include <cstdint>"
693
+ - "#include <vector>"
694
+ source_includes:
695
+ - "#include <cinttypes>"
696
+ header_stored: c50
697
+ source_stored: c51
698
+ license_stored: c2
699
+ scalar: true
700
+ external: false
701
+ parsername:
702
+ pooled:
703
+ poolindexes:
704
+ poolparsers:
705
+ poolparsertypes:
706
+ writeInt32:
707
+ writer: true
708
+ declaration: |
709
+ template<typename Sink>
710
+ void Write(Sink& S, std::int32_t Value, std::vector<char>& Buffer);
711
+ header: write_Int32.hpp
712
+ source: write_Int32.cpp
713
+ license: "../LICENSE.txt"
714
+ requires:
715
+ - writeScalarType
716
+ includes:
717
+ - "#include <cstdint>"
718
+ - "#include <vector>"
719
+ source_includes:
720
+ - "#include <cinttypes>"
721
+ header_stored: c52
722
+ source_stored: c53
723
+ license_stored: c2
724
+ scalar: true
725
+ external: false
726
+ parsername:
727
+ pooled:
728
+ poolindexes:
729
+ poolparsers:
730
+ poolparsertypes:
731
+ writeInt64:
732
+ writer: true
733
+ declaration: |
734
+ template<typename Sink>
735
+ void Write(Sink& S, std::int64_t Value, std::vector<char>& Buffer);
736
+ header: write_Int64.hpp
737
+ source: write_Int64.cpp
738
+ license: "../LICENSE.txt"
739
+ requires:
740
+ - writeScalarType
741
+ includes:
742
+ - "#include <cstdint>"
743
+ - "#include <vector>"
744
+ source_includes:
745
+ - "#include <cinttypes>"
746
+ header_stored: c54
747
+ source_stored: c55
748
+ license_stored: c2
749
+ scalar: true
750
+ external: false
751
+ parsername:
752
+ pooled:
753
+ poolindexes:
754
+ poolparsers:
755
+ poolparsertypes:
756
+ writeUInt8:
757
+ writer: true
758
+ declaration: |
759
+ template<typename Sink>
760
+ void Write(Sink& S, std::uint8_t Value, std::vector<char>& Buffer);
761
+ header: write_UInt8.hpp
762
+ source: write_UInt8.cpp
763
+ license: "../LICENSE.txt"
764
+ requires:
765
+ - writeScalarType
766
+ includes:
767
+ - "#include <cstdint>"
768
+ - "#include <vector>"
769
+ source_includes:
770
+ - "#include <cinttypes>"
771
+ header_stored: c56
772
+ source_stored: c57
773
+ license_stored: c2
774
+ scalar: true
775
+ external: false
776
+ parsername:
777
+ pooled:
778
+ poolindexes:
779
+ poolparsers:
780
+ poolparsertypes:
781
+ writeUInt16:
782
+ writer: true
783
+ declaration: |
784
+ template<typename Sink>
785
+ void Write(Sink& S, std::uint16_t Value, std::vector<char>& Buffer);
786
+ header: write_UInt16.hpp
787
+ source: write_UInt16.cpp
788
+ license: "../LICENSE.txt"
789
+ requires:
790
+ - writeScalarType
791
+ includes:
792
+ - "#include <cstdint>"
793
+ - "#include <vector>"
794
+ source_includes:
795
+ - "#include <cinttypes>"
796
+ header_stored: c58
797
+ source_stored: c59
798
+ license_stored: c2
799
+ scalar: true
800
+ external: false
801
+ parsername:
802
+ pooled:
803
+ poolindexes:
804
+ poolparsers:
805
+ poolparsertypes:
806
+ writeUInt32:
807
+ writer: true
808
+ declaration: |
809
+ template<typename Sink>
810
+ void Write(Sink& S, std::uint32_t Value, std::vector<char>& Buffer);
811
+ header: write_UInt32.hpp
812
+ source: write_UInt32.cpp
813
+ license: "../LICENSE.txt"
814
+ requires:
815
+ - writeScalarType
816
+ includes:
817
+ - "#include <cstdint>"
818
+ - "#include <vector>"
819
+ source_includes:
820
+ - "#include <cinttypes>"
821
+ header_stored: c60
822
+ source_stored: c61
823
+ license_stored: c2
824
+ scalar: true
825
+ external: false
826
+ parsername:
827
+ pooled:
828
+ poolindexes:
829
+ poolparsers:
830
+ poolparsertypes:
831
+ writeUInt64:
832
+ writer: true
833
+ declaration: |
834
+ template<typename Sink>
835
+ void Write(Sink& S, std::uint64_t Value, std::vector<char>& Buffer);
836
+ header: write_UInt64.hpp
837
+ source: write_UInt64.cpp
838
+ license: "../LICENSE.txt"
839
+ requires:
840
+ - writeScalarType
841
+ includes:
842
+ - "#include <cstdint>"
843
+ - "#include <vector>"
844
+ source_includes:
845
+ - "#include <cinttypes>"
846
+ header_stored: c62
847
+ source_stored: c63
848
+ license_stored: c2
849
+ scalar: true
850
+ external: false
851
+ parsername:
852
+ pooled:
853
+ poolindexes:
854
+ poolparsers:
855
+ poolparsertypes:
856
+ writePointer:
857
+ writer: true
858
+ scalar: false
859
+ declaration: |
860
+ template<typename Sink, typename T>
861
+ void Write(Sink& S, const T* Value, std::vector<char>& Buffer);
862
+ header: write_Pointer.hpp
863
+ license: "../LICENSE.txt"
864
+ includes:
865
+ - "#include <vector>"
866
+ header_stored: c64
867
+ source:
868
+ source_stored:
869
+ license_stored: c2
870
+ source_includes: *1
871
+ requires: *2
872
+ external: false
873
+ parsername:
874
+ pooled:
875
+ poolindexes:
876
+ poolparsers:
877
+ poolparsertypes:
878
+ writeStdVector:
879
+ writer: true
880
+ scalar: false
881
+ declaration: |
882
+ template<typename Sink, typename T>
883
+ void Write(Sink& S, const std::vector<T>& Value, std::vector<char>& Buffer);
884
+ header: write_StdVector.hpp
885
+ license: "../LICENSE.txt"
886
+ requires:
887
+ - writeForwardIterator
888
+ - writePointer
889
+ includes:
890
+ - "#include <vector>"
891
+ header_stored: c65
892
+ source:
893
+ source_stored:
894
+ license_stored: c2
895
+ source_includes: *1
896
+ external: false
897
+ parsername:
898
+ pooled:
899
+ poolindexes:
900
+ poolparsers:
901
+ poolparsertypes:
902
+ writeString:
903
+ writer: true
904
+ declaration: |
905
+ template<typename Sink>
906
+ void Write(Sink& S, const char* Begin, const char* End, std::vector<char>& Buffer);
907
+ header: write_String.hpp
908
+ source: write_String.cpp
909
+ license: "../LICENSE.txt"
910
+ requires:
911
+ - Exception
912
+ includes:
913
+ - "#include <string>"
914
+ - "#include <vector>"
915
+ - "#include <cstring>"
916
+ header_stored: c66
917
+ source_stored: c67
918
+ license_stored: c2
919
+ source_includes: *1
920
+ scalar: true
921
+ external: false
922
+ parsername:
923
+ pooled:
924
+ poolindexes:
925
+ poolparsers:
926
+ poolparsertypes:
927
+ ))
928
+ $FILECONTENTS = YAML.load(%(---
929
+ c0: |
930
+ Y2xhc3MgRXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsKcHJp
931
+ dmF0ZToKICAgIGNvbnN0IGNoYXIqIHJlYXNvbjsKCnB1YmxpYzoKICAgIEV4
932
+ Y2VwdGlvbihjb25zdCBjaGFyKiBSZWFzb24pIDogcmVhc29uKFJlYXNvbikg
933
+ eyB9CiAgICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7IHJl
934
+ dHVybiByZWFzb247IH0KfTsKCgpjbGFzcyBDb250ZXh0RXhjZXB0aW9uIDog
935
+ cHVibGljIEV4Y2VwdGlvbiB7CnByaXZhdGU6CiAgICBjaGFyIGNvbnRleHRb
936
+ NjRdOwoKcHVibGljOgogICAgQ29udGV4dEV4Y2VwdGlvbihjb25zdCBFeGNl
937
+ cHRpb24mIEUsCiAgICAgICAgY29uc3QgY2hhciogQmVnaW4sIGNvbnN0IGNo
938
+ YXIqIEN1cnJlbnQsIGNvbnN0IGNoYXIqIEVuZCk7Cn07Cg==
939
+ c1: |
940
+ Q29udGV4dEV4Y2VwdGlvbjo6Q29udGV4dEV4Y2VwdGlvbihjb25zdCBFeGNl
941
+ cHRpb24mIEUsCiAgICBjb25zdCBjaGFyKiBCZWdpbiwgY29uc3QgY2hhciog
942
+ Q3VycmVudCwgY29uc3QgY2hhciogRW5kKQogICAgOiBFeGNlcHRpb24oY29u
943
+ dGV4dCksIGNvbnRleHQoIiIpCnsKICAgIHN0ZDo6c3RybmNweShjb250ZXh0
944
+ LCBFLndoYXQoKSwgNDIpOwogICAgY29udGV4dFs0MV0gPSAnXDAnOwogICAg
945
+ c2l6ZV90IHNwYWNlID0gKDYzIC0gc3RybGVuKGNvbnRleHQpKSAvIDI7CiAg
946
+ ICBzaXplX3QgYmVmb3JlID0gKHNwYWNlIDwgQ3VycmVudCAtIEJlZ2luKSA/
947
+ IHNwYWNlIDogKEN1cnJlbnQgLSBCZWdpbik7CiAgICBzaXplX3QgYWZ0ZXIg
948
+ PSAoc3BhY2UgPCBFbmQgLSBDdXJyZW50KSA/IHNwYWNlIDogKEVuZCAtIEN1
949
+ cnJlbnQpOwogICAgc3RkOjpzdHJuY2F0KGNvbnRleHQsIEN1cnJlbnQgLSBi
950
+ ZWZvcmUsIGJlZm9yZSArIGFmdGVyICsgMSk7Cn0K
951
+ c2: |
952
+ Q29weXJpZ2h0IChjKSAyMDIwIElzbW8gS8Okcmtrw6RpbmVuCgpUaGUgVW5p
953
+ dmVyc2FsIFBlcm1pc3NpdmUgTGljZW5zZSAoVVBMKSwgVmVyc2lvbiAxLjAK
954
+ ClN1YmplY3QgdG8gdGhlIGNvbmRpdGlvbiBzZXQgZm9ydGggYmVsb3csIHBl
955
+ cm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gYW55IHBlcnNvbiBvYnRh
956
+ aW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUsIGFzc29jaWF0ZWQgZG9j
957
+ dW1lbnRhdGlvbiBhbmQvb3IgZGF0YSAoY29sbGVjdGl2ZWx5IHRoZSAiU29m
958
+ dHdhcmUiKSwgZnJlZSBvZiBjaGFyZ2UgYW5kIHVuZGVyIGFueSBhbmQgYWxs
959
+ IGNvcHlyaWdodCByaWdodHMgaW4gdGhlIFNvZnR3YXJlLCBhbmQgYW55IGFu
960
+ ZCBhbGwgcGF0ZW50IHJpZ2h0cyBvd25lZCBvciBmcmVlbHkgbGljZW5zYWJs
961
+ ZSBieSBlYWNoIGxpY2Vuc29yIGhlcmV1bmRlciBjb3ZlcmluZyBlaXRoZXIg
962
+ KGkpIHRoZSB1bm1vZGlmaWVkIFNvZnR3YXJlIGFzIGNvbnRyaWJ1dGVkIHRv
963
+ IG9yIHByb3ZpZGVkIGJ5IHN1Y2ggbGljZW5zb3IsIG9yIChpaSkgdGhlIExh
964
+ cmdlciBXb3JrcyAoYXMgZGVmaW5lZCBiZWxvdyksIHRvIGRlYWwgaW4gYm90
965
+ aAoKKGEpIHRoZSBTb2Z0d2FyZSwgYW5kCgooYikgYW55IHBpZWNlIG9mIHNv
966
+ ZnR3YXJlIGFuZC9vciBoYXJkd2FyZSBsaXN0ZWQgaW4gdGhlIGxyZ3J3cmtz
967
+ LnR4dCBmaWxlIGlmIG9uZSBpcyBpbmNsdWRlZCB3aXRoIHRoZSBTb2Z0d2Fy
968
+ ZSAoZWFjaCBhIOKAnExhcmdlciBXb3Jr4oCdIHRvIHdoaWNoIHRoZSBTb2Z0
969
+ d2FyZSBpcyBjb250cmlidXRlZCBieSBzdWNoIGxpY2Vuc29ycyksCgp3aXRo
970
+ b3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9u
971
+ IHRoZSByaWdodHMgdG8gY29weSwgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mg
972
+ b2YsIGRpc3BsYXksIHBlcmZvcm0sIGFuZCBkaXN0cmlidXRlIHRoZSBTb2Z0
973
+ d2FyZSBhbmQgbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1w
974
+ b3J0LCBleHBvcnQsIGhhdmUgbWFkZSwgYW5kIGhhdmUgc29sZCB0aGUgU29m
975
+ dHdhcmUgYW5kIHRoZSBMYXJnZXIgV29yayhzKSwgYW5kIHRvIHN1YmxpY2Vu
976
+ c2UgdGhlIGZvcmVnb2luZyByaWdodHMgb24gZWl0aGVyIHRoZXNlIG9yIG90
977
+ aGVyIHRlcm1zLgoKVGhpcyBsaWNlbnNlIGlzIHN1YmplY3QgdG8gdGhlIGZv
978
+ bGxvd2luZyBjb25kaXRpb246CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGlj
979
+ ZSBhbmQgZWl0aGVyIHRoaXMgY29tcGxldGUgcGVybWlzc2lvbiBub3RpY2Ug
980
+ b3IgYXQgYSBtaW5pbXVtIGEgcmVmZXJlbmNlIHRvIHRoZSBVUEwgbXVzdCBi
981
+ ZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRp
982
+ b25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURF
983
+ RCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBS
984
+ RVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8g
985
+ VEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZP
986
+ UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJ
987
+ TiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9M
988
+ REVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhF
989
+ UiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNU
990
+ LCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1Ig
991
+ SU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9S
992
+ IE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4K
993
+ c3: |
994
+ ZXh0ZXJuIGNvbnN0IEV4Y2VwdGlvbiBOb3RGaW5pc2hlZDsKZXh0ZXJuIGNv
995
+ bnN0IEV4Y2VwdGlvbiBJbnZhbGlkQXJyYXlTdGFydDsKZXh0ZXJuIGNvbnN0
996
+ IEV4Y2VwdGlvbiBJbnZhbGlkQXJyYXlTZXBhcmF0b3I7CmV4dGVybiBjb25z
997
+ dCBFeGNlcHRpb24gU3ViQ29udGFpbmVyU2l6ZVZhcmllczsKCnRlbXBsYXRl
998
+ PHR5cGVuYW1lIENvbnRhaW5lciwgdHlwZW5hbWUgUGFyc2VyLCBib29sIFN3
999
+ YXBzID0gZmFsc2U+CmNsYXNzIFBhcnNlQXJyYXkgOiBwdWJsaWMgVmFsdWVQ
1000
+ YXJzZXIgewpwdWJsaWM6CiAgICB0eXBlZGVmIENvbnRhaW5lciBUeXBlOwoK
1001
+ cHJpdmF0ZToKICAgIFR5cGUgb3V0OwogICAgYm9vbCBiZWdhbiwgZXhwZWN0
1002
+ X251bWJlcjsKCnB1YmxpYzoKICAgIFBhcnNlQXJyYXkoKSA6IGJlZ2FuKGZh
1003
+ bHNlKSwgZXhwZWN0X251bWJlcih0cnVlKSB7IH0KICAgIGNvbnN0IGNoYXIq
1004
+ IFBhcnNlKGNvbnN0IGNoYXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBh
1005
+ cnNlclBvb2wmIFBvb2wpCiAgICAgICAgbm9leGNlcHQoZmFsc2UpOwoKICAg
1006
+ IHZvaWQgU3dhcChUeXBlJiBBbHQpIHsKICAgICAgICBpZiAoIUZpbmlzaGVk
1007
+ KCkpCiAgICAgICAgICAgIHRocm93IE5vdEZpbmlzaGVkOwogICAgICAgIHN0
1008
+ ZDo6c3dhcChBbHQsIG91dCk7CiAgICAgICAgb3V0LnJlc2l6ZSgwKTsKICAg
1009
+ IH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lciwgdHlwZW5hbWUg
1010
+ UGFyc2VyLCBib29sIFN3YXBzPgpjb25zdCBjaGFyKiBQYXJzZUFycmF5PENv
1011
+ bnRhaW5lcixQYXJzZXIsU3dhcHM+OjpQYXJzZSgKICAgIGNvbnN0IGNoYXIq
1012
+ IEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBhcnNlclBvb2wmIFBvb2wpIG5v
1013
+ ZXhjZXB0KGZhbHNlKQp7CiAgICBjb25zdCBjaGFyKiBvcmlnaW4gPSBCZWdp
1014
+ bjsKICAgIFBhcnNlciYgcChzdGQ6OmdldDxQYXJzZXI6OlBvb2w6OkluZGV4
1015
+ PihQb29sLlBhcnNlcikpOwogICAgdHlwZW5hbWUgUGFyc2VyOjpUeXBlJiB2
1016
+ YWx1ZShzdGQ6OmdldDxQYXJzZXI6OlBvb2w6OkluZGV4PihQb29sLlZhbHVl
1017
+ KSk7CiAgICBpZiAoIXAuRmluaXNoZWQoKSkgewogICAgICAgIC8vIEluIHRo
1018
+ ZSBtaWRkbGUgb2YgcGFyc2luZyB2YWx1ZSB3aGVuIGJ1ZmZlciBlbmRlZD8K
1019
+ ICAgICAgICBCZWdpbiA9IHAuUGFyc2UoQmVnaW4sIEVuZCwgUG9vbCk7CiAg
1020
+ ICAgICAgaWYgKEJlZ2luID09IG51bGxwdHIpCiAgICAgICAgICAgIHJldHVy
1021
+ biBzZXRGaW5pc2hlZChudWxscHRyKTsKICAgICAgICBpZiBjb25zdGV4cHIg
1022
+ KFN3YXBzKSB7CiAgICAgICAgICAgIG91dC5wdXNoX2JhY2sodHlwZW5hbWUg
1023
+ UGFyc2VyOjpUeXBlKCkpOwogICAgICAgICAgICBwLlN3YXAob3V0LmJhY2so
1024
+ KSk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIG91dC5wdXNoX2JhY2so
1025
+ dmFsdWUpOwogICAgICAgIGV4cGVjdF9udW1iZXIgPSBmYWxzZTsKICAgIH0g
1026
+ ZWxzZSBpZiAoIWJlZ2FuKSB7CiAgICAgICAgLy8gRXhwZWN0ICdbJyBvbiBm
1027
+ aXJzdCBjYWxsLgogICAgICAgIGlmICgqQmVnaW4gIT0gJ1snKQogICAgICAg
1028
+ ICAgICB0aHJvdyBDb250ZXh0RXhjZXB0aW9uKEludmFsaWRBcnJheVN0YXJ0
1029
+ LCBvcmlnaW4sIEJlZ2luLCBFbmQpOwogICAgICAgIGJlZ2FuID0gZXhwZWN0
1030
+ X251bWJlciA9IHRydWU7CiAgICAgICAgQmVnaW4gPSBza2lwV2hpdGVzcGFj
1031
+ ZSgrK0JlZ2luLCBFbmQpOwogICAgICAgIGlmIChCZWdpbiA9PSBudWxscHRy
1032
+ IHx8ICEqQmVnaW4pCiAgICAgICAgICAgIHJldHVybiBzZXRGaW5pc2hlZChu
1033
+ dWxscHRyKTsKICAgICAgICBpZiAoKkJlZ2luID09ICddJykgewogICAgICAg
1034
+ ICAgICBiZWdhbiA9IGZhbHNlOyAvLyBJbiBjYXNlIGNhbGxlciByZS11c2Vz
1035
+ LiBPdXQgbXVzdCBiZSBlbXB0eS4KICAgICAgICAgICAgcmV0dXJuIHNldEZp
1036
+ bmlzaGVkKCsrQmVnaW4pOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAob3V0
1037
+ LmVtcHR5KCkpIHsKICAgICAgICBCZWdpbiA9IHNraXBXaGl0ZXNwYWNlKEJl
1038
+ Z2luLCBFbmQpOwogICAgICAgIGlmIChCZWdpbiA9PSBudWxscHRyIHx8ICEq
1039
+ QmVnaW4pCiAgICAgICAgICAgIHJldHVybiBzZXRGaW5pc2hlZChudWxscHRy
1040
+ KTsKICAgICAgICBpZiAoKkJlZ2luID09ICddJykgewogICAgICAgICAgICBi
1041
+ ZWdhbiA9IGZhbHNlOyAvLyBJbiBjYXNlIGNhbGxlciByZS11c2VzLiBPdXQg
1042
+ bXVzdCBiZSBlbXB0eS4KICAgICAgICAgICAgcmV0dXJuIHNldEZpbmlzaGVk
1043
+ KCsrQmVnaW4pOwogICAgICAgIH0KICAgIH0KICAgIHdoaWxlIChCZWdpbiAh
1044
+ PSBFbmQpIHsKICAgICAgICBpZiAoZXhwZWN0X251bWJlcikgewogICAgICAg
1045
+ ICAgICBCZWdpbiA9IHNraXBXaGl0ZXNwYWNlKEJlZ2luLCBFbmQpOwogICAg
1046
+ ICAgICAgICBpZiAoQmVnaW4gPT0gbnVsbHB0ciB8fCAhKkJlZ2luKQogICAg
1047
+ ICAgICAgICAgICAgcmV0dXJuIHNldEZpbmlzaGVkKG51bGxwdHIpOwogICAg
1048
+ ICAgICAgICAvLyBOb3cgdGhlcmUgc2hvdWxkIGJlIHRoZSBpdGVtIHRvIHBh
1049
+ cnNlLgogICAgICAgICAgICBCZWdpbiA9IHAuUGFyc2UoQmVnaW4sIEVuZCwg
1050
+ UG9vbCk7CiAgICAgICAgICAgIGlmIChCZWdpbiA9PSBudWxscHRyKQogICAg
1051
+ ICAgICAgICAgICAgcmV0dXJuIHNldEZpbmlzaGVkKG51bGxwdHIpOwogICAg
1052
+ ICAgICAgICBvdXQucHVzaF9iYWNrKHZhbHVlKTsKICAgICAgICAgICAgZXhw
1053
+ ZWN0X251bWJlciA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICAvLyBDb21t
1054
+ YSwgbWF5YmUgc3Vycm91bmRlZCBieSBzcGFjZXMuCiAgICAgICAgaWYgKCpC
1055
+ ZWdpbiA9PSAnLCcpIC8vIE1vc3QgbGlrZWx5IHVubGVzcyBwcmV0dGlmaWVk
1056
+ LgogICAgICAgICAgICArK0JlZ2luOwogICAgICAgIGVsc2UgewogICAgICAg
1057
+ ICAgICBCZWdpbiA9IHNraXBXaGl0ZXNwYWNlKEJlZ2luLCBFbmQpOwogICAg
1058
+ ICAgICAgICBpZiAoQmVnaW4gPT0gbnVsbHB0ciB8fCAhKkJlZ2luKQogICAg
1059
+ ICAgICAgICAgICAgcmV0dXJuIHNldEZpbmlzaGVkKG51bGxwdHIpOwogICAg
1060
+ ICAgICAgICBpZiAoKkJlZ2luID09ICddJykgewogICAgICAgICAgICAgICAg
1061
+ YmVnYW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHJldHVybiBzZXRGaW5p
1062
+ c2hlZCgrK0JlZ2luKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAo
1063
+ KkJlZ2luICE9ICcsJykKICAgICAgICAgICAgICAgIHRocm93IENvbnRleHRF
1064
+ eGNlcHRpb24oSW52YWxpZEFycmF5U2VwYXJhdG9yLCBvcmlnaW4sIEJlZ2lu
1065
+ LCBFbmQpOwogICAgICAgICAgICBCZWdpbisrOwogICAgICAgIH0KICAgICAg
1066
+ ICBleHBlY3RfbnVtYmVyID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBzZXRG
1067
+ aW5pc2hlZChudWxscHRyKTsKfQoKCnRlbXBsYXRlPHR5cGVuYW1lIENvbnRh
1068
+ aW5lciwgdHlwZW5hbWUgUGFyc2VyLCBib29sIFNhbWVTaXplID0gZmFsc2U+
1069
+ CmNsYXNzIFBhcnNlQ29udGFpbmVyQXJyYXkgOiBwdWJsaWMgVmFsdWVQYXJz
1070
+ ZXIgewpwdWJsaWM6CiAgICB0eXBlZGVmIENvbnRhaW5lciBUeXBlOwoKcHJp
1071
+ dmF0ZToKICAgIFBhcnNlciBwOwogICAgVHlwZSBvdXQ7CiAgICBib29sIGJl
1072
+ Z2FuLCBleHBlY3RfaXRlbTsKCnB1YmxpYzoKICAgIFBhcnNlQ29udGFpbmVy
1073
+ QXJyYXkoKSA6IGJlZ2FuKGZhbHNlKSwgZXhwZWN0X2l0ZW0odHJ1ZSkgeyB9
1074
+ CiAgICBjb25zdCBjaGFyKiBQYXJzZShjb25zdCBjaGFyKiBCZWdpbiwgY29u
1075
+ c3QgY2hhciogRW5kLCBQYXJzZXJQb29sJiBQb29sKQogICAgICAgIG5vZXhj
1076
+ ZXB0KGZhbHNlKTsKCiAgICB2b2lkIFN3YXAoVHlwZSYgQWx0KSB7CiAgICAg
1077
+ ICAgaWYgKCFGaW5pc2hlZCgpKQogICAgICAgICAgICB0aHJvdyBOb3RGaW5p
1078
+ c2hlZDsKICAgICAgICBzdGQ6OnN3YXAoQWx0LCBvdXQpOwogICAgICAgIG91
1079
+ dC5yZXNpemUoMCk7CiAgICB9Cn07CgoKdGVtcGxhdGU8dHlwZW5hbWUgQ29u
1080
+ dGFpbmVyLCB0eXBlbmFtZSBQYXJzZXIsIGJvb2wgU2FtZVNpemU+CmNvbnN0
1081
+ IGNoYXIqIFBhcnNlQ29udGFpbmVyQXJyYXk8Q29udGFpbmVyLFBhcnNlcixT
1082
+ YW1lU2l6ZT46OlBhcnNlKAogICAgY29uc3QgY2hhciogQmVnaW4sIGNvbnN0
1083
+ IGNoYXIqIEVuZCwgUGFyc2VyUG9vbCYgUG9vbCkgbm9leGNlcHQoZmFsc2Up
1084
+ CnsKICAgIGNvbnN0IGNoYXIqIG9yaWdpbiA9IEJlZ2luOwogICAgaWYgKCFw
1085
+ LkZpbmlzaGVkKCkpIHsKICAgICAgICAvLyBJbiB0aGUgbWlkZGxlIG9mIHBh
1086
+ cnNpbmcgdmFsdWUgd2hlbiBidWZmZXIgZW5kZWQ/CiAgICAgICAgQmVnaW4g
1087
+ PSBwLlBhcnNlKEJlZ2luLCBFbmQsIFBvb2wpOwogICAgICAgIGlmIChCZWdp
1088
+ biA9PSBudWxscHRyKQogICAgICAgICAgICByZXR1cm4gc2V0RmluaXNoZWQo
1089
+ bnVsbHB0cik7CiAgICAgICAgb3V0LnB1c2hfYmFjayh0eXBlbmFtZSBQYXJz
1090
+ ZXI6OlR5cGUoKSk7CiAgICAgICAgcC5Td2FwKG91dC5iYWNrKCkpOwogICAg
1091
+ ICAgIGlmIGNvbnN0ZXhwciAoU2FtZVNpemUpIHsKICAgICAgICAgICAgaWYg
1092
+ KG91dC5mcm9udCgpLnNpemUoKSAhPSBvdXQuYmFjaygpLnNpemUoKSkKICAg
1093
+ ICAgICAgICAgICAgIHRocm93IFN1YkNvbnRhaW5lclNpemVWYXJpZXM7CiAg
1094
+ ICAgICAgfQogICAgICAgIGV4cGVjdF9pdGVtID0gZmFsc2U7CiAgICB9IGVs
1095
+ c2UgaWYgKCFiZWdhbikgewogICAgICAgIC8vIEV4cGVjdCAnWycgb24gZmly
1096
+ c3QgY2FsbC4KICAgICAgICBpZiAoKkJlZ2luICE9ICdbJykKICAgICAgICAg
1097
+ ICAgdGhyb3cgQ29udGV4dEV4Y2VwdGlvbihJbnZhbGlkQXJyYXlTdGFydCwg
1098
+ b3JpZ2luLCBCZWdpbiwgRW5kKTsKICAgICAgICBiZWdhbiA9IGV4cGVjdF9p
1099
+ dGVtID0gdHJ1ZTsKICAgICAgICBCZWdpbiA9IHNraXBXaGl0ZXNwYWNlKCsr
1100
+ QmVnaW4sIEVuZCk7CiAgICAgICAgaWYgKEJlZ2luID09IG51bGxwdHIgfHwg
1101
+ ISpCZWdpbikKICAgICAgICAgICAgcmV0dXJuIHNldEZpbmlzaGVkKG51bGxw
1102
+ dHIpOwogICAgICAgIGlmICgqQmVnaW4gPT0gJ10nKSB7CiAgICAgICAgICAg
1103
+ IGJlZ2FuID0gZmFsc2U7IC8vIEluIGNhc2UgY2FsbGVyIHJlLXVzZXMuIE91
1104
+ dCBtdXN0IGJlIGVtcHR5LgogICAgICAgICAgICByZXR1cm4gc2V0RmluaXNo
1105
+ ZWQoKytCZWdpbik7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChvdXQuZW1w
1106
+ dHkoKSkgewogICAgICAgIEJlZ2luID0gc2tpcFdoaXRlc3BhY2UoQmVnaW4s
1107
+ IEVuZCk7CiAgICAgICAgaWYgKEJlZ2luID09IG51bGxwdHIgfHwgISpCZWdp
1108
+ bikKICAgICAgICAgICAgcmV0dXJuIHNldEZpbmlzaGVkKG51bGxwdHIpOwog
1109
+ ICAgICAgIGlmICgqQmVnaW4gPT0gJ10nKSB7CiAgICAgICAgICAgIGJlZ2Fu
1110
+ ID0gZmFsc2U7IC8vIEluIGNhc2UgY2FsbGVyIHJlLXVzZXMuIE91dCBtdXN0
1111
+ IGJlIGVtcHR5LgogICAgICAgICAgICByZXR1cm4gc2V0RmluaXNoZWQoKytC
1112
+ ZWdpbik7CiAgICAgICAgfQogICAgfQogICAgd2hpbGUgKEJlZ2luICE9IEVu
1113
+ ZCkgewogICAgICAgIGlmIChleHBlY3RfaXRlbSkgewogICAgICAgICAgICBC
1114
+ ZWdpbiA9IHNraXBXaGl0ZXNwYWNlKEJlZ2luLCBFbmQpOwogICAgICAgICAg
1115
+ ICBpZiAoQmVnaW4gPT0gbnVsbHB0ciB8fCAhKkJlZ2luKQogICAgICAgICAg
1116
+ ICAgICAgcmV0dXJuIHNldEZpbmlzaGVkKG51bGxwdHIpOwogICAgICAgICAg
1117
+ ICAvLyBOb3cgdGhlcmUgc2hvdWxkIGJlIHRoZSBpdGVtIHRvIHBhcnNlLgog
1118
+ ICAgICAgICAgICBCZWdpbiA9IHAuUGFyc2UoQmVnaW4sIEVuZCwgUG9vbCk7
1119
+ CiAgICAgICAgICAgIGlmIChCZWdpbiA9PSBudWxscHRyKQogICAgICAgICAg
1120
+ ICAgICAgcmV0dXJuIHNldEZpbmlzaGVkKG51bGxwdHIpOwogICAgICAgICAg
1121
+ ICBvdXQucHVzaF9iYWNrKHR5cGVuYW1lIFBhcnNlcjo6VHlwZSgpKTsKICAg
1122
+ ICAgICAgICAgcC5Td2FwKG91dC5iYWNrKCkpOwogICAgICAgICAgICBpZiBj
1123
+ b25zdGV4cHIgKFNhbWVTaXplKSB7CiAgICAgICAgICAgICAgICBpZiAob3V0
1124
+ LmZyb250KCkuc2l6ZSgpICE9IG91dC5iYWNrKCkuc2l6ZSgpKQogICAgICAg
1125
+ ICAgICAgICAgICAgIHRocm93IFN1YkNvbnRhaW5lclNpemVWYXJpZXM7CiAg
1126
+ ICAgICAgICAgIH0KICAgICAgICAgICAgZXhwZWN0X2l0ZW0gPSBmYWxzZTsK
1127
+ ICAgICAgICB9CiAgICAgICAgLy8gQ29tbWEsIG1heWJlIHN1cnJvdW5kZWQg
1128
+ Ynkgc3BhY2VzLgogICAgICAgIGlmICgqQmVnaW4gPT0gJywnKSAvLyBNb3N0
1129
+ IGxpa2VseSB1bmxlc3MgcHJldHRpZmllZC4KICAgICAgICAgICAgKytCZWdp
1130
+ bjsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgQmVnaW4gPSBza2lwV2hp
1131
+ dGVzcGFjZShCZWdpbiwgRW5kKTsKICAgICAgICAgICAgaWYgKEJlZ2luID09
1132
+ IG51bGxwdHIgfHwgISpCZWdpbikKICAgICAgICAgICAgICAgIHJldHVybiBz
1133
+ ZXRGaW5pc2hlZChudWxscHRyKTsKICAgICAgICAgICAgaWYgKCpCZWdpbiA9
1134
+ PSAnXScpIHsKICAgICAgICAgICAgICAgIGJlZ2FuID0gZmFsc2U7CiAgICAg
1135
+ ICAgICAgICAgICByZXR1cm4gc2V0RmluaXNoZWQoKytCZWdpbik7CiAgICAg
1136
+ ICAgICAgIH0KICAgICAgICAgICAgaWYgKCpCZWdpbiAhPSAnLCcpCiAgICAg
1137
+ ICAgICAgICAgICB0aHJvdyBDb250ZXh0RXhjZXB0aW9uKEludmFsaWRBcnJh
1138
+ eVNlcGFyYXRvciwgb3JpZ2luLCBCZWdpbiwgRW5kKTsKICAgICAgICAgICAg
1139
+ QmVnaW4rKzsKICAgICAgICB9CiAgICAgICAgZXhwZWN0X2l0ZW0gPSB0cnVl
1140
+ OwogICAgfQogICAgcmV0dXJuIHNldEZpbmlzaGVkKG51bGxwdHIpOwp9Cg==
1141
+ c4: |
1142
+ Y29uc3QgRXhjZXB0aW9uIHNwZWNqc29uOjpOb3RGaW5pc2hlZCgiSXRlbSBu
1143
+ b3QgZmluaXNoZWQuIik7CmNvbnN0IEV4Y2VwdGlvbiBzcGVjanNvbjo6SW52
1144
+ YWxpZEFycmF5U3RhcnQoIkV4cGVjdGVkICdbJyIpOwpjb25zdCBFeGNlcHRp
1145
+ b24gc3BlY2pzb246OkludmFsaWRBcnJheVNlcGFyYXRvcigiQXJyYXksIGV4
1146
+ cGVjdGVkICcsJyIpOwpjb25zdCBFeGNlcHRpb24gc3BlY2pzb246OlN1YkNv
1147
+ bnRhaW5lclNpemVWYXJpZXMoIlN1Yi1jb250YWluZXIgc2l6ZSB2YXJpZXMu
1148
+ Iik7Cg==
1149
+ c5: |
1150
+ ZXh0ZXJuIGNvbnN0IEV4Y2VwdGlvbiBJbnZhbGlkS2V5OwpleHRlcm4gY29u
1151
+ c3QgRXhjZXB0aW9uIFJlcXVpcmVkS2V5Tm90R2l2ZW47CmV4dGVybiBjb25z
1152
+ dCBFeGNlcHRpb24gSW52YWxpZE9iamVjdFN0YXJ0OwpleHRlcm4gY29uc3Qg
1153
+ RXhjZXB0aW9uIEludmFsaWRLZXlTZXBhcmF0b3I7CmV4dGVybiBjb25zdCBF
1154
+ eGNlcHRpb24gSW52YWxpZFZhbHVlU2VwYXJhdG9yOwoKCmNsYXNzIFZhbHVl
1155
+ U3RvcmU7CgovLyBIZWxwZXIgY2xhc3MgZm9yIGltcGxlbWVudGF0aW9uIG9m
1156
+ IEtleVZhbHVlcyB0ZW1wbGF0ZS4KLy8gQ29tbW9uIGludGVyZmFjZSBmb3Ig
1157
+ bG9vcHMgb3ZlciB0dXBsZSBtZW1iZXJzIGV0Yy4KY2xhc3MgU2Nhbm5pbmdL
1158
+ ZXlWYWx1ZSB7CnByb3RlY3RlZDoKICAgIGJvb2wgZ2l2ZW47CiAgICB2b2lk
1159
+ IEdpdmUoVmFsdWVTdG9yZSogVlMpOwoKcHVibGljOgogICAgU2Nhbm5pbmdL
1160
+ ZXlWYWx1ZSgpIDogZ2l2ZW4oZmFsc2UpIHsgfQogICAgdmlydHVhbCB+U2Nh
1161
+ bm5pbmdLZXlWYWx1ZSgpOwogICAgdmlydHVhbCBWYWx1ZVBhcnNlciYgU2Nh
1162
+ bm5lcihQYXJzZXJQb29sJiBQb29sKSA9IDA7CiAgICB2aXJ0dWFsIGNvbnN0
1163
+ IGNoYXIqIEtleSgpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBTd2Fw
1164
+ KFZhbHVlU3RvcmUqIFZTLCBQYXJzZXJQb29sJiBQb29sKSA9IDA7CiAgICB2
1165
+ aXJ0dWFsIGJvb2wgUmVxdWlyZWQoKSBjb25zdCA9IDA7CiAgICBib29sIEdp
1166
+ dmVuKCkgY29uc3QgeyByZXR1cm4gZ2l2ZW47IH0KfTsKCi8vIEhlbHBlciBj
1167
+ bGFzcyBmb3IgaW1wbGVtZW50YXRpb24gb2YgS2V5VmFsdWVzIHRlbXBsYXRl
1168
+ Lgp0ZW1wbGF0ZTxjb25zdCBjaGFyKiBLZXlTdHJpbmcsIHR5cGVuYW1lIFBh
1169
+ cnNlcj4KY2xhc3MgS2V5VmFsdWUgOiBwdWJsaWMgU2Nhbm5pbmdLZXlWYWx1
1170
+ ZSB7CnB1YmxpYzoKICAgIHR5cGVkZWYgdHlwZW5hbWUgUGFyc2VyOjpUeXBl
1171
+ IFR5cGU7CiAgICBjb25zdCBjaGFyKiBLZXkoKSBjb25zdCB7IHJldHVybiBL
1172
+ ZXlTdHJpbmc7IH0KICAgIHZvaWQgU3dhcChWYWx1ZVN0b3JlKiBWUywgUGFy
1173
+ c2VyUG9vbCYgUG9vbCk7CgogICAgdm9pZCBTd2FwKFR5cGUmIEFsdCwgUGFy
1174
+ c2VyUG9vbCYgUG9vbCkgewogICAgICAgIHN0ZDo6c3dhcChBbHQsIHN0ZDo6
1175
+ Z2V0PFBhcnNlcjo6UG9vbDo6SW5kZXg+KFBvb2wuVmFsdWUpKTsKICAgICAg
1176
+ ICBnaXZlbiA9IGZhbHNlOwogICAgfQoKICAgIFZhbHVlUGFyc2VyJiBTY2Fu
1177
+ bmVyKFBhcnNlclBvb2wmIFBvb2wpIHsKICAgICAgICBnaXZlbiA9IHRydWU7
1178
+ CiAgICAgICAgcmV0dXJuIHN0ZDo6Z2V0PFBhcnNlcjo6UG9vbDo6SW5kZXg+
1179
+ KFBvb2wuUGFyc2VyKTsKICAgIH0KCiAgICBib29sIFJlcXVpcmVkKCkgY29u
1180
+ c3QgeyByZXR1cm4gZmFsc2U7IH0KfTsKCi8vIEhlbHBlciBjbGFzcyBmb3Ig
1181
+ aW1wbGVtZW50YXRpb24gb2YgS2V5VmFsdWVzIHRlbXBsYXRlLgp0ZW1wbGF0
1182
+ ZTxjb25zdCBjaGFyKiBLZXlTdHJpbmcsIHR5cGVuYW1lIFBhcnNlcj4KY2xh
1183
+ c3MgUmVxdWlyZWRLZXlWYWx1ZSA6IHB1YmxpYyBLZXlWYWx1ZTxLZXlTdHJp
1184
+ bmcsUGFyc2VyPiB7CnB1YmxpYzoKICAgIGJvb2wgUmVxdWlyZWQoKSBjb25z
1185
+ dCB7IHJldHVybiB0cnVlOyB9Cn07CgovLyBIZWxwZXIgY2xhc3MgZm9yIGlt
1186
+ cGxlbWVudGF0aW9uIG9mIEtleVZhbHVlcyB0ZW1wbGF0ZS4KdGVtcGxhdGU8
1187
+ Y29uc3QgY2hhciogS2V5U3RyaW5nLCB0eXBlbmFtZSBQYXJzZXI+CmNsYXNz
1188
+ IEtleUNvbnRhaW5lclZhbHVlIDogcHVibGljIFNjYW5uaW5nS2V5VmFsdWUg
1189
+ ewpwcml2YXRlOgogICAgUGFyc2VyIHA7CgpwdWJsaWM6CiAgICB0eXBlZGVm
1190
+ IHR5cGVuYW1lIFBhcnNlcjo6VHlwZSBUeXBlOwogICAgY29uc3QgY2hhciog
1191
+ S2V5KCkgY29uc3QgeyByZXR1cm4gS2V5U3RyaW5nOyB9CiAgICB2b2lkIFN3
1192
+ YXAoVmFsdWVTdG9yZSogVlMsIFBhcnNlclBvb2wmIFBvb2wpOwoKICAgIHZv
1193
+ aWQgU3dhcChUeXBlJiBBbHQsIFBhcnNlclBvb2wmIFBvb2wpIHsKICAgICAg
1194
+ ICBwLlN3YXAoQWx0KTsKICAgICAgICBnaXZlbiA9IGZhbHNlOwogICAgfQoK
1195
+ ICAgIFZhbHVlUGFyc2VyJiBTY2FubmVyKFBhcnNlclBvb2wmIFBvb2wpIHsK
1196
+ ICAgICAgICBnaXZlbiA9IHRydWU7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9
1197
+ CgogICAgYm9vbCBSZXF1aXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9
1198
+ Cn07CgovLyBIZWxwZXIgY2xhc3MgZm9yIGltcGxlbWVudGF0aW9uIG9mIEtl
1199
+ eVZhbHVlcyB0ZW1wbGF0ZS4KdGVtcGxhdGU8Y29uc3QgY2hhciogS2V5U3Ry
1200
+ aW5nLCB0eXBlbmFtZSBQYXJzZXI+CmNsYXNzIFJlcXVpcmVkS2V5Q29udGFp
1201
+ bmVyVmFsdWUgOiBwdWJsaWMgS2V5Q29udGFpbmVyVmFsdWU8S2V5U3RyaW5n
1202
+ LFBhcnNlcj4gewogICAgYm9vbCBSZXF1aXJlZCgpIGNvbnN0IHsgcmV0dXJu
1203
+ IHRydWU7IH0KfTsKCgovLyBIZWxwZXIgY2xhc3MgZm9yIGltcGxlbWVudGF0
1204
+ aW9uIG9mIFBhcnNlT2JqZWN0IGNsYXNzLgp0ZW1wbGF0ZTxjbGFzcyAuLi4g
1205
+ RmllbGRzPgpjbGFzcyBLZXlWYWx1ZXMgewpwcml2YXRlOgogICAgc3RkOjp2
1206
+ ZWN0b3I8U2Nhbm5pbmdLZXlWYWx1ZSo+IHB0cnM7CgogICAgdGVtcGxhdGU8
1207
+ dHlwZW5hbWUgRnVuY09iaiwgdHlwZW5hbWUgVHVwbGUsIHNpemVfdC4uLiBJ
1208
+ ZHhTZXE+CiAgICB2b2lkIGFwcGx5X3RvX2VhY2goRnVuY09iaiYmIGZvLCBU
1209
+ dXBsZSYmIHQsIHN0ZDo6aW5kZXhfc2VxdWVuY2U8SWR4U2VxLi4uPikKICAg
1210
+ IHsKICAgICAgICBpbnQgYVtdID0gewogICAgICAgICAgICAoZm8oc3RkOjpn
1211
+ ZXQ8SWR4U2VxPihzdGQ6OmZvcndhcmQ8VHVwbGU+KHQpKSksIHZvaWQoKSwg
1212
+ MCkgLi4uCiAgICAgICAgfTsKICAgICAgICAodm9pZClhOyAvLyBTdXBwcmVz
1213
+ c2VzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nLgogICAgfQoKICAgIGNsYXNz
1214
+ IFB1c2hlciB7CiAgICBwcml2YXRlOgogICAgICAgIHN0ZDo6dmVjdG9yPFNj
1215
+ YW5uaW5nS2V5VmFsdWUqPiYgdGd0OwogICAgcHVibGljOgogICAgICAgIFB1
1216
+ c2hlcihzdGQ6OnZlY3RvcjxTY2FubmluZ0tleVZhbHVlKj4mIFRhcmdldCkg
1217
+ OiB0Z3QoVGFyZ2V0KSB7IH0KICAgICAgICB2b2lkIG9wZXJhdG9yKCkoU2Nh
1218
+ bm5pbmdLZXlWYWx1ZSYgU0tWKSB7IHRndC5wdXNoX2JhY2soJlNLVik7IH0K
1219
+ ICAgIH07CgpwdWJsaWM6CiAgICBzdGQ6OnR1cGxlPEZpZWxkcy4uLj4gZmll
1220
+ bGRzOwoKICAgIEtleVZhbHVlcygpIHsKICAgICAgICBQdXNoZXIgcHNoKHB0
1221
+ cnMpOwogICAgICAgIGFwcGx5X3RvX2VhY2gocHNoLCBmaWVsZHMsCiAgICAg
1222
+ ICAgICAgIHN0ZDo6bWFrZV9pbmRleF9zZXF1ZW5jZTxzdGQ6OnR1cGxlX3Np
1223
+ emU8ZGVjbHR5cGUoZmllbGRzKT46OnZhbHVlPgogICAgICAgICAgICAgICAg
1224
+ e30pOwogICAgfQoKICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4g
1225
+ c3RkOjp0dXBsZV9zaXplPGRlY2x0eXBlKGZpZWxkcyk+Ojp2YWx1ZTsgfQog
1226
+ ICAgVmFsdWVQYXJzZXImIFNjYW5uZXIoc2l6ZV90IEluZGV4LCBQYXJzZXJQ
1227
+ b29sJiBQb29sKSB7CiAgICAgICAgcmV0dXJuIHB0cnNbSW5kZXhdLT5TY2Fu
1228
+ bmVyKFBvb2wpOwogICAgfQogICAgU2Nhbm5pbmdLZXlWYWx1ZSogS2V5VmFs
1229
+ dWUoc2l6ZV90IEluZGV4KSB7IHJldHVybiBwdHJzW0luZGV4XTsgfQp9OwoK
1230
+ Ly8gQW5vdGhlciBkZXJpdmVkIGNsYXNzIGFkZHMgYWxsIHRoZSBjb252ZW5p
1231
+ ZW5jZSBtZXRob2RzIHRoYXQgbWFwIHRvIGluZGV4LgoKLy8gQmFzZSBjbGFz
1232
+ cyBmb3IgcGFyc2UtdGltZSB0cmFja2luZyBvZiBnaXZlbiBrZXlzIGFuZCB0
1233
+ aGVpciB2YWx1ZXMuCmNsYXNzIFZhbHVlU3RvcmUgewpwcm90ZWN0ZWQ6CiAg
1234
+ ICBib29sIGdpdmVuOwoKcHJpdmF0ZToKICAgIHZvaWQgR2l2ZSgpOwogICAg
1235
+ ZnJpZW5kIGNsYXNzIFNjYW5uaW5nS2V5VmFsdWU7CgpwdWJsaWM6CiAgICBW
1236
+ YWx1ZVN0b3JlKCkgOiBnaXZlbihmYWxzZSkgeyB9CiAgICBib29sIEdpdmVu
1237
+ KCkgY29uc3QgeyByZXR1cm4gZ2l2ZW47IH0KfTsKCnRlbXBsYXRlPHR5cGVu
1238
+ YW1lIFBhcnNlcj4KY2xhc3MgVmFsdWUgOiBwdWJsaWMgVmFsdWVTdG9yZSB7
1239
+ CnB1YmxpYzoKICAgIHR5cGVkZWYgdHlwZW5hbWUgUGFyc2VyOjpUeXBlIFR5
1240
+ cGU7CiAgICBUeXBlIHZhbHVlOwp9OwoKdGVtcGxhdGU8Y2xhc3MgLi4uIEZp
1241
+ ZWxkcz4KY2xhc3MgTmFtZWxlc3NWYWx1ZXMgewpwcml2YXRlOgogICAgc3Rk
1242
+ Ojp2ZWN0b3I8VmFsdWVTdG9yZSo+IHB0cnM7CgogICAgdGVtcGxhdGU8dHlw
1243
+ ZW5hbWUgRnVuY09iaiwgdHlwZW5hbWUgVHVwbGUsIHNpemVfdC4uLiBJZHhT
1244
+ ZXE+CiAgICB2b2lkIGFwcGx5X3RvX2VhY2goRnVuY09iaiYmIGZvLCBUdXBs
1245
+ ZSYmIHQsIHN0ZDo6aW5kZXhfc2VxdWVuY2U8SWR4U2VxLi4uPikKICAgIHsK
1246
+ ICAgICAgICBpbnQgYVtdID0gewogICAgICAgICAgICAoZm8oc3RkOjpnZXQ8
1247
+ SWR4U2VxPihzdGQ6OmZvcndhcmQ8VHVwbGU+KHQpKSksIHZvaWQoKSwgMCkg
1248
+ Li4uCiAgICAgICAgfTsKICAgICAgICAodm9pZClhOyAvLyBTdXBwcmVzc2Vz
1249
+ IHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nLgogICAgfQoKICAgIGNsYXNzIFB1
1250
+ c2hlciB7CiAgICBwcml2YXRlOgogICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVl
1251
+ U3RvcmUqPiYgdGd0OwogICAgcHVibGljOgogICAgICAgIFB1c2hlcihzdGQ6
1252
+ OnZlY3RvcjxWYWx1ZVN0b3JlKj4mIFRhcmdldCkgOiB0Z3QoVGFyZ2V0KSB7
1253
+ IH0KICAgICAgICB2b2lkIG9wZXJhdG9yKCkoVmFsdWVTdG9yZSYgVlMpIHsg
1254
+ dGd0LnB1c2hfYmFjaygmVlMpOyB9CiAgICB9OwoKcHVibGljOgogICAgc3Rk
1255
+ Ojp0dXBsZTxGaWVsZHMuLi4+IGZpZWxkczsKCiAgICBOYW1lbGVzc1ZhbHVl
1256
+ cygpIHsKICAgICAgICBQdXNoZXIgcHNoKHB0cnMpOwogICAgICAgIGFwcGx5
1257
+ X3RvX2VhY2gocHNoLCBmaWVsZHMsIHN0ZDo6bWFrZV9pbmRleF9zZXF1ZW5j
1258
+ ZTxzdGQ6OnR1cGxlX3NpemU8ZGVjbHR5cGUoZmllbGRzKT46OnZhbHVlPiB7
1259
+ fSk7CiAgICB9CgogICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBz
1260
+ dGQ6OnR1cGxlX3NpemU8ZGVjbHR5cGUoZmllbGRzKT46OnZhbHVlOyB9CiAg
1261
+ ICBWYWx1ZVN0b3JlKiBvcGVyYXRvcltdKHNpemVfdCBJbmRleCkgeyByZXR1
1262
+ cm4gcHRyc1tJbmRleF07IH0KfTsKCnRlbXBsYXRlPGNvbnN0IGNoYXIqIEtl
1263
+ eVN0cmluZywgdHlwZW5hbWUgUGFyc2VyPgp2b2lkIEtleVZhbHVlPEtleVN0
1264
+ cmluZyxQYXJzZXI+OjpTd2FwKFZhbHVlU3RvcmUqIFZTLCBQYXJzZXJQb29s
1265
+ JiBQb29sKSB7CiAgICBWYWx1ZTxQYXJzZXI+KiBkc3Qoc3RhdGljX2Nhc3Q8
1266
+ VmFsdWU8UGFyc2VyPio+KFZTKSk7CiAgICBzdGQ6OnN3YXAoZHN0LT52YWx1
1267
+ ZSwgc3RkOjpnZXQ8UGFyc2VyOjpQb29sOjpJbmRleD4oUG9vbC5WYWx1ZSkp
1268
+ OwogICAgR2l2ZShWUyk7Cn0KCnRlbXBsYXRlPGNvbnN0IGNoYXIqIEtleVN0
1269
+ cmluZywgdHlwZW5hbWUgUGFyc2VyPgp2b2lkIEtleUNvbnRhaW5lclZhbHVl
1270
+ PEtleVN0cmluZyxQYXJzZXI+OjpTd2FwKFZhbHVlU3RvcmUqIFZTLCBQYXJz
1271
+ ZXJQb29sJiBQb29sKQp7CiAgICBWYWx1ZTxQYXJzZXI+KiBkc3Qoc3RhdGlj
1272
+ X2Nhc3Q8VmFsdWU8UGFyc2VyPio+KFZTKSk7CiAgICBwLlN3YXAoZHN0LT52
1273
+ YWx1ZSk7CiAgICBHaXZlKFZTKTsKfQoKLy8gVGhlIFZhbHVlcyBjbGFzcyB1
1274
+ c2VkIGJ5IHRoZSB0ZW1wbGF0ZSBzaG91bGQgYmUgZGVyaXZlZCBmcm9tIE5h
1275
+ bWVsZXNzVmFsdWVzCi8vIGFuZCBpdCBhZGRzIHdheSB0byBhY2Nlc3MgdGhl
1276
+ IGZpZWxkcyB1c2luZyBzZW5zaWJseSBuYW1lZCBtZXRob2RzLgoKdGVtcGxh
1277
+ dGU8dHlwZW5hbWUgS2V5VmFsdWVzLCB0eXBlbmFtZSBWYWx1ZXM+CmNsYXNz
1278
+ IFBhcnNlT2JqZWN0IDogcHVibGljIFZhbHVlUGFyc2VyIHsKcHJpdmF0ZToK
1279
+ ICAgIEtleVZhbHVlcyBwYXJzZXJzOwogICAgVmFsdWVzIG91dDsKICAgIGlu
1280
+ dCBhY3RpdmF0aW5nLCBhY3RpdmU7CiAgICBlbnVtIFN0YXRlIHsKICAgICAg
1281
+ ICBOb3RTdGFydGVkLAogICAgICAgIFByZUtleSwKICAgICAgICBFeHBlY3RL
1282
+ ZXksCiAgICAgICAgUHJlQ29sb24sCiAgICAgICAgRXhwZWN0Q29sb24sCiAg
1283
+ ICAgICAgUHJlVmFsdWUsCiAgICAgICAgRXhwZWN0VmFsdWUsCiAgICAgICAg
1284
+ UHJlQ29tbWEsCiAgICAgICAgRXhwZWN0Q29tbWEKICAgIH07CiAgICBTdGF0
1285
+ ZSBzdGF0ZTsKCiAgICB2b2lkIHNldEFjdGl2YXRpbmcoY29uc3Qgc3RkOjpz
1286
+ dHJpbmcmIEluY29taW5nKSB7CiAgICAgICAgZm9yIChzaXplX3QgayA9IDA7
1287
+ IGsgPCBwYXJzZXJzLnNpemUoKTsgKytrKQogICAgICAgICAgICBpZiAoc3Ry
1288
+ Y21wKEluY29taW5nLmNfc3RyKCksIHBhcnNlcnMuS2V5VmFsdWUoayktPktl
1289
+ eSgpKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBhY3RpdmF0aW5nID0gc3Rh
1290
+ dGljX2Nhc3Q8aW50PihrKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAg
1291
+ ICAgICAgICAgfQogICAgICAgIHRocm93IEludmFsaWRLZXk7CiAgICB9Cgog
1292
+ ICAgY29uc3QgY2hhciogY2hlY2tQYXNzZWQoY29uc3QgY2hhciogUHRyKSBu
1293
+ b2V4Y2VwdChmYWxzZSkgewogICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBr
1294
+ IDwgb3V0LnNpemUoKTsgKytrKSB7CiAgICAgICAgICAgIFNjYW5uaW5nS2V5
1295
+ VmFsdWUqIHNrdiA9IHBhcnNlcnMuS2V5VmFsdWUoayk7CiAgICAgICAgICAg
1296
+ IFZhbHVlU3RvcmUqIHZzID0gb3V0W2tdOwogICAgICAgICAgICBpZiAoc2t2
1297
+ LT5SZXF1aXJlZCgpICYmICF2cy0+R2l2ZW4oKSkKICAgICAgICAgICAgICAg
1298
+ IHRocm93IFJlcXVpcmVkS2V5Tm90R2l2ZW47CiAgICAgICAgfQogICAgICAg
1299
+ IHN0YXRlID0gTm90U3RhcnRlZDsKICAgICAgICBhY3RpdmF0aW5nID0gLTE7
1300
+ CiAgICAgICAgYWN0aXZlID0gLTE7CiAgICAgICAgcmV0dXJuIHNldEZpbmlz
1301
+ aGVkKFB0cik7CiAgICB9CgpwdWJsaWM6CiAgICB0eXBlZGVmIGRlY2x0eXBl
1302
+ KG91dC5maWVsZHMpIFR5cGU7CgogICAgUGFyc2VPYmplY3QoKSA6IGFjdGl2
1303
+ YXRpbmcoLTEpLCBhY3RpdmUoLTEpLCBzdGF0ZShOb3RTdGFydGVkKSB7IH0K
1304
+ CiAgICBjb25zdCBjaGFyKiBQYXJzZShjb25zdCBjaGFyKiBCZWdpbiwgY29u
1305
+ c3QgY2hhciogRW5kLCBQYXJzZXJQb29sJiBQb29sKQogICAgICAgIG5vZXhj
1306
+ ZXB0KGZhbHNlKTsKCiAgICB2b2lkIFN3YXAoVHlwZSYgQWx0KSB7CiAgICAg
1307
+ ICAgc3RkOjpzd2FwKEFsdCwgb3V0LmZpZWxkcyk7CiAgICAgICAgb3V0LmZp
1308
+ ZWxkcyA9IFR5cGUoKTsKICAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIEtl
1309
+ eVZhbHVlcywgdHlwZW5hbWUgVmFsdWVzPgpjb25zdCBjaGFyKiBQYXJzZU9i
1310
+ amVjdDxLZXlWYWx1ZXMsVmFsdWVzPjo6UGFyc2UoCiAgICBjb25zdCBjaGFy
1311
+ KiBCZWdpbiwgY29uc3QgY2hhciogRW5kLCBQYXJzZXJQb29sJiBQb29sKSBu
1312
+ b2V4Y2VwdChmYWxzZSkKewogICAgY29uc3QgY2hhciogb3JpZ2luID0gQmVn
1313
+ aW47CiAgICB3aGlsZSAoQmVnaW4gIT0gRW5kKSB7CiAgICAgICAgc3dpdGNo
1314
+ IChzdGF0ZSkgewogICAgICAgIGNhc2UgTm90U3RhcnRlZDoKICAgICAgICAg
1315
+ ICAgLy8gRXhwZWN0ICd7JyBvbiB0aGUgZmlyc3QgY2FsbC4KICAgICAgICAg
1316
+ ICAgaWYgKCpCZWdpbiAhPSAneycpCiAgICAgICAgICAgICAgICB0aHJvdyBD
1317
+ b250ZXh0RXhjZXB0aW9uKEludmFsaWRPYmplY3RTdGFydCwgb3JpZ2luLCBC
1318
+ ZWdpbiwgRW5kKTsKICAgICAgICAgICAgc3RhdGUgPSBQcmVLZXk7CiAgICAg
1319
+ ICAgICAgICsrQmVnaW47CiAgICAgICAgY2FzZSBQcmVLZXk6CiAgICAgICAg
1320
+ ICAgIEJlZ2luID0gc2tpcFdoaXRlc3BhY2UoQmVnaW4sIEVuZCk7CiAgICAg
1321
+ ICAgICAgIGlmIChCZWdpbiA9PSBudWxscHRyIHx8ICEqQmVnaW4pCiAgICAg
1322
+ ICAgICAgICAgICByZXR1cm4gc2V0RmluaXNoZWQobnVsbHB0cik7CiAgICAg
1323
+ ICAgICAgIGlmICgqQmVnaW4gPT0gJ30nKQogICAgICAgICAgICAgICAgcmV0
1324
+ dXJuIGNoZWNrUGFzc2VkKCsrQmVnaW4pOwogICAgICAgICAgICBzdGF0ZSA9
1325
+ IEV4cGVjdEtleTsKICAgICAgICBjYXNlIEV4cGVjdEtleToKICAgICAgICAg
1326
+ ICAgQmVnaW4gPSBzdGQ6OmdldDxQYXJzZXJQb29sOjpTdHJpbmc+KFBvb2wu
1327
+ UGFyc2VyKS5QYXJzZSgKICAgICAgICAgICAgICAgIEJlZ2luLCBFbmQsIFBv
1328
+ b2wpOwogICAgICAgICAgICBpZiAoQmVnaW4gPT0gbnVsbHB0cikKICAgICAg
1329
+ ICAgICAgICAgIHJldHVybiBzZXRGaW5pc2hlZChudWxscHRyKTsKICAgICAg
1330
+ ICAgICAgc2V0QWN0aXZhdGluZyhzdGQ6OmdldDxQYXJzZXJQb29sOjpTdHJp
1331
+ bmc+KFBvb2wuVmFsdWUpKTsKICAgICAgICAgICAgc3RhdGUgPSBQcmVDb2xv
1332
+ bjsKICAgICAgICBjYXNlIFByZUNvbG9uOgogICAgICAgICAgICBCZWdpbiA9
1333
+ IHNraXBXaGl0ZXNwYWNlKEJlZ2luLCBFbmQpOwogICAgICAgICAgICBpZiAo
1334
+ QmVnaW4gPT0gbnVsbHB0ciB8fCAhKkJlZ2luKQogICAgICAgICAgICAgICAg
1335
+ cmV0dXJuIHNldEZpbmlzaGVkKG51bGxwdHIpOwogICAgICAgICAgICBzdGF0
1336
+ ZSA9IEV4cGVjdENvbG9uOwogICAgICAgIGNhc2UgRXhwZWN0Q29sb246CiAg
1337
+ ICAgICAgICAgIGlmICgqQmVnaW4gIT0gJzonKQogICAgICAgICAgICAgICAg
1338
+ dGhyb3cgQ29udGV4dEV4Y2VwdGlvbihJbnZhbGlkVmFsdWVTZXBhcmF0b3Is
1339
+ IG9yaWdpbiwgQmVnaW4sIEVuZCk7CiAgICAgICAgICAgIHN0YXRlID0gUHJl
1340
+ VmFsdWU7CiAgICAgICAgICAgIGlmICgrK0JlZ2luID09IEVuZCkKICAgICAg
1341
+ ICAgICAgICAgIHJldHVybiBzZXRGaW5pc2hlZChudWxscHRyKTsKICAgICAg
1342
+ ICBjYXNlIFByZVZhbHVlOgogICAgICAgICAgICBCZWdpbiA9IHNraXBXaGl0
1343
+ ZXNwYWNlKEJlZ2luLCBFbmQpOwogICAgICAgICAgICBpZiAoQmVnaW4gPT0g
1344
+ bnVsbHB0ciB8fCAhKkJlZ2luKQogICAgICAgICAgICAgICAgcmV0dXJuIHNl
1345
+ dEZpbmlzaGVkKG51bGxwdHIpOwogICAgICAgICAgICBhY3RpdmUgPSBhY3Rp
1346
+ dmF0aW5nOwogICAgICAgICAgICBhY3RpdmF0aW5nID0gLTE7CiAgICAgICAg
1347
+ ICAgIHN0YXRlID0gRXhwZWN0VmFsdWU7CiAgICAgICAgY2FzZSBFeHBlY3RW
1348
+ YWx1ZToKICAgICAgICAgICAgQmVnaW4gPSBwYXJzZXJzLlNjYW5uZXIoYWN0
1349
+ aXZlLCBQb29sKS5QYXJzZShCZWdpbiwgRW5kLCBQb29sKTsKICAgICAgICAg
1350
+ ICAgaWYgKEJlZ2luID09IG51bGxwdHIpCiAgICAgICAgICAgICAgICByZXR1
1351
+ cm4gc2V0RmluaXNoZWQobnVsbHB0cik7CiAgICAgICAgICAgIHBhcnNlcnMu
1352
+ S2V5VmFsdWUoYWN0aXZlKS0+U3dhcChvdXRbYWN0aXZlXSwgUG9vbCk7CiAg
1353
+ ICAgICAgICAgIGFjdGl2ZSA9IC0xOwogICAgICAgICAgICBzdGF0ZSA9IFBy
1354
+ ZUNvbW1hOwogICAgICAgIGNhc2UgUHJlQ29tbWE6CiAgICAgICAgICAgIEJl
1355
+ Z2luID0gc2tpcFdoaXRlc3BhY2UoQmVnaW4sIEVuZCk7CiAgICAgICAgICAg
1356
+ IGlmIChCZWdpbiA9PSBudWxscHRyIHx8ICEqQmVnaW4pCiAgICAgICAgICAg
1357
+ ICAgICByZXR1cm4gc2V0RmluaXNoZWQobnVsbHB0cik7CiAgICAgICAgICAg
1358
+ IHN0YXRlID0gRXhwZWN0Q29tbWE7CiAgICAgICAgY2FzZSBFeHBlY3RDb21t
1359
+ YToKICAgICAgICAgICAgaWYgKCpCZWdpbiA9PSAnfScpCiAgICAgICAgICAg
1360
+ ICAgICByZXR1cm4gY2hlY2tQYXNzZWQoKytCZWdpbik7CiAgICAgICAgICAg
1361
+ IGlmICgqQmVnaW4gIT0gJywnKQogICAgICAgICAgICAgICAgdGhyb3cgQ29u
1362
+ dGV4dEV4Y2VwdGlvbihJbnZhbGlkS2V5U2VwYXJhdG9yLCBvcmlnaW4sIEJl
1363
+ Z2luLCBFbmQpOwogICAgICAgICAgICBzdGF0ZSA9IFByZUtleTsKICAgICAg
1364
+ ICAgICAgKytCZWdpbjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gc2V0
1365
+ RmluaXNoZWQobnVsbHB0cik7Cn0K
1366
+ c6: |
1367
+ Y29uc3QgRXhjZXB0aW9uIHNwZWNqc29uOjpJbnZhbGlkS2V5KCJPYmplY3Qs
1368
+ IHVuZXhwZWN0ZWQga2V5LiIpOwpjb25zdCBFeGNlcHRpb24gc3BlY2pzb246
1369
+ OlJlcXVpcmVkS2V5Tm90R2l2ZW4oIk9iamVjdCwgcmVxdWlyZWQga2V5IG5v
1370
+ dCBnaXZlbi4iKTsKY29uc3QgRXhjZXB0aW9uIHNwZWNqc29uOjpJbnZhbGlk
1371
+ T2JqZWN0U3RhcnQoIkV4cGVjdGVkICd7JyIpOwpjb25zdCBFeGNlcHRpb24g
1372
+ c3BlY2pzb246OkludmFsaWRLZXlTZXBhcmF0b3IoIk9iamVjdCwgZXhwZWN0
1373
+ ZWQgJywnIik7CmNvbnN0IEV4Y2VwdGlvbiBzcGVjanNvbjo6SW52YWxpZFZh
1374
+ bHVlU2VwYXJhdG9yKCJPYmplY3QsIGV4cGVjdGVkICc6JyIpOwoKc3BlY2pz
1375
+ b246OlNjYW5uaW5nS2V5VmFsdWU6On5TY2FubmluZ0tleVZhbHVlKCkgeyB9
1376
+ Cgp2b2lkIHNwZWNqc29uOjpTY2FubmluZ0tleVZhbHVlOjpHaXZlKFZhbHVl
1377
+ U3RvcmUqIFZTKSB7CiAgICBnaXZlbiA9IGZhbHNlOwogICAgVlMtPkdpdmUo
1378
+ KTsKfQoKdm9pZCBzcGVjanNvbjo6VmFsdWVTdG9yZTo6R2l2ZSgpIHsKICAg
1379
+ IGdpdmVuID0gdHJ1ZTsKfQo=
1380
+ c7: |
1381
+ Y2xhc3MgUGFyc2VyUG9vbCB7CnB1YmxpYzoKICAgIFBhcnNlclBvb2woKSB7
1382
+ IH0KICAgIFBhcnNlclBvb2woY29uc3QgUGFyc2VyUG9vbCYpID0gZGVsZXRl
1383
+ OwogICAgUGFyc2VyUG9vbCYgb3BlcmF0b3I9KGNvbnN0IFBhcnNlclBvb2wm
1384
+ KSA9IGRlbGV0ZTsKICAgIHZpcnR1YWwgflBhcnNlclBvb2woKTsKCiAgICBz
1385
+ dGQ6OnZlY3RvcjxjaGFyPiBidWZmZXI7CgogICAgZW51bSBQYXJzZXJzIHsg
1386
+ UG9vbEluZGV4ZXMgfTsKICAgIHN0ZDo6dHVwbGU8UG9vbFBhcnNlcnM+IFBh
1387
+ cnNlcjsKICAgIHN0ZDo6dHVwbGU8UG9vbFBhcnNlclR5cGVzPiBWYWx1ZTsK
1388
+ CiAgICBpbmxpbmUgY29uc3QgY2hhciogc2tpcFdoaXRlc3BhY2UoY29uc3Qg
1389
+ Y2hhciogQmVnaW4sIGNvbnN0IGNoYXIqIEVuZCkgewogICAgICAgIHJldHVy
1390
+ biBzdGQ6OmdldDwwPihQYXJzZXIpLnNraXBXaGl0ZXNwYWNlKEJlZ2luLCBF
1391
+ bmQpOwogICAgfQogICAgaW5saW5lIGJvb2wgaXNXaGl0ZXNwYWNlKGNvbnN0
1392
+ IGNoYXIgQykgewogICAgICAgIHJldHVybiBzdGQ6OmdldDwwPihQYXJzZXIp
1393
+ LmlzV2hpdGVzcGFjZShDKTsKICAgIH0KfTsK
1394
+ c8: 'c3BlY2pzb246OlBhcnNlclBvb2w6On5QYXJzZXJQb29sKCkgeyB9Cg==
1395
+
1396
+ '
1397
+ c9: |
1398
+ Y2xhc3MgVmFsdWVQYXJzZXIgewpwcm90ZWN0ZWQ6CiAgICBib29sIGZpbmlz
1399
+ aGVkOwogICAgY29uc3QgY2hhciogc2V0RmluaXNoZWQoY29uc3QgY2hhciog
1400
+ RW5kcHRyLCBQYXJzZXJQb29sJiBQb29sKTsKICAgIGNvbnN0IGNoYXIqIHNl
1401
+ dEZpbmlzaGVkKGNvbnN0IGNoYXIqIEVuZHB0cik7CgpwdWJsaWM6CiAgICBW
1402
+ YWx1ZVBhcnNlcigpIDogZmluaXNoZWQodHJ1ZSkgeyB9CiAgICB2aXJ0dWFs
1403
+ IH5WYWx1ZVBhcnNlcigpOwoKICAgIGJvb2wgRmluaXNoZWQoKSBjb25zdCB7
1404
+ IHJldHVybiBmaW5pc2hlZDsgfQogICAgLy8gUmV0dXJucyBudWxscHRyIGlm
1405
+ IG5vdCBmaW5pc2hlZCAocmVhY2hlZCBlbmQpIG9yIHBvaW50ZXIgd2hlcmUg
1406
+ ZW5kZWQuCiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIFBhcnNlKAogICAgICAg
1407
+ IGNvbnN0IGNoYXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBhcnNlclBv
1408
+ b2wmIFBvb2wpCiAgICAgICAgbm9leGNlcHQoZmFsc2UpID0gMDsKCiAgICBj
1409
+ b25zdCBjaGFyKiBza2lwV2hpdGVzcGFjZShjb25zdCBjaGFyKiBCZWdpbiwg
1410
+ Y29uc3QgY2hhciogRW5kKTsKICAgIGlubGluZSBib29sIGlzV2hpdGVzcGFj
1411
+ ZShjb25zdCBjaGFyIEMpIHsKICAgICAgICByZXR1cm4gQyA9PSAnICcgfHwg
1412
+ QyA9PSAnXHg5JyB8fCBDID09ICdceEEnIHx8IEMgPT0gJ1x4RCc7CiAgICB9
1413
+ Cn07Cg==
1414
+ c10: |
1415
+ Y29uc3QgY2hhciogc3BlY2pzb246OlZhbHVlUGFyc2VyOjpzZXRGaW5pc2hl
1416
+ ZCgKICAgIGNvbnN0IGNoYXIqIEVuZHB0ciwgUGFyc2VyUG9vbCYgUG9vbCkK
1417
+ ewogICAgZmluaXNoZWQgPSBFbmRwdHIgIT0gbnVsbHB0cjsKICAgIGlmIChm
1418
+ aW5pc2hlZCAmJiAhUG9vbC5idWZmZXIuZW1wdHkoKSkKICAgICAgICBQb29s
1419
+ LmJ1ZmZlci5yZXNpemUoMCk7CiAgICByZXR1cm4gRW5kcHRyOwp9Cgpjb25z
1420
+ dCBjaGFyKiBzcGVjanNvbjo6VmFsdWVQYXJzZXI6OnNldEZpbmlzaGVkKGNv
1421
+ bnN0IGNoYXIqIEVuZHB0cikgewogICAgZmluaXNoZWQgPSBFbmRwdHIgIT0g
1422
+ bnVsbHB0cjsKICAgIHJldHVybiBFbmRwdHI7Cn0KCmNvbnN0IGNoYXIqIHNw
1423
+ ZWNqc29uOjpWYWx1ZVBhcnNlcjo6c2tpcFdoaXRlc3BhY2UoCiAgICBjb25z
1424
+ dCBjaGFyKiBCZWdpbiwgY29uc3QgY2hhciogRW5kKQp7CiAgICB3aGlsZSAo
1425
+ QmVnaW4gIT0gRW5kICYmIGlzV2hpdGVzcGFjZSgqQmVnaW4pKQogICAgICAg
1426
+ ICsrQmVnaW47CiAgICByZXR1cm4gKEJlZ2luICE9IEVuZCkgPyBCZWdpbiA6
1427
+ IG51bGxwdHI7Cn0KCnNwZWNqc29uOjpWYWx1ZVBhcnNlcjo6flZhbHVlUGFy
1428
+ c2VyKCkgeyB9Cg==
1429
+ c11: |
1430
+ ZXh0ZXJuIGNvbnN0IEV4Y2VwdGlvbiBJbnZhbGlkSW50OwpleHRlcm4gY29u
1431
+ c3QgRXhjZXB0aW9uIEludE91dHNpZGVSYW5nZTsKCnRlbXBsYXRlPHR5cGVu
1432
+ YW1lIFQsIGludG1heF90IE1pbmltdW0sIHVpbnRtYXhfdCBNYXhpbXVtPgpU
1433
+ IGNvbnZlcnRfdG9faW50ZWdlcihjb25zdCBjaGFyKiBCZWdpbiwgY2hhcioq
1434
+ IGVuZCkgbm9leGNlcHQoZmFsc2UpIHsKICAgIGVycm5vID0gMDsKICAgIGlm
1435
+ IGNvbnN0ZXhwciAoTWluaW11bSA8IDApIHsKICAgICAgICBpbnRtYXhfdCBv
1436
+ dXQgPSBzdHJ0b2ltYXgoQmVnaW4sIGVuZCwgMTApOwogICAgICAgIGlmIChl
1437
+ cnJubyA9PSBFUkFOR0UpCiAgICAgICAgICAgIHRocm93IEludE91dHNpZGVS
1438
+ YW5nZTsKICAgICAgICBpZiAob3V0IDwgTWluaW11bSB8fCAoMCA8IG91dCAm
1439
+ JiBNYXhpbXVtIDwgb3V0KSkKICAgICAgICAgICAgdGhyb3cgSW50T3V0c2lk
1440
+ ZVJhbmdlOwogICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUPihvdXQpOwog
1441
+ ICAgfSBlbHNlIHsKICAgICAgICBpZiAoKkJlZ2luID09ICctJykKICAgICAg
1442
+ ICAgICAgdGhyb3cgSW50T3V0c2lkZVJhbmdlOyAvLyBBdm9pZCByZXR1cm5p
1443
+ bmcgbmVnYXRpb24gb2YgdmFsdWUuCiAgICAgICAgdWludG1heF90IG91dCA9
1444
+ IHN0cnRvdW1heChCZWdpbiwgZW5kLCAxMCk7CiAgICAgICAgaWYgKGVycm5v
1445
+ ID09IEVSQU5HRSkKICAgICAgICAgICAgdGhyb3cgSW50T3V0c2lkZVJhbmdl
1446
+ OwogICAgICAgIGlmIChvdXQgPCBNaW5pbXVtIHx8IE1heGltdW0gPCBvdXQp
1447
+ CiAgICAgICAgICAgIHRocm93IEludE91dHNpZGVSYW5nZTsKICAgICAgICBy
1448
+ ZXR1cm4gc3RhdGljX2Nhc3Q8VD4ob3V0KTsKICAgIH0KfQoKdGVtcGxhdGU8
1449
+ dHlwZW5hbWUgVCwgaW50bWF4X3QgTWluaW11bSwgdWludG1heF90IE1heGlt
1450
+ dW0+CmNvbnN0IGNoYXIqIHBhcnNlX2ludGVnZXIoVCYgT3V0LCBjb25zdCBj
1451
+ aGFyKiBCZWdpbiwgY29uc3QgY2hhciogRW5kLAogICAgc3RkOjp2ZWN0b3I8
1452
+ Y2hhcj4mIEJ1ZmZlciwgYm9vbCBGaW5pc2hlZCkKICAgIG5vZXhjZXB0KGZh
1453
+ bHNlKQp7CiAgICBjaGFyKiBlbmQgPSBudWxscHRyOwogICAgaWYgKEZpbmlz
1454
+ aGVkKSB7CiAgICAgICAgT3V0ID0gY29udmVydF90b19pbnRlZ2VyPFQsTWlu
1455
+ aW11bSxNYXhpbXVtPihCZWdpbiwgJmVuZCk7CiAgICAgICAgaWYgKGVuZCA9
1456
+ PSBCZWdpbikgewogICAgICAgICAgICBpZiAoQmVnaW4gPT0gRW5kKQogICAg
1457
+ ICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgICAgIC8vIFVu
1458
+ bGVzcyBvbmx5IHNpZ24gZml0LCB0aHJvdy4KICAgICAgICAgICAgaWYgKEJl
1459
+ Z2luICsgMSAhPSBFbmQgfHwgKCpCZWdpbiAhPSAnLScgJiYgKkJlZ2luICE9
1460
+ ICcrJykpCiAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkSW50OwogICAg
1461
+ ICAgIH0gZWxzZSBpZiAoZW5kICE9IEVuZCkKICAgICAgICAgICAgcmV0dXJu
1462
+ IGVuZDsgLy8gR29vZCB1cCB0byB0aGlzLgogICAgICAgIHdoaWxlIChCZWdp
1463
+ biAhPSBFbmQpCiAgICAgICAgICAgIEJ1ZmZlci5wdXNoX2JhY2soKkJlZ2lu
1464
+ KyspOwogICAgICAgIHJldHVybiBudWxscHRyOwogICAgfQogICAgLy8gU3Rh
1465
+ cnQgb2YgdGhlIG51bWJlciBpcyBpbiBidWZmZXIuIElucHV0IGlzIG51bGwt
1466
+ dGVybWluYXRlZC4KICAgIHdoaWxlICgoJzAnIDw9ICpCZWdpbiAmJiAqQmVn
1467
+ aW4gPD0gJzknKSB8fCAqQmVnaW4gPT0gJy0nIHx8ICpCZWdpbiA9PSAnKycp
1468
+ CiAgICAgICAgQnVmZmVyLnB1c2hfYmFjaygqQmVnaW4rKyk7CiAgICBpZiAo
1469
+ QmVnaW4gPT0gRW5kKSAvLyBDb250aW51ZXMgb24gYW5kIG9uPwogICAgICAg
1470
+ IHJldHVybiBudWxscHRyOwogICAgQnVmZmVyLnB1c2hfYmFjaygwKTsKICAg
1471
+ IE91dCA9IGNvbnZlcnRfdG9faW50ZWdlcjxULE1pbmltdW0sTWF4aW11bT4o
1472
+ JkJ1ZmZlci5mcm9udCgpLCAmZW5kKTsKICAgIC8vIFNlcGFyYXRvciBzY2Fu
1473
+ IHdpbGwgdGhyb3cgaWYgdGhlIHN0cmluZyBpbiBzb3VyY2UgaXMgbm90IGEg
1474
+ bnVtYmVyLgogICAgLy8gUmVxdWlyZSB0aGF0IGFsbCBjaGFycyBhcmUgdGhl
1475
+ IG51bWJlciBhcyB0aGVyZSB3YXMgbm8gc2VwYXJhdG9yIGNvcGllZC4KICAg
1476
+ IGlmIChlbmQgIT0gJkJ1ZmZlci5iYWNrKCkpCiAgICAgICAgdGhyb3cgSW52
1477
+ YWxpZEludDsKICAgIHJldHVybiBCZWdpbjsKfQo=
1478
+ c12: |
1479
+ Y29uc3QgRXhjZXB0aW9uIHNwZWNqc29uOjpJbnZhbGlkSW50KCJJbnZhbGlk
1480
+ IGludGVnZXIuIik7CmNvbnN0IEV4Y2VwdGlvbiBzcGVjanNvbjo6SW50T3V0
1481
+ c2lkZVJhbmdlKCJJbnRlZ2VyIG91dHNpZGUgcmFuZ2UuIik7Cg==
1482
+ c13: |
1483
+ dGVtcGxhdGU8dHlwZW5hbWUgUGFyc2VyPgpjbGFzcyBQYXJzZUNvbnRhaW5l
1484
+ clN0ZFZlY3RvciA6IHB1YmxpYyBQYXJzZUNvbnRhaW5lckFycmF5PHN0ZDo6
1485
+ dmVjdG9yPHR5cGVuYW1lIFBhcnNlcjo6VHlwZT4sIFBhcnNlcj4geyB9Owo=
1486
+ c14: |
1487
+ dGVtcGxhdGU8dHlwZW5hbWUgUGFyc2VyPgpjbGFzcyBQYXJzZUNvbnRhaW5l
1488
+ clN0ZFZlY3RvckVxU2l6ZSA6IHB1YmxpYyBQYXJzZUNvbnRhaW5lckFycmF5
1489
+ PHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFBhcnNlcjo6VHlwZT4sIFBhcnNlciwg
1490
+ dHJ1ZT4geyB9Owo=
1491
+ c15: |
1492
+ Y2xhc3MgUGFyc2VCb29sIDogcHVibGljIFZhbHVlUGFyc2VyIHsKcHVibGlj
1493
+ OgogICAgdHlwZWRlZiBib29sIFR5cGU7CiAgICBlbnVtIFBvb2wgeyBJbmRl
1494
+ eCA9IFBvb2xJbmRleCB9OwoKICAgIGNvbnN0IGNoYXIqIFBhcnNlKGNvbnN0
1495
+ IGNoYXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBhcnNlclBvb2wmIFBv
1496
+ b2wpCiAgICAgICAgbm9leGNlcHQoZmFsc2UpOwp9Owo=
1497
+ c16: |
1498
+ c3RhdGljIGNvbnN0IEV4Y2VwdGlvbiBJbnZhbGlkQm9vbCgiSW52YWxpZCBC
1499
+ b29sZWFuLiIpOwoKY29uc3QgY2hhciogc3BlY2pzb246OlBhcnNlQm9vbDo6
1500
+ UGFyc2UoCiAgICBjb25zdCBjaGFyKiBCZWdpbiwgY29uc3QgY2hhciogRW5k
1501
+ LCBQYXJzZXJQb29sJiBQb29sKSBub2V4Y2VwdChmYWxzZSkKewogICAgVHlw
1502
+ ZSYgb3V0KHN0ZDo6Z2V0PFBhcnNlQm9vbDo6UG9vbDo6SW5kZXg+KFBvb2wu
1503
+ VmFsdWUpKTsKICAgIGlmICghZmluaXNoZWQpIHsKICAgICAgICBvdXQgPSBQ
1504
+ b29sLmJ1ZmZlci5mcm9udCgpID09ICd0JzsKICAgIH0gZWxzZSB7CiAgICAg
1505
+ ICAgaWYgKCEqQmVnaW4pCiAgICAgICAgICAgIHJldHVybiBzZXRGaW5pc2hl
1506
+ ZChudWxscHRyLCBQb29sKTsKICAgICAgICBlbHNlIGlmICgqQmVnaW4gPT0g
1507
+ J3QnKSB7CiAgICAgICAgICAgIG91dCA9IHRydWU7IC8vIFBvc3NpYmx5Lgog
1508
+ ICAgICAgIH0gZWxzZSBpZiAoKkJlZ2luID09ICdmJykgewogICAgICAgICAg
1509
+ ICBvdXQgPSBmYWxzZTsgLy8gUG9zc2libHkuCiAgICAgICAgfSBlbHNlCiAg
1510
+ ICAgICAgICAgIHRocm93IEludmFsaWRCb29sOwogICAgICAgIFBvb2wuYnVm
1511
+ ZmVyLnB1c2hfYmFjaygqQmVnaW4rKyk7CiAgICB9CiAgICBpZiAoUG9vbC5i
1512
+ dWZmZXIuc2l6ZSgpID09IDEpIHsKICAgICAgICBpZiAoQmVnaW4gPT0gRW5k
1513
+ KQogICAgICAgICAgICByZXR1cm4gc2V0RmluaXNoZWQobnVsbHB0ciwgUG9v
1514
+ bCk7CiAgICAgICAgaWYgKCpCZWdpbiAhPSAob3V0ID8gJ3InIDogJ2EnKSkK
1515
+ ICAgICAgICAgICAgdGhyb3cgSW52YWxpZEJvb2w7CiAgICAgICAgUG9vbC5i
1516
+ dWZmZXIucHVzaF9iYWNrKCpCZWdpbisrKTsKICAgIH0KICAgIGlmIChQb29s
1517
+ LmJ1ZmZlci5zaXplKCkgPT0gMikgewogICAgICAgIGlmIChCZWdpbiA9PSBF
1518
+ bmQpCiAgICAgICAgICAgIHJldHVybiBzZXRGaW5pc2hlZChudWxscHRyLCBQ
1519
+ b29sKTsKICAgICAgICBpZiAoKkJlZ2luICE9IChvdXQgPyAndScgOiAnbCcp
1520
+ KQogICAgICAgICAgICB0aHJvdyBJbnZhbGlkQm9vbDsKICAgICAgICBQb29s
1521
+ LmJ1ZmZlci5wdXNoX2JhY2soKkJlZ2luKyspOwogICAgfQogICAgaWYgKFBv
1522
+ b2wuYnVmZmVyLnNpemUoKSA9PSAzKSB7CiAgICAgICAgaWYgKEJlZ2luID09
1523
+ IEVuZCkKICAgICAgICAgICAgcmV0dXJuIHNldEZpbmlzaGVkKG51bGxwdHIs
1524
+ IFBvb2wpOwogICAgICAgIGlmICgqQmVnaW4gIT0gKG91dCA/ICdlJyA6ICdz
1525
+ JykpCiAgICAgICAgICAgIHRocm93IEludmFsaWRCb29sOwogICAgICAgIGlm
1526
+ IChvdXQpCiAgICAgICAgICAgIHJldHVybiBzZXRGaW5pc2hlZChCZWdpbiAr
1527
+ IDEsIFBvb2wpOwogICAgICAgIFBvb2wuYnVmZmVyLnB1c2hfYmFjaygqQmVn
1528
+ aW4rKyk7CiAgICB9CiAgICAvLyBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlIGFy
1529
+ ZSBjb21wYXJpbmcgdG8gbGFzdCBjaGFyYWN0ZXIgb2YgImZhbHNlIi4KICAg
1530
+ IGlmIChCZWdpbiA9PSBFbmQpCiAgICAgICAgcmV0dXJuIHNldEZpbmlzaGVk
1531
+ KG51bGxwdHIsIFBvb2wpOwogICAgaWYgKCpCZWdpbiAhPSAnZScpCiAgICAg
1532
+ ICAgdGhyb3cgSW52YWxpZEJvb2w7CiAgICByZXR1cm4gc2V0RmluaXNoZWQo
1533
+ QmVnaW4gKyAxLCBQb29sKTsKICAgIC8vIElmIHRoZXJlIGlzIGdhcmJhZ2Ug
1534
+ YWZ0ZXJ3YXJkcywgaGlnaGVyIGxldmVsIHBhcnNlciB3aWxsIGZpbmQgaXQu
1535
+ Cn0K
1536
+ c17: |
1537
+ Y2xhc3MgUGFyc2VEb3VibGUgOiBwdWJsaWMgVmFsdWVQYXJzZXIgewpwdWJs
1538
+ aWM6CiAgICB0eXBlZGVmIGRvdWJsZSBUeXBlOwogICAgZW51bSBQb29sIHsg
1539
+ SW5kZXggPSBQb29sSW5kZXggfTsKCiAgICBjb25zdCBjaGFyKiBQYXJzZShj
1540
+ b25zdCBjaGFyKiBCZWdpbiwgY29uc3QgY2hhciogRW5kLCBQYXJzZXJQb29s
1541
+ JiBQb29sKQogICAgICAgIG5vZXhjZXB0KGZhbHNlKTsKfTsK
1542
+ c18: |
1543
+ c3RhdGljIGNvbnN0IEV4Y2VwdGlvbiBJbnZhbGlkRG91YmxlKCJJbnZhbGlk
1544
+ IGRvdWJsZS4iKTsKCmNvbnN0IGNoYXIqIHNwZWNqc29uOjpQYXJzZURvdWJs
1545
+ ZTo6UGFyc2UoCiAgICBjb25zdCBjaGFyKiBCZWdpbiwgY29uc3QgY2hhciog
1546
+ RW5kLCBQYXJzZXJQb29sJiBQb29sKSBub2V4Y2VwdChmYWxzZSkKewogICAg
1547
+ VHlwZSYgb3V0KHN0ZDo6Z2V0PFBhcnNlRG91YmxlOjpQb29sOjpJbmRleD4o
1548
+ UG9vbC5WYWx1ZSkpOwogICAgY2hhciogZW5kID0gbnVsbHB0cjsKICAgIGlm
1549
+ IChmaW5pc2hlZCkgewogICAgICAgIC8vIEFzc3VtZXMgTENfTlVNRVJJQyBp
1550
+ cyAiQyIgb3IgY2xvc2UgZW5vdWdoLgogICAgICAgIG91dCA9IHN0cnRvZChC
1551
+ ZWdpbiwgJmVuZCk7CiAgICAgICAgaWYgKGVuZCAhPSBCZWdpbiAmJiBlbmQg
1552
+ IT0gRW5kICYmICEoKmVuZCA9PSAnZScgfHwgKmVuZCA9PSAnRScpKSB7CiAg
1553
+ ICAgICAgICAgIC8vIERldGVjdCBoZXhhZGVjaW1hbCBzaWduaWZpY2FuZCBh
1554
+ bmQgZXhwb25lbnQsIElORiwgTkFOLiAiLCIKICAgICAgICAgICAgLy8gVGhp
1555
+ cyBibG9jayBpcyBhYm91dCA2JSBvZiBwYXJzaW5nIHRpbWUgaWYgeW91IHRv
1556
+ bGVyYXRlIHRoZSBhYm92ZS4KICAgICAgICAgICAgd2hpbGUgKEJlZ2luICE9
1557
+ IGVuZCAmJgogICAgICAgICAgICAgICAgKCgnMCcgPD0gKkJlZ2luICYmICpC
1558
+ ZWdpbiA8PSAnOScpIHx8CiAgICAgICAgICAgICAgICAqQmVnaW4gPT0gJy0n
1559
+ IHx8ICpCZWdpbiA9PSAnKycgfHwgKkJlZ2luID09ICcuJyB8fAogICAgICAg
1560
+ ICAgICAgICAgKkJlZ2luID09ICdlJyB8fCAqQmVnaW4gPT0gJ0UnKSkKICAg
1561
+ ICAgICAgICAgICAgICAgICArK0JlZ2luOwogICAgICAgICAgICBpZiAoQmVn
1562
+ aW4gIT0gZW5kKQogICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZERvdWJs
1563
+ ZTsKICAgICAgICAgICAgcmV0dXJuIHNldEZpbmlzaGVkKGVuZCk7IC8vIEdv
1564
+ b2QgdXAgdG8gdGhpcy4KICAgICAgICB9CiAgICAgICAgLy8gQ29weSBnb29k
1565
+ IGNoYXJzIHRvIGJ1ZmZlci4gRWl0aGVyIGVuZCBjdXQgb2ZmIG9yIGludmFs
1566
+ aWQuCiAgICAgICAgd2hpbGUgKCgnMCcgPD0gKkJlZ2luICYmICpCZWdpbiA8
1567
+ PSAnOScpIHx8ICpCZWdpbiA9PSAnLicgfHwKICAgICAgICAgICAgKkJlZ2lu
1568
+ ID09ICdlJyB8fCAqQmVnaW4gPT0gJ0UnIHx8CiAgICAgICAgICAgICpCZWdp
1569
+ biA9PSAnLScgfHwgKkJlZ2luID09ICcrJykKICAgICAgICAgICAgICAgIFBv
1570
+ b2wuYnVmZmVyLnB1c2hfYmFjaygqQmVnaW4rKyk7CiAgICAgICAgaWYgKEJl
1571
+ Z2luICE9IEVuZCkgLy8gRGlkIG5vdCByZWFjaCBlbmQgb2YgYnVmZmVyLCBo
1572
+ ZW5jZSBpbnZhbGlkLgogICAgICAgICAgICB0aHJvdyBJbnZhbGlkRG91Ymxl
1573
+ OwogICAgICAgIHJldHVybiBzZXRGaW5pc2hlZChudWxscHRyLCBQb29sKTsK
1574
+ ICAgIH0KICAgIC8vIFN0YXJ0IG9mIHRoZSBudW1iZXIgaXMgaW4gYnVmZmVy
1575
+ LiBJbnB1dCBpcyBudWxsLXRlcm1pbmF0ZWQuCiAgICB3aGlsZSAoKCcwJyA8
1576
+ PSAqQmVnaW4gJiYgKkJlZ2luIDw9ICc5JykgfHwgKkJlZ2luID09ICcuJyB8
1577
+ fAogICAgICAgICpCZWdpbiA9PSAnZScgfHwgKkJlZ2luID09ICdFJyB8fAog
1578
+ ICAgICAgICpCZWdpbiA9PSAnLScgfHwgKkJlZ2luID09ICcrJykKICAgICAg
1579
+ ICAgICAgUG9vbC5idWZmZXIucHVzaF9iYWNrKCpCZWdpbisrKTsKICAgIGlm
1580
+ IChCZWdpbiA9PSBFbmQpIC8vIENvbnRpbnVlcyBvbiBhbmQgb24/CiAgICAg
1581
+ ICAgcmV0dXJuIHNldEZpbmlzaGVkKG51bGxwdHIsIFBvb2wpOwogICAgUG9v
1582
+ bC5idWZmZXIucHVzaF9iYWNrKDApOwogICAgb3V0ID0gc3RydG9kKCZQb29s
1583
+ LmJ1ZmZlci5mcm9udCgpLCAmZW5kKTsKICAgIC8vIFNlcGFyYXRvciBzY2Fu
1584
+ IHdpbGwgdGhyb3cgaWYgdGhlIHN0cmluZyBpbiBzb3VyY2UgaXMgbm90IGEg
1585
+ bnVtYmVyLgogICAgLy8gUmVxdWlyZSB0aGF0IGFsbCBjaGFycyBhcmUgdGhl
1586
+ IG51bWJlciBhcyB0aGVyZSB3YXMgbm8gc2VwYXJhdG9yIGNvcGllZC4KICAg
1587
+ IGlmIChlbmQgIT0gJlBvb2wuYnVmZmVyLmJhY2soKSkKICAgICAgICB0aHJv
1588
+ dyBJbnZhbGlkRG91YmxlOwogICAgcmV0dXJuIHNldEZpbmlzaGVkKEJlZ2lu
1589
+ LCBQb29sKTsKfQo=
1590
+ c19: |
1591
+ Y2xhc3MgUGFyc2VGbG9hdCA6IHB1YmxpYyBWYWx1ZVBhcnNlciB7CnB1Ymxp
1592
+ YzoKICAgIHR5cGVkZWYgZmxvYXQgVHlwZTsKICAgIGVudW0gUG9vbCB7IElu
1593
+ ZGV4ID0gUG9vbEluZGV4IH07CgogICAgY29uc3QgY2hhciogUGFyc2UoY29u
1594
+ c3QgY2hhciogQmVnaW4sIGNvbnN0IGNoYXIqIEVuZCwgUGFyc2VyUG9vbCYg
1595
+ UG9vbCkKICAgICAgICBub2V4Y2VwdChmYWxzZSk7Cn07Cg==
1596
+ c20: |
1597
+ c3RhdGljIGNvbnN0IEV4Y2VwdGlvbiBJbnZhbGlkRmxvYXQoIkludmFsaWQg
1598
+ ZmxvYXQuIik7Cgpjb25zdCBjaGFyKiBzcGVjanNvbjo6UGFyc2VGbG9hdDo6
1599
+ UGFyc2UoCiAgICBjb25zdCBjaGFyKiBCZWdpbiwgY29uc3QgY2hhciogRW5k
1600
+ LCBQYXJzZXJQb29sJiBQb29sKSBub2V4Y2VwdChmYWxzZSkKewogICAgVHlw
1601
+ ZSYgb3V0KHN0ZDo6Z2V0PFBhcnNlRmxvYXQ6OlBvb2w6OkluZGV4PihQb29s
1602
+ LlZhbHVlKSk7CiAgICBjaGFyKiBlbmQgPSBudWxscHRyOwogICAgaWYgKGZp
1603
+ bmlzaGVkKSB7CiAgICAgICAgLy8gQXNzdW1lcyBMQ19OVU1FUklDIGlzICJD
1604
+ IiBvciBjbG9zZSBlbm91Z2guCiAgICAgICAgb3V0ID0gc3RydG9mKEJlZ2lu
1605
+ LCAmZW5kKTsKICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGUgZXhwb25l
1606
+ bnQgaXMgaW4gbmV4dCBidWZmZXIuCiAgICAgICAgaWYgKGVuZCAhPSBCZWdp
1607
+ biAmJiBlbmQgIT0gRW5kICYmICEoKmVuZCA9PSAnZScgfHwgKmVuZCA9PSAn
1608
+ RScpKSB7CiAgICAgICAgICAgIC8vIERldGVjdCBoZXhhZGVjaW1hbCBzaWdu
1609
+ aWZpY2FuZCBhbmQgZXhwb25lbnQsIElORiwgTkFOLiAiLCIKICAgICAgICAg
1610
+ ICAgLy8gVGhpcyBibG9jayBpcyBhYm91dCA2JSBvZiBwYXJzaW5nIHRpbWUg
1611
+ aWYgeW91IHRvbGVyYXRlIHRoZSBhYm92ZS4KICAgICAgICAgICAgd2hpbGUg
1612
+ KEJlZ2luICE9IGVuZCAmJgogICAgICAgICAgICAgICAgKCgnMCcgPD0gKkJl
1613
+ Z2luICYmICpCZWdpbiA8PSAnOScpIHx8CiAgICAgICAgICAgICAgICAqQmVn
1614
+ aW4gPT0gJy0nIHx8ICpCZWdpbiA9PSAnKycgfHwgKkJlZ2luID09ICcuJyB8
1615
+ fAogICAgICAgICAgICAgICAgKkJlZ2luID09ICdlJyB8fCAqQmVnaW4gPT0g
1616
+ J0UnKSkKICAgICAgICAgICAgICAgICAgICArK0JlZ2luOwogICAgICAgICAg
1617
+ ICBpZiAoQmVnaW4gIT0gZW5kKQogICAgICAgICAgICAgICAgdGhyb3cgSW52
1618
+ YWxpZEZsb2F0OwogICAgICAgICAgICByZXR1cm4gc2V0RmluaXNoZWQoZW5k
1619
+ KTsgLy8gR29vZCB1cCB0byB0aGlzLgogICAgICAgIH0KICAgICAgICAvLyBD
1620
+ b3B5IGdvb2QgY2hhcnMgdG8gYnVmZmVyLiBFaXRoZXIgZW5kIGN1dCBvZmYg
1621
+ b3IgaW52YWxpZC4KICAgICAgICB3aGlsZSAoKCcwJyA8PSAqQmVnaW4gJiYg
1622
+ KkJlZ2luIDw9ICc5JykgfHwgKkJlZ2luID09ICcuJyB8fAogICAgICAgICAg
1623
+ ICAqQmVnaW4gPT0gJ2UnIHx8ICpCZWdpbiA9PSAnRScgfHwKICAgICAgICAg
1624
+ ICAgKkJlZ2luID09ICctJyB8fCAqQmVnaW4gPT0gJysnKQogICAgICAgICAg
1625
+ ICAgICAgUG9vbC5idWZmZXIucHVzaF9iYWNrKCpCZWdpbisrKTsKICAgICAg
1626
+ ICBpZiAoQmVnaW4gIT0gRW5kKSAvLyBEaWQgbm90IHJlYWNoIGVuZCBvZiBi
1627
+ dWZmZXIsIGhlbmNlIGludmFsaWQuCiAgICAgICAgICAgIHRocm93IEludmFs
1628
+ aWRGbG9hdDsKICAgICAgICByZXR1cm4gc2V0RmluaXNoZWQobnVsbHB0ciwg
1629
+ UG9vbCk7CiAgICB9CiAgICAvLyBTdGFydCBvZiB0aGUgbnVtYmVyIGlzIGlu
1630
+ IGJ1ZmZlci4gSW5wdXQgaXMgbnVsbC10ZXJtaW5hdGVkLgogICAgd2hpbGUg
1631
+ KCgnMCcgPD0gKkJlZ2luICYmICpCZWdpbiA8PSAnOScpIHx8ICpCZWdpbiA9
1632
+ PSAnLicgfHwKICAgICAgICAqQmVnaW4gPT0gJ2UnIHx8ICpCZWdpbiA9PSAn
1633
+ RScgfHwKICAgICAgICAqQmVnaW4gPT0gJy0nIHx8ICpCZWdpbiA9PSAnKycp
1634
+ CiAgICAgICAgICAgIFBvb2wuYnVmZmVyLnB1c2hfYmFjaygqQmVnaW4rKyk7
1635
+ CiAgICBpZiAoQmVnaW4gPT0gRW5kKSAvLyBDb250aW51ZXMgb24gYW5kIG9u
1636
+ PwogICAgICAgIHJldHVybiBzZXRGaW5pc2hlZChudWxscHRyLCBQb29sKTsK
1637
+ ICAgIFBvb2wuYnVmZmVyLnB1c2hfYmFjaygwKTsKICAgIG91dCA9IHN0cnRv
1638
+ ZigmUG9vbC5idWZmZXIuZnJvbnQoKSwgJmVuZCk7CiAgICAvLyBTZXBhcmF0
1639
+ b3Igc2NhbiB3aWxsIHRocm93IGlmIHRoZSBzdHJpbmcgaW4gc291cmNlIGlz
1640
+ IG5vdCBhIG51bWJlci4KICAgIC8vIFJlcXVpcmUgdGhhdCBhbGwgY2hhcnMg
1641
+ YXJlIHRoZSBudW1iZXIgYXMgdGhlcmUgd2FzIG5vIHNlcGFyYXRvciBjb3Bp
1642
+ ZWQuCiAgICBpZiAoZW5kICE9ICZQb29sLmJ1ZmZlci5iYWNrKCkpCiAgICAg
1643
+ ICAgdGhyb3cgSW52YWxpZEZsb2F0OwogICAgcmV0dXJuIHNldEZpbmlzaGVk
1644
+ KEJlZ2luLCBQb29sKTsKfQo=
1645
+ c21: |
1646
+ Y2xhc3MgUGFyc2VJbnQ4IDogcHVibGljIFZhbHVlUGFyc2VyIHsKcHVibGlj
1647
+ OgogICAgdHlwZWRlZiBzdGQ6OmludDhfdCBUeXBlOwogICAgZW51bSBQb29s
1648
+ IHsgSW5kZXggPSBQb29sSW5kZXggfTsKCiAgICBjb25zdCBjaGFyKiBQYXJz
1649
+ ZShjb25zdCBjaGFyKiBCZWdpbiwgY29uc3QgY2hhciogRW5kLCBQYXJzZXJQ
1650
+ b29sJiBQb29sKQogICAgICAgIG5vZXhjZXB0KGZhbHNlKTsKfTsK
1651
+ c22: |
1652
+ Y29uc3QgY2hhciogc3BlY2pzb246OlBhcnNlSW50ODo6UGFyc2UoCiAgICBj
1653
+ b25zdCBjaGFyKiBCZWdpbiwgY29uc3QgY2hhciogRW5kLCBQYXJzZXJQb29s
1654
+ JiBQb29sKSBub2V4Y2VwdChmYWxzZSkKewogICAgY29uc3QgY2hhciogZW5k
1655
+ ID0gcGFyc2VfaW50ZWdlcjxUeXBlLAogICAgICAgIHN0ZDo6bnVtZXJpY19s
1656
+ aW1pdHM8VHlwZT46Omxvd2VzdCgpLCBzdGQ6Om51bWVyaWNfbGltaXRzPFR5
1657
+ cGU+OjptYXgoKT4oCiAgICAgICAgICAgIHN0ZDo6Z2V0PFBhcnNlSW50ODo6
1658
+ UG9vbDo6SW5kZXg+KFBvb2wuVmFsdWUpLAogICAgICAgICAgICBCZWdpbiwg
1659
+ RW5kLCBQb29sLmJ1ZmZlciwgZmluaXNoZWQpOwogICAgcmV0dXJuIHNldEZp
1660
+ bmlzaGVkKGVuZCwgUG9vbCk7Cn0K
1661
+ c23: |
1662
+ Y2xhc3MgUGFyc2VJbnQxNiA6IHB1YmxpYyBWYWx1ZVBhcnNlciB7CnB1Ymxp
1663
+ YzoKICAgIHR5cGVkZWYgc3RkOjppbnQxNl90IFR5cGU7CiAgICBlbnVtIFBv
1664
+ b2wgeyBJbmRleCA9IFBvb2xJbmRleCB9OwoKICAgIGNvbnN0IGNoYXIqIFBh
1665
+ cnNlKGNvbnN0IGNoYXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBhcnNl
1666
+ clBvb2wmIFBvb2wpCiAgICAgICAgbm9leGNlcHQoZmFsc2UpOwp9Owo=
1667
+ c24: |
1668
+ Y29uc3QgY2hhciogc3BlY2pzb246OlBhcnNlSW50MTY6OlBhcnNlKAogICAg
1669
+ Y29uc3QgY2hhciogQmVnaW4sIGNvbnN0IGNoYXIqIEVuZCwgUGFyc2VyUG9v
1670
+ bCYgUG9vbCkgbm9leGNlcHQoZmFsc2UpCnsKICAgIGNvbnN0IGNoYXIqIGVu
1671
+ ZCA9IHBhcnNlX2ludGVnZXI8VHlwZSwKICAgICAgICBzdGQ6Om51bWVyaWNf
1672
+ bGltaXRzPFR5cGU+Ojpsb3dlc3QoKSwgc3RkOjpudW1lcmljX2xpbWl0czxU
1673
+ eXBlPjo6bWF4KCk+KAogICAgICAgICAgICBzdGQ6OmdldDxQYXJzZUludDE2
1674
+ OjpQb29sOjpJbmRleD4oUG9vbC5WYWx1ZSksCiAgICAgICAgICAgIEJlZ2lu
1675
+ LCBFbmQsIFBvb2wuYnVmZmVyLCBmaW5pc2hlZCk7CiAgICByZXR1cm4gc2V0
1676
+ RmluaXNoZWQoZW5kLCBQb29sKTsKfQo=
1677
+ c25: |
1678
+ Y2xhc3MgUGFyc2VJbnQzMiA6IHB1YmxpYyBWYWx1ZVBhcnNlciB7CnB1Ymxp
1679
+ YzoKICAgIHR5cGVkZWYgc3RkOjppbnQzMl90IFR5cGU7CiAgICBlbnVtIFBv
1680
+ b2wgeyBJbmRleCA9IFBvb2xJbmRleCB9OwoKICAgIGNvbnN0IGNoYXIqIFBh
1681
+ cnNlKGNvbnN0IGNoYXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBhcnNl
1682
+ clBvb2wmIFBvb2wpCiAgICAgICAgbm9leGNlcHQoZmFsc2UpOwp9Owo=
1683
+ c26: |
1684
+ Y29uc3QgY2hhciogc3BlY2pzb246OlBhcnNlSW50MzI6OlBhcnNlKAogICAg
1685
+ Y29uc3QgY2hhciogQmVnaW4sIGNvbnN0IGNoYXIqIEVuZCwgUGFyc2VyUG9v
1686
+ bCYgUG9vbCkgbm9leGNlcHQoZmFsc2UpCnsKICAgIGNvbnN0IGNoYXIqIGVu
1687
+ ZCA9IHBhcnNlX2ludGVnZXI8VHlwZSwKICAgICAgICBzdGQ6Om51bWVyaWNf
1688
+ bGltaXRzPFR5cGU+Ojpsb3dlc3QoKSwgc3RkOjpudW1lcmljX2xpbWl0czxU
1689
+ eXBlPjo6bWF4KCk+KAogICAgICAgICAgICBzdGQ6OmdldDxQYXJzZUludDMy
1690
+ OjpQb29sOjpJbmRleD4oUG9vbC5WYWx1ZSksCiAgICAgICAgICAgIEJlZ2lu
1691
+ LCBFbmQsIFBvb2wuYnVmZmVyLCBmaW5pc2hlZCk7CiAgICByZXR1cm4gc2V0
1692
+ RmluaXNoZWQoZW5kLCBQb29sKTsKfQo=
1693
+ c27: |
1694
+ Y2xhc3MgUGFyc2VJbnQ2NCA6IHB1YmxpYyBWYWx1ZVBhcnNlciB7CnB1Ymxp
1695
+ YzoKICAgIHR5cGVkZWYgc3RkOjppbnQ2NF90IFR5cGU7CiAgICBlbnVtIFBv
1696
+ b2wgeyBJbmRleCA9IFBvb2xJbmRleCB9OwoKICAgIGNvbnN0IGNoYXIqIFBh
1697
+ cnNlKGNvbnN0IGNoYXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBhcnNl
1698
+ clBvb2wmIFBvb2wpCiAgICAgICAgbm9leGNlcHQoZmFsc2UpOwp9Owo=
1699
+ c28: |
1700
+ Y29uc3QgY2hhciogc3BlY2pzb246OlBhcnNlSW50NjQ6OlBhcnNlKAogICAg
1701
+ Y29uc3QgY2hhciogQmVnaW4sIGNvbnN0IGNoYXIqIEVuZCwgUGFyc2VyUG9v
1702
+ bCYgUG9vbCkgbm9leGNlcHQoZmFsc2UpCnsKICAgIGNvbnN0IGNoYXIqIGVu
1703
+ ZCA9IHBhcnNlX2ludGVnZXI8VHlwZSwKICAgICAgICBzdGQ6Om51bWVyaWNf
1704
+ bGltaXRzPFR5cGU+Ojpsb3dlc3QoKSwgc3RkOjpudW1lcmljX2xpbWl0czxU
1705
+ eXBlPjo6bWF4KCk+KAogICAgICAgICAgICBzdGQ6OmdldDxQYXJzZUludDY0
1706
+ OjpQb29sOjpJbmRleD4oUG9vbC5WYWx1ZSksCiAgICAgICAgICAgIEJlZ2lu
1707
+ LCBFbmQsIFBvb2wuYnVmZmVyLCBmaW5pc2hlZCk7CiAgICByZXR1cm4gc2V0
1708
+ RmluaXNoZWQoZW5kLCBQb29sKTsKfQo=
1709
+ c29: |
1710
+ Y2xhc3MgUGFyc2VVSW50OCA6IHB1YmxpYyBWYWx1ZVBhcnNlciB7CnB1Ymxp
1711
+ YzoKICAgIHR5cGVkZWYgc3RkOjp1aW50OF90IFR5cGU7CiAgICBlbnVtIFBv
1712
+ b2wgeyBJbmRleCA9IFBvb2xJbmRleCB9OwoKICAgIGNvbnN0IGNoYXIqIFBh
1713
+ cnNlKGNvbnN0IGNoYXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBhcnNl
1714
+ clBvb2wmIFBvb2wpCiAgICAgICAgbm9leGNlcHQoZmFsc2UpOwp9Owo=
1715
+ c30: |
1716
+ Y29uc3QgY2hhciogc3BlY2pzb246OlBhcnNlVUludDg6OlBhcnNlKAogICAg
1717
+ Y29uc3QgY2hhciogQmVnaW4sIGNvbnN0IGNoYXIqIEVuZCwgUGFyc2VyUG9v
1718
+ bCYgUG9vbCkgbm9leGNlcHQoZmFsc2UpCnsKICAgIGNvbnN0IGNoYXIqIGVu
1719
+ ZCA9IHBhcnNlX2ludGVnZXI8VHlwZSwKICAgICAgICBzdGQ6Om51bWVyaWNf
1720
+ bGltaXRzPFR5cGU+Ojpsb3dlc3QoKSwgc3RkOjpudW1lcmljX2xpbWl0czxU
1721
+ eXBlPjo6bWF4KCk+KAogICAgICAgICAgICBzdGQ6OmdldDxQYXJzZVVJbnQ4
1722
+ OjpQb29sOjpJbmRleD4oUG9vbC5WYWx1ZSksCiAgICAgICAgICAgIEJlZ2lu
1723
+ LCBFbmQsIFBvb2wuYnVmZmVyLCBmaW5pc2hlZCk7CiAgICByZXR1cm4gc2V0
1724
+ RmluaXNoZWQoZW5kLCBQb29sKTsKfQo=
1725
+ c31: |
1726
+ Y2xhc3MgUGFyc2VVSW50MTYgOiBwdWJsaWMgVmFsdWVQYXJzZXIgewpwdWJs
1727
+ aWM6CiAgICB0eXBlZGVmIHN0ZDo6dWludDE2X3QgVHlwZTsKICAgIGVudW0g
1728
+ UG9vbCB7IEluZGV4ID0gUG9vbEluZGV4IH07CgogICAgY29uc3QgY2hhciog
1729
+ UGFyc2UoY29uc3QgY2hhciogQmVnaW4sIGNvbnN0IGNoYXIqIEVuZCwgUGFy
1730
+ c2VyUG9vbCYgUG9vbCkKICAgICAgICBub2V4Y2VwdChmYWxzZSk7Cn07Cg==
1731
+ c32: |
1732
+ Y29uc3QgY2hhciogc3BlY2pzb246OlBhcnNlVUludDE2OjpQYXJzZSgKICAg
1733
+ IGNvbnN0IGNoYXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBhcnNlclBv
1734
+ b2wmIFBvb2wpIG5vZXhjZXB0KGZhbHNlKQp7CiAgICBjb25zdCBjaGFyKiBl
1735
+ bmQgPSBwYXJzZV9pbnRlZ2VyPFR5cGUsCiAgICAgICAgc3RkOjpudW1lcmlj
1736
+ X2xpbWl0czxUeXBlPjo6bG93ZXN0KCksIHN0ZDo6bnVtZXJpY19saW1pdHM8
1737
+ VHlwZT46Om1heCgpPigKICAgICAgICAgICAgc3RkOjpnZXQ8UGFyc2VVSW50
1738
+ MTY6OlBvb2w6OkluZGV4PihQb29sLlZhbHVlKSwKICAgICAgICAgICAgQmVn
1739
+ aW4sIEVuZCwgUG9vbC5idWZmZXIsIGZpbmlzaGVkKTsKICAgIHJldHVybiBz
1740
+ ZXRGaW5pc2hlZChlbmQsIFBvb2wpOwp9Cg==
1741
+ c33: |
1742
+ Y2xhc3MgUGFyc2VVSW50MzIgOiBwdWJsaWMgVmFsdWVQYXJzZXIgewpwdWJs
1743
+ aWM6CiAgICB0eXBlZGVmIHN0ZDo6dWludDMyX3QgVHlwZTsKICAgIGVudW0g
1744
+ UG9vbCB7IEluZGV4ID0gUG9vbEluZGV4IH07CgogICAgY29uc3QgY2hhciog
1745
+ UGFyc2UoY29uc3QgY2hhciogQmVnaW4sIGNvbnN0IGNoYXIqIEVuZCwgUGFy
1746
+ c2VyUG9vbCYgUG9vbCkKICAgICAgICBub2V4Y2VwdChmYWxzZSk7Cn07Cg==
1747
+ c34: |
1748
+ Y29uc3QgY2hhciogc3BlY2pzb246OlBhcnNlVUludDMyOjpQYXJzZSgKICAg
1749
+ IGNvbnN0IGNoYXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBhcnNlclBv
1750
+ b2wmIFBvb2wpIG5vZXhjZXB0KGZhbHNlKQp7CiAgICBjb25zdCBjaGFyKiBl
1751
+ bmQgPSBwYXJzZV9pbnRlZ2VyPFR5cGUsCiAgICAgICAgc3RkOjpudW1lcmlj
1752
+ X2xpbWl0czxUeXBlPjo6bG93ZXN0KCksIHN0ZDo6bnVtZXJpY19saW1pdHM8
1753
+ VHlwZT46Om1heCgpPigKICAgICAgICAgICAgc3RkOjpnZXQ8UGFyc2VVSW50
1754
+ MzI6OlBvb2w6OkluZGV4PihQb29sLlZhbHVlKSwKICAgICAgICAgICAgQmVn
1755
+ aW4sIEVuZCwgUG9vbC5idWZmZXIsIGZpbmlzaGVkKTsKICAgIHJldHVybiBz
1756
+ ZXRGaW5pc2hlZChlbmQsIFBvb2wpOwp9Cg==
1757
+ c35: |
1758
+ Y2xhc3MgUGFyc2VVSW50NjQgOiBwdWJsaWMgVmFsdWVQYXJzZXIgewpwdWJs
1759
+ aWM6CiAgICB0eXBlZGVmIHN0ZDo6dWludDY0X3QgVHlwZTsKICAgIGVudW0g
1760
+ UG9vbCB7IEluZGV4ID0gUG9vbEluZGV4IH07CgogICAgY29uc3QgY2hhciog
1761
+ UGFyc2UoY29uc3QgY2hhciogQmVnaW4sIGNvbnN0IGNoYXIqIEVuZCwgUGFy
1762
+ c2VyUG9vbCYgUG9vbCkKICAgICAgICBub2V4Y2VwdChmYWxzZSk7Cn07Cg==
1763
+ c36: |
1764
+ Y29uc3QgY2hhciogc3BlY2pzb246OlBhcnNlVUludDY0OjpQYXJzZSgKICAg
1765
+ IGNvbnN0IGNoYXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBhcnNlclBv
1766
+ b2wmIFBvb2wpIG5vZXhjZXB0KGZhbHNlKQp7CiAgICBjb25zdCBjaGFyKiBl
1767
+ bmQgPSBwYXJzZV9pbnRlZ2VyPFR5cGUsCiAgICAgICAgc3RkOjpudW1lcmlj
1768
+ X2xpbWl0czxUeXBlPjo6bG93ZXN0KCksIHN0ZDo6bnVtZXJpY19saW1pdHM8
1769
+ VHlwZT46Om1heCgpPigKICAgICAgICAgICAgc3RkOjpnZXQ8UGFyc2VVSW50
1770
+ NjQ6OlBvb2w6OkluZGV4PihQb29sLlZhbHVlKSwKICAgICAgICAgICAgQmVn
1771
+ aW4sIEVuZCwgUG9vbC5idWZmZXIsIGZpbmlzaGVkKTsKICAgIHJldHVybiBz
1772
+ ZXRGaW5pc2hlZChlbmQsIFBvb2wpOwp9Cg==
1773
+ c37: |
1774
+ dGVtcGxhdGU8dHlwZW5hbWUgUGFyc2VyPgpjbGFzcyBQYXJzZVN0ZFZlY3Rv
1775
+ ciA6IHB1YmxpYyBQYXJzZUFycmF5PHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFBh
1776
+ cnNlcjo6VHlwZT4sIFBhcnNlciwgZmFsc2U+IHsgfTsK
1777
+ c38: |
1778
+ Y2xhc3MgUGFyc2VTdHJpbmcgOiBwdWJsaWMgVmFsdWVQYXJzZXIgewpwdWJs
1779
+ aWM6CiAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nIFR5cGU7Cgpwcml2YXRlOgog
1780
+ ICAgZW51bSBTdGF0ZSB7IE5vcm1hbCwgRXNjYXBlZCwgVW5pY29kZSB9Owog
1781
+ ICAgU3RhdGUgc3RhdGU7CiAgICBpbnQgY291bnQ7CiAgICBjaGFyIGhleF9k
1782
+ aWdpdHNbNF07CgpwdWJsaWM6CiAgICBlbnVtIFBvb2wgeyBJbmRleCA9IFBv
1783
+ b2xJbmRleCB9OwoKICAgIFBhcnNlU3RyaW5nKCkgOiBzdGF0ZShOb3JtYWwp
1784
+ LCBjb3VudCgwKSB7IH0KICAgIGNvbnN0IGNoYXIqIFBhcnNlKGNvbnN0IGNo
1785
+ YXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQsIFBhcnNlclBvb2wmIFBvb2wp
1786
+ CiAgICAgICAgbm9leGNlcHQoZmFsc2UpOwp9Owo=
1787
+ c39: |
1788
+ c3RhdGljIGNvbnN0IEV4Y2VwdGlvbiBTdHJpbmdTdGFydCgiRXhwZWN0ZWQg
1789
+ J1wiJy4iKTsKc3RhdGljIGNvbnN0IEV4Y2VwdGlvbiBTdHJpbmdFc2NhcGUo
1790
+ IlN0cmluZyB3aXRoIHVua25vd24gZXNjYXBlLiIpOwpzdGF0aWMgY29uc3Qg
1791
+ RXhjZXB0aW9uIFN0cmluZ0hleERpZ2l0cygiU3RyaW5nIHdpdGggaW52YWxp
1792
+ ZCBoZXggZGlnaXRzLiIpOwpzdGF0aWMgY29uc3QgRXhjZXB0aW9uIFN0cmlu
1793
+ Z0ludmFsaWRDaGFyYWN0ZXIoIlN0cmluZyB3aXRoIGludmFsaWQgY2hhcmFj
1794
+ dGVyLiIpOwoKY29uc3QgY2hhciogc3BlY2pzb246OlBhcnNlU3RyaW5nOjpQ
1795
+ YXJzZSgKICAgIGNvbnN0IGNoYXIqIEJlZ2luLCBjb25zdCBjaGFyKiBFbmQs
1796
+ IFBhcnNlclBvb2wmIFBvb2wpIG5vZXhjZXB0KGZhbHNlKQp7CiAgICBjb25z
1797
+ dCBjaGFyKiBvcmlnaW4gPSBCZWdpbjsKICAgIFR5cGUmIG91dChzdGQ6Omdl
1798
+ dDxQb29sOjpJbmRleD4oUG9vbC5WYWx1ZSkpOwogICAgYXV0byYgYnVmZmVy
1799
+ KFBvb2wuYnVmZmVyKTsKICAgIGlmIChmaW5pc2hlZCkgewogICAgICAgIGlm
1800
+ ICgqQmVnaW4gIT0gJyInKQogICAgICAgICAgICB0aHJvdyBDb250ZXh0RXhj
1801
+ ZXB0aW9uKFN0cmluZ1N0YXJ0LCBvcmlnaW4sIEJlZ2luLCBFbmQpOwogICAg
1802
+ ICAgIHN0ZDo6Z2V0PFBvb2w6OkluZGV4PihQb29sLlZhbHVlKS5yZXNpemUo
1803
+ MCk7CiAgICAgICAgKytCZWdpbjsKICAgIH0KICAgIHdoaWxlIChCZWdpbiAh
1804
+ PSBFbmQpIHsKICAgICAgICBpZiAoc3RhdGUgPT0gTm9ybWFsKSB7CiAgICAg
1805
+ ICAgICAgIHdoaWxlIChCZWdpbiAhPSBFbmQpIHsKICAgICAgICAgICAgICAg
1806
+ IGlmICgqQmVnaW4gIT0gJ1xcJykgewogICAgICAgICAgICAgICAgICAgIGlm
1807
+ ICgqQmVnaW4gIT0gJyInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlm
1808
+ IGNvbnN0ZXhwciAoc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCkgPCAwKSB7CiAg
1809
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWduZWQgY2hhci4KICAg
1810
+ ICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDw9ICpCZWdpbiAmJiAq
1811
+ QmVnaW4gPCAzMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
1812
+ aHJvdyBTdHJpbmdJbnZhbGlkQ2hhcmFjdGVyOwogICAgICAgICAgICAgICAg
1813
+ ICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAg
1814
+ aWYgKCpCZWdpbiA8IDMyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
1815
+ ICAgIHRocm93IFN0cmluZ0ludmFsaWRDaGFyYWN0ZXI7CiAgICAgICAgICAg
1816
+ ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVy
1817
+ LnB1c2hfYmFjaygqQmVnaW4rKyk7CiAgICAgICAgICAgICAgICAgICAgfSBl
1818
+ bHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChidWZm
1819
+ ZXIuYmVnaW4oKSwgYnVmZmVyLmVuZCgpKTsKICAgICAgICAgICAgICAgICAg
1820
+ ICAgICAgcmV0dXJuIHNldEZpbmlzaGVkKEJlZ2luICsgMSwgUG9vbCk7CiAg
1821
+ ICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsK
1822
+ ICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEVzY2FwZWQ7CiAgICAgICAg
1823
+ ICAgICAgICAgICAgKytCZWdpbjsKICAgICAgICAgICAgICAgICAgICBicmVh
1824
+ azsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0g
1825
+ ZWxzZSBpZiAoc3RhdGUgPT0gVW5pY29kZSkgewogICAgICAgICAgICBoZXhf
1826
+ ZGlnaXRzW2NvdW50KytdID0gKkJlZ2luKys7CiAgICAgICAgICAgIGlmIChj
1827
+ b3VudCA8IDQpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAg
1828
+ ICAgY291bnQgPSAwOwogICAgICAgICAgICBzdGF0ZSA9IE5vcm1hbDsKICAg
1829
+ ICAgICAgICAgaW50IHZhbHVlID0gMDsKICAgICAgICAgICAgZm9yIChpbnQg
1830
+ ayA9IDA7IGsgPCA0OyArK2spIHsKICAgICAgICAgICAgICAgIGludCBtID0g
1831
+ MDsKICAgICAgICAgICAgICAgIGlmICgnMCcgPD0gaGV4X2RpZ2l0c1trXSAm
1832
+ JiBoZXhfZGlnaXRzW2tdIDw9ICc5JykKICAgICAgICAgICAgICAgICAgICBt
1833
+ ID0gaGV4X2RpZ2l0c1trXSAtICcwJzsKICAgICAgICAgICAgICAgIGVsc2Ug
1834
+ aWYgKCdhJyA8PSBoZXhfZGlnaXRzW2tdICYmIGhleF9kaWdpdHNba10gPD0g
1835
+ J2YnKQogICAgICAgICAgICAgICAgICAgIG0gPSAxMCArIGhleF9kaWdpdHNb
1836
+ a10gLSAnYSc7CiAgICAgICAgICAgICAgICBlbHNlIGlmICgnQScgPD0gaGV4
1837
+ X2RpZ2l0c1trXSAmJiBoZXhfZGlnaXRzW2tdIDw9ICdGJykKICAgICAgICAg
1838
+ ICAgICAgICAgICBtID0gMTAgKyBoZXhfZGlnaXRzW2tdIC0gJ0EnOwogICAg
1839
+ ICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHRocm93IENv
1840
+ bnRleHRFeGNlcHRpb24oU3RyaW5nSGV4RGlnaXRzLCBvcmlnaW4sIEJlZ2lu
1841
+ LCBFbmQpOwogICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgNCkg
1842
+ KyBtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2YWx1ZSA8IDB4
1843
+ ODApCiAgICAgICAgICAgICAgICBidWZmZXIucHVzaF9iYWNrKHN0YXRpY19j
1844
+ YXN0PGNoYXI+KHZhbHVlKSk7CiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVl
1845
+ IDwgMHg4MDApIHsKICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoX2JhY2so
1846
+ c3RhdGljX2Nhc3Q8Y2hhcj4oMHhjMCB8ICgodmFsdWUgPj4gNikgJiAweDFm
1847
+ KSkpOwogICAgICAgICAgICAgICAgYnVmZmVyLnB1c2hfYmFjayhzdGF0aWNf
1848
+ Y2FzdDxjaGFyPigweDgwIHwgKHZhbHVlICYgMHgzZikpKTsKICAgICAgICAg
1849
+ ICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoX2JhY2so
1850
+ c3RhdGljX2Nhc3Q8Y2hhcj4oMHhlMCB8ICgodmFsdWUgPj4gMTIpICYgMHhm
1851
+ KSkpOwogICAgICAgICAgICAgICAgYnVmZmVyLnB1c2hfYmFjayhzdGF0aWNf
1852
+ Y2FzdDxjaGFyPigweDgwIHwgKCh2YWx1ZSA+PiA2KSAmIDB4M2YpKSk7CiAg
1853
+ ICAgICAgICAgICAgICBidWZmZXIucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNo
1854
+ YXI+KDB4ODAgfCAodmFsdWUgJiAweDNmKSkpOwogICAgICAgICAgICB9CiAg
1855
+ ICAgICAgfSBlbHNlIHsgLy8gRXNjYXBlZC4KICAgICAgICAgICAgc3RhdGUg
1856
+ PSBOb3JtYWw7CiAgICAgICAgICAgIHN3aXRjaCAoKkJlZ2luKSB7CiAgICAg
1857
+ ICAgICAgIGNhc2UgJyInOgogICAgICAgICAgICBjYXNlICcvJzoKICAgICAg
1858
+ ICAgICAgY2FzZSAnXFwnOgogICAgICAgICAgICAgICAgYnVmZmVyLnB1c2hf
1859
+ YmFjaygqQmVnaW4pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg
1860
+ ICAgIGNhc2UgJ2InOiBidWZmZXIucHVzaF9iYWNrKCdcYicpOyBicmVhazsK
1861
+ ICAgICAgICAgICAgY2FzZSAnZic6IGJ1ZmZlci5wdXNoX2JhY2soJ1xmJyk7
1862
+ IGJyZWFrOwogICAgICAgICAgICBjYXNlICduJzogYnVmZmVyLnB1c2hfYmFj
1863
+ aygnXG4nKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3InOiBidWZmZXIu
1864
+ cHVzaF9iYWNrKCdccicpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAndCc6
1865
+ IGJ1ZmZlci5wdXNoX2JhY2soJ1x0Jyk7IGJyZWFrOwogICAgICAgICAgICBj
1866
+ YXNlICd1Jzogc3RhdGUgPSBVbmljb2RlOyBicmVhazsKICAgICAgICAgICAg
1867
+ ZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IENvbnRleHRFeGNlcHRp
1868
+ b24oU3RyaW5nRXNjYXBlLCBvcmlnaW4sIEJlZ2luLCBFbmQpOwogICAgICAg
1869
+ ICAgICB9CiAgICAgICAgICAgICsrQmVnaW47CiAgICAgICAgfQogICAgfQog
1870
+ ICAgcmV0dXJuIHNldEZpbmlzaGVkKG51bGxwdHIsIFBvb2wpOwp9Cg==
1871
+ c40: |
1872
+ dGVtcGxhdGU8dHlwZW5hbWUgU2luaz4Kdm9pZCBXcml0ZShTaW5rJiBTLCBi
1873
+ b29sIFZhbHVlLCBzdGQ6OnZlY3RvcjxjaGFyPiYgQnVmZmVyKSB7CiAgICBp
1874
+ ZiAoVmFsdWUpCiAgICAgICAgUy53cml0ZSgidHJ1ZSIsIDQpOwogICAgZWxz
1875
+ ZQogICAgICAgIFMud3JpdGUoImZhbHNlIiwgNSk7Cn0K
1876
+ c41: |
1877
+ ZXh0ZXJuIGNvbnN0IEV4Y2VwdGlvbiBEb3VibGVOb3RGaW5pdGU7CmV4dGVy
1878
+ biBjb25zdCBjaGFyKiBXcml0ZURvdWJsZUZvcm1hdDsKCnRlbXBsYXRlPHR5
1879
+ cGVuYW1lIFNpbms+CnZvaWQgV3JpdGUoU2luayYgUywgZG91YmxlIFZhbHVl
1880
+ LCBzdGQ6OnZlY3RvcjxjaGFyPiYgQnVmZmVyKSB7CiAgICBpZiAoaXNmaW5p
1881
+ dGUoVmFsdWUpKQogICAgICAgIFdyaXRlU2NhbGFyVHlwZTxTaW5rLGRvdWJs
1882
+ ZSxXcml0ZURvdWJsZUZvcm1hdD4oUywgVmFsdWUsIEJ1ZmZlcik7CiAgICBl
1883
+ bHNlCiAgICAgICAgdGhyb3cgRG91YmxlTm90RmluaXRlOwp9Cg==
1884
+ c42: |
1885
+ Y29uc3QgRXhjZXB0aW9uIHNwZWNqc29uOjpEb3VibGVOb3RGaW5pdGUoIkRv
1886
+ dWJsZSBub3QgZmluaXRlLiIpOwpzdGF0aWMgY2hhciBXcml0ZURvdWJsZUZv
1887
+ cm1hdEJ1ZmZlcltdID0gIjEyMzQ1NjciOwpzdGF0aWMgY29uc3QgY2hhciog
1888
+ V3JpdGVEb3VibGVGb3JtYXRDb250ZW50ID0KICAgIGZsb2F0aW5nX3BvaW50
1889
+ X2Zvcm1hdDxkb3VibGU+KFdyaXRlRG91YmxlRm9ybWF0QnVmZmVyKTsKY29u
1890
+ c3QgY2hhciogc3BlY2pzb246OldyaXRlRG91YmxlRm9ybWF0ID0gcmVpbnRl
1891
+ cnByZXRfY2FzdDxjb25zdCBjaGFyKj4oV3JpdGVEb3VibGVGb3JtYXRCdWZm
1892
+ ZXIpOwo=
1893
+ c43: |
1894
+ ZXh0ZXJuIGNvbnN0IEV4Y2VwdGlvbiBGbG9hdE5vdEZpbml0ZTsKZXh0ZXJu
1895
+ IGNvbnN0IGNoYXIqIFdyaXRlRmxvYXRGb3JtYXQ7Cgp0ZW1wbGF0ZTx0eXBl
1896
+ bmFtZSBTaW5rPgp2b2lkIFdyaXRlKFNpbmsmIFMsIGZsb2F0IFZhbHVlLCBz
1897
+ dGQ6OnZlY3RvcjxjaGFyPiYgQnVmZmVyKSB7CiAgICBpZiAoaXNmaW5pdGUo
1898
+ VmFsdWUpKQogICAgICAgIFdyaXRlU2NhbGFyVHlwZTxTaW5rLGZsb2F0LFdy
1899
+ aXRlRmxvYXRGb3JtYXQ+KFMsIFZhbHVlLCBCdWZmZXIpOwogICAgZWxzZQog
1900
+ ICAgICAgIHRocm93IEZsb2F0Tm90RmluaXRlOwp9Cg==
1901
+ c44: |
1902
+ Y29uc3QgRXhjZXB0aW9uIHNwZWNqc29uOjpGbG9hdE5vdEZpbml0ZSgiRmxv
1903
+ YXQgbm90IGZpbml0ZS4iKTsKc3RhdGljIGNoYXIgV3JpdGVGbG9hdEZvcm1h
1904
+ dEJ1ZmZlcltdID0gIjEyMzQ1NjciOwpzdGF0aWMgY29uc3QgY2hhciogV3Jp
1905
+ dGVGbG9hdEZvcm1hdENvbnRlbnQgPQogICAgZmxvYXRpbmdfcG9pbnRfZm9y
1906
+ bWF0PGZsb2F0PihXcml0ZUZsb2F0Rm9ybWF0QnVmZmVyKTsKY29uc3QgY2hh
1907
+ ciogc3BlY2pzb246OldyaXRlRmxvYXRGb3JtYXQgPSByZWludGVycHJldF9j
1908
+ YXN0PGNvbnN0IGNoYXIqPihXcml0ZUZsb2F0Rm9ybWF0QnVmZmVyKTsK
1909
+ c45: |
1910
+ Ly8gRm9ybWF0IG11c3QgYmUgYSBjb25zdCBjaGFyIGFycmF5Lgp0ZW1wbGF0
1911
+ ZTx0eXBlbmFtZSBTaW5rLCB0eXBlbmFtZSBULCBjb25zdCBhdXRvJiBGb3Jt
1912
+ YXQ+CnZvaWQgV3JpdGVTY2FsYXJUeXBlKFNpbmsmIFMsIFQgVmFsdWUsIHN0
1913
+ ZDo6dmVjdG9yPGNoYXI+JiBCdWZmZXIpIHsKICAgIGludCBjb3VudCA9IHNu
1914
+ cHJpbnRmKCZCdWZmZXIuZnJvbnQoKSwgQnVmZmVyLnNpemUoKSwgRm9ybWF0
1915
+ LCBWYWx1ZSk7CiAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihCdWZmZXIuc2l6
1916
+ ZSgpKSA8PSBjb3VudCkgewogICAgICAgIEJ1ZmZlci5yZXNpemUoY291bnQg
1917
+ KyAxKTsKICAgICAgICBjb3VudCA9IHNucHJpbnRmKCZCdWZmZXIuZnJvbnQo
1918
+ KSwgQnVmZmVyLnNpemUoKSwgRm9ybWF0LCBWYWx1ZSk7CiAgICB9CiAgICBT
1919
+ LndyaXRlKCZCdWZmZXIuZnJvbnQoKSwgY291bnQpOwp9Cg==
1920
+ c46: |
1921
+ dGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RhdGljIGNvbnN0IGNoYXIqIGZsb2F0
1922
+ aW5nX3BvaW50X2Zvcm1hdChjaGFyKiBCdWZmZXIpIHsKICAgIHNucHJpbnRm
1923
+ KEJ1ZmZlciwgc3RybGVuKEJ1ZmZlciksCiAgICAgICAgIiUlLiVpZyIsIHN0
1924
+ ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwKTsKICAgIHJldHVybiBC
1925
+ dWZmZXI7Cn0K
1926
+ c47: |
1927
+ dGVtcGxhdGU8dHlwZW5hbWUgU2luaywgdHlwZW5hbWUgRm9yd2FyZEl0ZXJh
1928
+ dG9yPgp2b2lkIFdyaXRlKFNpbmsmIFMsCiAgICBGb3J3YXJkSXRlcmF0b3Im
1929
+ IEJlZ2luLCBGb3J3YXJkSXRlcmF0b3ImIEVuZCwgc3RkOjp2ZWN0b3I8Y2hh
1930
+ cj4mIEJ1ZmZlcikKewogICAgY2hhciBjID0gJ1snOwogICAgUy53cml0ZSgm
1931
+ YywgMSk7CiAgICBpZiAoQmVnaW4gIT0gRW5kKSB7CiAgICAgICAgV3JpdGUo
1932
+ UywgKkJlZ2luLCBCdWZmZXIpOwogICAgICAgIGMgPSAnLCc7CiAgICAgICAg
1933
+ d2hpbGUgKCsrQmVnaW4gIT0gRW5kKSB7CiAgICAgICAgICAgIFMud3JpdGUo
1934
+ JmMsIDEpOwogICAgICAgICAgICBXcml0ZShTLCAqQmVnaW4sIEJ1ZmZlcik7
1935
+ CiAgICAgICAgfQogICAgfQogICAgYyA9ICddJzsKICAgIFMud3JpdGUoJmMs
1936
+ IDEpOwp9Cg==
1937
+ c48: |
1938
+ ZXh0ZXJuIGNvbnN0IGNoYXIqIFdyaXRlSW50OEZvcm1hdDsKdGVtcGxhdGU8
1939
+ dHlwZW5hbWUgU2luaz4Kdm9pZCBXcml0ZShTaW5rJiBTLCBzdGQ6OmludDhf
1940
+ dCBWYWx1ZSwgc3RkOjp2ZWN0b3I8Y2hhcj4mIEJ1ZmZlcikgewogICAgV3Jp
1941
+ dGVTY2FsYXJUeXBlPFNpbmssc3RkOjppbnQ4X3QsV3JpdGVJbnQ4Rm9ybWF0
1942
+ PihTLCBWYWx1ZSwgQnVmZmVyKTsKfQo=
1943
+ c49: |
1944
+ Y29uc3QgY2hhciogc3BlY2pzb246OldyaXRlSW50OEZvcm1hdCA9ICIlIiBQ
1945
+ UklpODsK
1946
+ c50: |
1947
+ ZXh0ZXJuIGNvbnN0IGNoYXIqIFdyaXRlSW50MTZGb3JtYXQ7CnRlbXBsYXRl
1948
+ PHR5cGVuYW1lIFNpbms+CnZvaWQgV3JpdGUoU2luayYgUywgc3RkOjppbnQx
1949
+ Nl90IFZhbHVlLCBzdGQ6OnZlY3RvcjxjaGFyPiYgQnVmZmVyKSB7CiAgICBX
1950
+ cml0ZVNjYWxhclR5cGU8U2luayxzdGQ6OmludDE2X3QsV3JpdGVJbnQxNkZv
1951
+ cm1hdD4oUywgVmFsdWUsIEJ1ZmZlcik7Cn0K
1952
+ c51: |
1953
+ Y29uc3QgY2hhciogc3BlY2pzb246OldyaXRlSW50MTZGb3JtYXQgPSAiJSIg
1954
+ UFJJaTE2Owo=
1955
+ c52: |
1956
+ ZXh0ZXJuIGNvbnN0IGNoYXIqIFdyaXRlSW50MzJGb3JtYXQ7CnRlbXBsYXRl
1957
+ PHR5cGVuYW1lIFNpbms+CnZvaWQgV3JpdGUoU2luayYgUywgc3RkOjppbnQz
1958
+ Ml90IFZhbHVlLCBzdGQ6OnZlY3RvcjxjaGFyPiYgQnVmZmVyKSB7CiAgICBX
1959
+ cml0ZVNjYWxhclR5cGU8U2luayxzdGQ6OmludDMyX3QsV3JpdGVJbnQzMkZv
1960
+ cm1hdD4oUywgVmFsdWUsIEJ1ZmZlcik7Cn0K
1961
+ c53: |
1962
+ Y29uc3QgY2hhciogc3BlY2pzb246OldyaXRlSW50MzJGb3JtYXQgPSAiJSIg
1963
+ UFJJaTMyOwo=
1964
+ c54: |
1965
+ ZXh0ZXJuIGNvbnN0IGNoYXIqIFdyaXRlSW50NjRGb3JtYXQ7CnRlbXBsYXRl
1966
+ PHR5cGVuYW1lIFNpbms+CnZvaWQgV3JpdGUoU2luayYgUywgc3RkOjppbnQ2
1967
+ NF90IFZhbHVlLCBzdGQ6OnZlY3RvcjxjaGFyPiYgQnVmZmVyKSB7CiAgICBX
1968
+ cml0ZVNjYWxhclR5cGU8U2luayxzdGQ6OmludDY0X3QsV3JpdGVJbnQ2NEZv
1969
+ cm1hdD4oUywgVmFsdWUsIEJ1ZmZlcik7Cn0K
1970
+ c55: |
1971
+ Y29uc3QgY2hhciogc3BlY2pzb246OldyaXRlSW50NjRGb3JtYXQgPSAiJSIg
1972
+ UFJJaTY0Owo=
1973
+ c56: |
1974
+ ZXh0ZXJuIGNvbnN0IGNoYXIqIFdyaXRlVUludDhGb3JtYXQ7CnRlbXBsYXRl
1975
+ PHR5cGVuYW1lIFNpbms+CnZvaWQgV3JpdGUoU2luayYgUywgc3RkOjp1aW50
1976
+ OF90IFZhbHVlLCBzdGQ6OnZlY3RvcjxjaGFyPiYgQnVmZmVyKSB7CiAgICBX
1977
+ cml0ZVNjYWxhclR5cGU8U2luayxzdGQ6OnVpbnQ4X3QsV3JpdGVVSW50OEZv
1978
+ cm1hdD4oUywgVmFsdWUsIEJ1ZmZlcik7Cn0K
1979
+ c57: |
1980
+ Y29uc3QgY2hhciogc3BlY2pzb246OldyaXRlVUludDhGb3JtYXQgPSAiJSIg
1981
+ UFJJdTg7Cg==
1982
+ c58: |
1983
+ ZXh0ZXJuIGNvbnN0IGNoYXIqIFdyaXRlVUludDE2Rm9ybWF0Owp0ZW1wbGF0
1984
+ ZTx0eXBlbmFtZSBTaW5rPgp2b2lkIFdyaXRlKFNpbmsmIFMsIHN0ZDo6dWlu
1985
+ dDE2X3QgVmFsdWUsIHN0ZDo6dmVjdG9yPGNoYXI+JiBCdWZmZXIpIHsKICAg
1986
+ IFdyaXRlU2NhbGFyVHlwZTxTaW5rLHN0ZDo6dWludDE2X3QsV3JpdGVVSW50
1987
+ MTZGb3JtYXQ+KFMsIFZhbHVlLCBCdWZmZXIpOwp9Cg==
1988
+ c59: |
1989
+ Y29uc3QgY2hhciogc3BlY2pzb246OldyaXRlVUludDE2Rm9ybWF0ID0gIiUi
1990
+ IFBSSXUxNjsK
1991
+ c60: |
1992
+ ZXh0ZXJuIGNvbnN0IGNoYXIqIFdyaXRlVUludDMyRm9ybWF0Owp0ZW1wbGF0
1993
+ ZTx0eXBlbmFtZSBTaW5rPgp2b2lkIFdyaXRlKFNpbmsmIFMsIHN0ZDo6dWlu
1994
+ dDMyX3QgVmFsdWUsIHN0ZDo6dmVjdG9yPGNoYXI+JiBCdWZmZXIpIHsKICAg
1995
+ IFdyaXRlU2NhbGFyVHlwZTxTaW5rLHN0ZDo6dWludDMyX3QsV3JpdGVVSW50
1996
+ MzJGb3JtYXQ+KFMsIFZhbHVlLCBCdWZmZXIpOwp9Cg==
1997
+ c61: |
1998
+ Y29uc3QgY2hhciogc3BlY2pzb246OldyaXRlVUludDMyRm9ybWF0ID0gIiUi
1999
+ IFBSSXUzMjsK
2000
+ c62: |
2001
+ ZXh0ZXJuIGNvbnN0IGNoYXIqIFdyaXRlVUludDY0Rm9ybWF0Owp0ZW1wbGF0
2002
+ ZTx0eXBlbmFtZSBTaW5rPgp2b2lkIFdyaXRlKFNpbmsmIFMsIHN0ZDo6dWlu
2003
+ dDY0X3QgVmFsdWUsIHN0ZDo6dmVjdG9yPGNoYXI+JiBCdWZmZXIpIHsKICAg
2004
+ IFdyaXRlU2NhbGFyVHlwZTxTaW5rLHN0ZDo6dWludDY0X3QsV3JpdGVVSW50
2005
+ NjRGb3JtYXQ+KFMsIFZhbHVlLCBCdWZmZXIpOwp9Cg==
2006
+ c63: |
2007
+ Y29uc3QgY2hhciogc3BlY2pzb246OldyaXRlVUludDY0Rm9ybWF0ID0gIiUi
2008
+ IFBSSXU2NDsK
2009
+ c64: |
2010
+ dGVtcGxhdGU8dHlwZW5hbWUgU2luaywgdHlwZW5hbWUgVD4Kdm9pZCBXcml0
2011
+ ZShTaW5rJiBTLCBjb25zdCBUKiBWYWx1ZSwgc3RkOjp2ZWN0b3I8Y2hhcj4m
2012
+ IEJ1ZmZlcikgewogICAgaWYgKFZhbHVlICE9IG51bGxwdHIpCiAgICAgICAg
2013
+ V3JpdGUoUywgKlZhbHVlLCBCdWZmZXIpOwogICAgZWxzZSB7CiAgICAgICAg
2014
+ Y2hhciBudWxsW10gPSAibnVsbCI7CiAgICAgICAgUy53cml0ZSgmbnVsbCwg
2015
+ NCk7CiAgICB9Cn0K
2016
+ c65: |
2017
+ dGVtcGxhdGU8dHlwZW5hbWUgU2luaywgdHlwZW5hbWUgVD4Kdm9pZCBXcml0
2018
+ ZShTaW5rJiBTLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiYgVmFsdWUsIHN0ZDo6
2019
+ dmVjdG9yPGNoYXI+JiBCdWZmZXIpIHsKICAgIGF1dG8gYiA9IFZhbHVlLmNi
2020
+ ZWdpbigpOwogICAgYXV0byBlID0gVmFsdWUuY2VuZCgpOwogICAgV3JpdGU8
2021
+ U2luayx0eXBlbmFtZSBzdGQ6OnZlY3RvcjxUPjo6Y29uc3RfaXRlcmF0b3I+
2022
+ KFMsIGIsIGUsIEJ1ZmZlcik7Cn0K
2023
+ c66: |
2024
+ ZXh0ZXJuIGNvbnN0IEV4Y2VwdGlvbiBJbnZhbGlkSlNPTkNoYXJhY3RlcjsK
2025
+ CnRlbXBsYXRlPHR5cGVuYW1lIFNpbms+CnZvaWQgV3JpdGUoCiAgICBTaW5r
2026
+ JiBTLCBjb25zdCBjaGFyKiBCZWdpbiwgY29uc3QgY2hhciogRW5kLCBzdGQ6
2027
+ OnZlY3RvcjxjaGFyPiYgQnVmZmVyKQp7CiAgICBjaGFyIHF1b3RlID0gJyIn
2028
+ OwogICAgY2hhciBlc2NhcGVkWzJdID0geyAnXFwnLCAnXHgwJyB9OwogICAg
2029
+ Uy53cml0ZSgmcXVvdGUsIDEpOwogICAgZm9yIChjb25zdCBjaGFyKiBjdXJy
2030
+ ID0gQmVnaW47IGN1cnIgPCBFbmQ7ICsrY3VycikgewogICAgICAgIHN3aXRj
2031
+ aCAoKmN1cnIpIHsKICAgICAgICBjYXNlICciJzogZXNjYXBlZFsxXSA9ICci
2032
+ JzsgYnJlYWs7CiAgICAgICAgY2FzZSAnXFwnOiBlc2NhcGVkWzFdID0gJ1xc
2033
+ JzsgYnJlYWs7CiAgICAgICAgY2FzZSAnXG4nOiBlc2NhcGVkWzFdID0gJ24n
2034
+ OyBicmVhazsKICAgICAgICBjYXNlICdcdCc6IGVzY2FwZWRbMV0gPSAndCc7
2035
+ IGJyZWFrOwogICAgICAgIGNhc2UgJ1xyJzogZXNjYXBlZFsxXSA9ICdyJzsg
2036
+ YnJlYWs7CiAgICAgICAgY2FzZSAnXGYnOiBlc2NhcGVkWzFdID0gJ2YnOyBi
2037
+ cmVhazsKICAgICAgICBjYXNlICdcYic6IGVzY2FwZWRbMV0gPSAnYic7IGJy
2038
+ ZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZXNjYXBlZFsxXSkgewogICAg
2039
+ ICAgICAgICBTLndyaXRlKEJlZ2luLCBjdXJyIC0gQmVnaW4pOwogICAgICAg
2040
+ ICAgICBTLndyaXRlKGVzY2FwZWQsIDIpOwogICAgICAgICAgICBlc2NhcGVk
2041
+ WzFdID0gMDsKICAgICAgICAgICAgQmVnaW4gPSBjdXJyICsgMTsKICAgICAg
2042
+ ICB9IGVsc2UgewogICAgICAgICAgICBpZiBjb25zdGV4cHIgKCdceDgwJyA8
2043
+ IDApIHsKICAgICAgICAgICAgICAgIGlmICgwIDw9ICpjdXJyICYmICpjdXJy
2044
+ IDwgJ1x4MjAnKQogICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRK
2045
+ U09OQ2hhcmFjdGVyOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAg
2046
+ ICAgICAgaWYgKCpjdXJyIDwgJ1x4MjAnKQogICAgICAgICAgICAgICAgICAg
2047
+ IHRocm93IEludmFsaWRKU09OQ2hhcmFjdGVyOwogICAgICAgICAgICB9CiAg
2048
+ ICAgICAgfQogICAgfQogICAgaWYgKEJlZ2luIDwgRW5kKQogICAgICAgIFMu
2049
+ d3JpdGUoQmVnaW4sIEVuZCAtIEJlZ2luKTsKICAgIFMud3JpdGUoJnF1b3Rl
2050
+ LCAxKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgU2luaz4Kdm9pZCBXcml0ZShT
2051
+ aW5rJiBTLCBjb25zdCBzdGQ6OnN0cmluZyYgVmFsdWUsIHN0ZDo6dmVjdG9y
2052
+ PGNoYXI+JiBCdWZmZXIpIHsKICAgIFdyaXRlKFMsIFZhbHVlLmNfc3RyKCks
2053
+ IFZhbHVlLmNfc3RyKCkgKyBWYWx1ZS5zaXplKCksIEJ1ZmZlcik7Cn0KCnRl
2054
+ bXBsYXRlPHR5cGVuYW1lIFNpbms+CnZvaWQgV3JpdGUoU2luayYgUywgY29u
2055
+ c3QgY2hhciogVmFsdWUsIHN0ZDo6dmVjdG9yPGNoYXI+JiBCdWZmZXIpIHsK
2056
+ ICAgIGlmIChWYWx1ZSAhPSBudWxscHRyKQogICAgICAgIFdyaXRlKFMsIFZh
2057
+ bHVlLCBWYWx1ZSArIHN0ZDo6c3RybGVuKFZhbHVlKSwgQnVmZmVyKTsKICAg
2058
+ IGVsc2UgewogICAgICAgIGNoYXIgbnVsbFtdID0gIm51bGwiOwogICAgICAg
2059
+ IFMud3JpdGUobnVsbCwgNCk7CiAgICB9Cn0K
2060
+ c67: |
2061
+ Y29uc3QgRXhjZXB0aW9uIHNwZWNqc29uOjpJbnZhbGlkSlNPTkNoYXJhY3Rl
2062
+ cigiSW52YWxpZCBKU09OIGNoYXJhY3Rlci4iKTsK
2063
+ ))
2064
+ #PIECESASSIGNMENTEND#
2065
+
2066
+ if $CLEAN
2067
+ $PIECES = {}
2068
+ $FILECONTENTS = {}
2069
+ end
2070
+
2071
+ $FILECONTENTS.each_pair do |key, value|
2072
+ $FILECONTENTS[key] = Base64.decode64(value)
2073
+ end
2074
+
2075
+ $DEFAULT = %(---
2076
+ piece:
2077
+ includes: [] # Lines or blocks of (conditional) includes inserted in header.
2078
+ source_includes: [] # As above but inserted in source file.
2079
+ requires: [] # Other piece names that are required.
2080
+ writer: false # Only true for pieces that have Write-function template.
2081
+ scalar: true # True when piece parses a simple scalar value (int, string).
2082
+ external: true # True when user can use the piece name in input specification.
2083
+ declaration: ~ # Forward declaration for header file.
2084
+ parsername: ~ # Parser class name.
2085
+ pooled: ~ # ParserPool index replaces this string for parsers that use pool.
2086
+ # These can only be given if pooled is not specified.
2087
+ poolindexes: ~ # ParserPool Parsers enum contents replace this string.
2088
+ poolparsers: ~ # ParserPool Parser tuple contents replace this string.
2089
+ poolparsertypes: ~ # ParserPool Value tuple contents replace this string.
2090
+ specification:
2091
+ namespace: specjson # Name space for output files.
2092
+ full: false # Include unused parsers.
2093
+ requires: [] # Pieces that are needed by code but not specified in types.
2094
+ types: { } # Type names mapped to field specification objects.
2095
+ generate: { } # Type names from types mapped to code generate instructions.
2096
+ header_extension: hpp # Header file name extension. Used if header not given.
2097
+ source_extension: cpp # Source file name extension. Used if source not given.
2098
+ header: ~ # Specification name.header_extension unless given.
2099
+ source: ~ # Specification name.source_extension unless given.
2100
+ types: # An object with field name mapped to object below.
2101
+ format: REQUIRED # Piece name string or array of piece names.
2102
+ required: true # Indicates whether field must be present in object.
2103
+ checker: ~ # String inserted to code to check optional field in Write.
2104
+ accessor: ~ # String inserted to code to get field value in Write.
2105
+ generate:
2106
+ parser: false # Produce parser code for the type.
2107
+ writer: false # Produce Write function and template for the type.
2108
+ )
2109
+
2110
+ puts($DEFAULT) if $DOC
2111
+
2112
+ $DEFAULT = YAML.safe_load($DEFAULT)
2113
+
2114
+ def aargh(message, exit_code = nil)
2115
+ $stderr.puts message
2116
+ exit exit_code unless exit_code.nil?
2117
+ end
2118
+
2119
+ def load_piece_file(piece, field, directory)
2120
+ filename = piece.fetch(field, nil)
2121
+ if filename.nil?
2122
+ piece[field] = nil
2123
+ piece["#{field}_stored"] = nil
2124
+ return
2125
+ end
2126
+ begin
2127
+ filename = File.realpath(filename, directory)
2128
+ puts filename
2129
+ f = File.new(filename, 'r')
2130
+ content = IO.read(f)
2131
+ f.close
2132
+ rescue StandardError
2133
+ aargh("Failed to open/read: #{filename}", 3)
2134
+ end
2135
+ stored = $FILECONTENTS.key(content)
2136
+ if stored.nil?
2137
+ stored = "c#{$FILECONTENTS.size}"
2138
+ $FILECONTENTS[stored] = content
2139
+ end
2140
+ piece["#{field}_stored"] = stored
2141
+ end
2142
+
2143
+ def defaults(kind, spec)
2144
+ $DEFAULT[kind].each_pair do |field, value|
2145
+ if spec.key? field
2146
+ if value.is_a?(Array) && !spec[field].is_a?(Array)
2147
+ spec[field] = [ spec[field] ]
2148
+ end
2149
+ else
2150
+ spec[field] = value
2151
+ end
2152
+ end
2153
+ end
2154
+
2155
+ def default(spec, field, value)
2156
+ spec[field] = value unless spec.key? field
2157
+ end
2158
+
2159
+ def check_given(spec, kind, field, error)
2160
+ aargh(error, 4) unless spec[field] != $DEFAULT[kind][field]
2161
+ end
2162
+
2163
+ def load_spec(filename, root = nil)
2164
+ begin
2165
+ unless root.nil?
2166
+ filename = File.realpath(filename, root)
2167
+ puts filename
2168
+ end
2169
+ f = File.open(filename, 'r')
2170
+ input = IO.read(f)
2171
+ f.close
2172
+ rescue StandardError
2173
+ aargh("Failed to find/read #{filename}", 3)
2174
+ end
2175
+ begin
2176
+ specs = JSON.parse(input)
2177
+ rescue StandardError
2178
+ begin
2179
+ specs = YAML.safe_load(input)
2180
+ rescue StandardError
2181
+ aargh("#{filename} neither JSON nor YAML.", 3)
2182
+ end
2183
+ end
2184
+ specs
2185
+ end
2186
+
2187
+ unless $RECIPE.nil?
2188
+ recipe = load_spec($RECIPE)
2189
+ root = File.dirname(File.realpath($RECIPE))
2190
+ unless recipe.is_a? Array
2191
+ aargh('Recipe file must be a YAML array of file names.', 2)
2192
+ end
2193
+ recipe.each do |filename|
2194
+ piece = load_spec(filename, root)
2195
+ d = File.dirname(File.realpath(filename, root))
2196
+ piece.each_pair do |name, spec|
2197
+ load_piece_file(spec, 'header', d)
2198
+ load_piece_file(spec, 'source', d)
2199
+ load_piece_file(spec, 'license', d)
2200
+ defaults('piece', spec)
2201
+ spec['external'] = false if spec['external'] && spec['writer']
2202
+ if spec['external']
2203
+ check_given(spec, 'piece', 'parsername', "#{filename} #{name} has no 'parsername'")
2204
+ end
2205
+ unless spec['pooled'].nil?
2206
+ %w[poolindexes poolparsers poolparsertypes].each do |field|
2207
+ raise ArgumentError "#{name} has both pooled and #{field}" unless spec[field].nil?
2208
+ end
2209
+ end
2210
+ puts("Replacing #{name}") if $PIECES.key? name
2211
+ $PIECES[name] = spec
2212
+ end
2213
+ end
2214
+ end
2215
+
2216
+ if $LIST
2217
+ all = []
2218
+ $PIECES.each_pair do |name, piece|
2219
+ all.push("#{name}#{piece['external'] ? '' : ' (internal)'}")
2220
+ end
2221
+ all.sort!
2222
+ puts all
2223
+ end
2224
+
2225
+ # Check that requirements are met.
2226
+ missing = false
2227
+ $PIECES.each_pair do |name, spec|
2228
+ spec['requires'].each do |r|
2229
+ unless $PIECES.key? r
2230
+ aargh("#{name} missing requirement: #{r}")
2231
+ missing = true
2232
+ end
2233
+ end
2234
+ end
2235
+ exit(4) if missing && !$WARN
2236
+
2237
+ if $EXPORT
2238
+ pieces = {}
2239
+ name2store = {}
2240
+ $PIECES.each_pair do |name, piece|
2241
+ piece = piece.clone
2242
+ %w[header source license].each do |field|
2243
+ next if piece[field].nil?
2244
+ b = File.basename piece[field]
2245
+ s = piece["#{field}_stored"]
2246
+ if name2store.key? b
2247
+ name2store[b].push(s) unless name2store[b].include? s
2248
+ else
2249
+ name2store[b] = [ s ]
2250
+ end
2251
+ piece[field] = b
2252
+ end
2253
+ pieces[name] = piece
2254
+ end
2255
+ collisions = []
2256
+ name2store.each_pair do |b, s|
2257
+ if s.size == 1
2258
+ f = File.new(b, 'w')
2259
+ f.write($FILECONTENTS[s[0]])
2260
+ f.close
2261
+ else
2262
+ collisions.push b
2263
+ end
2264
+ end
2265
+ store2name = {}
2266
+ collisions.each do |b|
2267
+ s = name2store[b]
2268
+ name2store.delete b
2269
+ pre = File.basename(b, '.*')
2270
+ ext = b.slice(pre.size, b.size - pre.size)
2271
+ idx = 0
2272
+ bn = b
2273
+ s.each do |c|
2274
+ while name2store.key? bn
2275
+ idx += 1
2276
+ bn = "#{pre}_#{idx}#{ext}"
2277
+ end
2278
+ store2name[c] = bn
2279
+ f = File.new(bn, 'w')
2280
+ f.write($FILECONTENTS[c])
2281
+ f.close
2282
+ name2store[bn] = [ c ]
2283
+ end
2284
+ end
2285
+ list = []
2286
+ pieces.each_pair do |name, piece|
2287
+ %w[header source license].each do |field|
2288
+ if piece[field].nil?
2289
+ piece.delete field
2290
+ else
2291
+ s = piece["#{field}_stored"]
2292
+ piece[field] = store2name[s] if store2name.key? s
2293
+ end
2294
+ piece.delete "#{field}_stored"
2295
+ end
2296
+ list.push "#{name}.yaml"
2297
+ f = File.new(list.last, 'w')
2298
+ f.write(YAML.dump({ name => piece }))
2299
+ f.close
2300
+ end
2301
+ f = File.new('exported.yaml', 'w')
2302
+ f.write(YAML.dump(list))
2303
+ f.close
2304
+ end
2305
+
2306
+ unless $BUILD.nil?
2307
+ script = File.new($PROGRAM_NAME, chomp: true).readlines
2308
+ first = script.find_index { |ln| ln.start_with? '#PIECESASSIGNMENTSTART#' }
2309
+ last = script.find_index { |ln| ln.start_with? '#PIECESASSIGNMENTEND#' }
2310
+ if first.nil? || last.nil? || last < first
2311
+ aargh('Failed to find lines starting with, or in wrong order: #PIECESASSIGNMENTSTART# #PIECESASSIGNMENTEND#', 2)
2312
+ end
2313
+ succeeding = script.slice(last, script.size - last).join
2314
+ script = script.slice(0, first + 1).join
2315
+ encoded = {}
2316
+ $FILECONTENTS.each_pair do |key, value|
2317
+ encoded[key] = Base64.encode64(value)
2318
+ end
2319
+ script.concat(%(
2320
+ $PIECES = YAML.load(%(#{YAML.dump($PIECES)}))
2321
+ $FILECONTENTS = YAML.load(%(#{YAML.dump(encoded)}))
2322
+ ))
2323
+ script.concat(succeeding)
2324
+ IO.write($BUILD, script)
2325
+ File.chmod(0o755, $BUILD)
2326
+ end
2327
+
2328
+ exit(0) if $IN.nil?
2329
+
2330
+ specs = load_spec($IN)
2331
+
2332
+ $PIECES.each_pair { |name, piece| piece['name'] = name }
2333
+
2334
+ def all_requirements(piece, reqs)
2335
+ unless reqs.include? piece['name']
2336
+ reqs.push piece['name']
2337
+ piece['requires'].each do |r|
2338
+ all_requirements($PIECES[r], reqs) unless reqs.include? r
2339
+ end
2340
+ end
2341
+ reqs
2342
+ end
2343
+
2344
+ $PIECES.each_value do |piece|
2345
+ piece['all_requires'] = all_requirements(piece, [])
2346
+ end
2347
+
2348
+ def parserpool_substitutions(needed, namespace)
2349
+ $pools = []
2350
+ $pooled = []
2351
+ needed.each do |name|
2352
+ piece = $PIECES[name]
2353
+ $pools.push(name) unless piece['poolindexes'].nil? && piece['poolparsers'].nil? && piece['poolparsertypes'].nil?
2354
+ $pooled.push(name) unless piece['pooled'].nil?
2355
+ %w[header source].each do |field|
2356
+ fc = piece["#{field}_stored"]
2357
+ next if fc.nil?
2358
+ piece["#{field}_content"] = String.new($FILECONTENTS[fc])
2359
+ next if 'specjson' == namespace
2360
+ until piece["#{field}_content"].sub!('specjson::', "#{namespace}::").nil?
2361
+ end
2362
+ end
2363
+ end
2364
+ poolvals = {
2365
+ 'poolindexes' => [],
2366
+ 'poolparsers' => [],
2367
+ 'poolparsertypes' => []
2368
+ }
2369
+ $pooled.each_index do |k|
2370
+ piece = $PIECES[$pooled[k]]
2371
+ poolvals['poolindexes'].push $pooled[k]
2372
+ poolvals['poolparsers'].push piece['parsername']
2373
+ poolvals['poolparsertypes'].push "#{piece['parsername']}::Type"
2374
+ [ 'header', 'source' ].each do |field|
2375
+ fc = piece["#{field}_stored"]
2376
+ next if fc.nil?
2377
+ until piece["#{field}_content"].sub!(piece['pooled'], k.to_s).nil?
2378
+ end
2379
+ end
2380
+ end
2381
+ poolvals.each_pair { |k, v| poolvals[k] = v.join(', ') }
2382
+ $pools.each do |name|
2383
+ piece = $PIECES[name]
2384
+ %w[header source].each do |field|
2385
+ fc = piece["#{field}_stored"]
2386
+ next if fc.nil?
2387
+ poolvals.each_pair do |fld, value|
2388
+ until piece["#{field}_content"].sub!(piece[fld], value).nil?
2389
+ end
2390
+ end
2391
+ end
2392
+ end
2393
+ $pooledreqs = []
2394
+ $pooled.each do |name|
2395
+ piece = $PIECES[name]
2396
+ piece['all_requires'].each do |p|
2397
+ $pooledreqs.push p unless p == name
2398
+ end
2399
+ end
2400
+ $pooledreqs.uniq!
2401
+ end
2402
+
2403
+ def licenses(needed)
2404
+ lic2id = { }
2405
+ needed.each do |name|
2406
+ lic = $PIECES[name]['license_stored']
2407
+ next if lic.nil? || lic2id.key?(lic)
2408
+ lic2id[lic] = "License #{lic2id.size + 1}"
2409
+ end
2410
+ lic2id
2411
+ end
2412
+
2413
+ def compare_pieces(a, b)
2414
+ a = $PIECES[a]
2415
+ b = $PIECES[b]
2416
+ # Group writers at the end.
2417
+ if a['writer']
2418
+ return 1 unless b['writer']
2419
+ else
2420
+ return -1 if b['writer']
2421
+ end
2422
+ areqs = a['all_requires']
2423
+ breqs = b['all_requires']
2424
+ if areqs.include? b['name']
2425
+ return areqs.length <=> breqs.length if breqs.include? a['name']
2426
+ return 1
2427
+ end
2428
+ return -1 if breqs.include? a['name']
2429
+ if a['writer'] && b['writer']
2430
+ if a['scalar']
2431
+ return -1 unless b['scalar']
2432
+ else
2433
+ return 1 if b['scalar']
2434
+ end
2435
+ end
2436
+ # Neither requires the other. Keep pools and pooled items before others.
2437
+ if $pooledreqs.include? a['name']
2438
+ return -1 unless $pooledreqs.include? b['name']
2439
+ else
2440
+ return 1 if $pooledreqs.include? b['name']
2441
+ end
2442
+ if $pooled.include? a['name']
2443
+ return -1 unless $pooled.include? b['name']
2444
+ else
2445
+ return 1 if $pooled.include? b['name']
2446
+ end
2447
+ if $pools.include? a['name']
2448
+ return -1 unless $pools.include? b['name']
2449
+ else
2450
+ return 1 if $pools.include? b['name']
2451
+ end
2452
+ return areqs.length <=> breqs.length unless areqs.length == breqs.length
2453
+ a['name'] <=> b['name']
2454
+ end
2455
+
2456
+ def arrange_needed(needed)
2457
+ pools = needed.select { |name| $pools.include? name }
2458
+ others = needed.reject { |name| pools.include?(name) }
2459
+ others.sort! { |a, b| compare_pieces(a, b) }
2460
+ last = others.rindex { |name| $pooled.include? name }
2461
+ needed = others.slice!(0, last + 1)
2462
+ others.concat pools
2463
+ others.sort! { |a, b| compare_pieces(a, b) }
2464
+ needed.concat others
2465
+ needed
2466
+ end
2467
+
2468
+ def unique_in_order(piece_names, field)
2469
+ values = []
2470
+ piece_names.each do |name|
2471
+ piece = $PIECES[name]
2472
+ next if piece[field].nil?
2473
+ if piece[field].is_a? String
2474
+ values.push(piece[field]) unless values.include? piece[field]
2475
+ else
2476
+ piece[field].each do |line|
2477
+ values.push(line) unless values.include? line
2478
+ end
2479
+ end
2480
+ end
2481
+ values
2482
+ end
2483
+
2484
+ def license_block(lic2id)
2485
+ blocks = []
2486
+ lic2id.each_pair do |lic, id|
2487
+ blocks.push %(
2488
+ #if 0
2489
+ /*
2490
+ #{id}:
2491
+
2492
+ #{$FILECONTENTS[lic]}
2493
+ */
2494
+ #endif
2495
+ )
2496
+ end
2497
+ blocks.join("\n")
2498
+ end
2499
+
2500
+ def make_header(spec, piece_names, generated, lic2id)
2501
+ h = File.new(spec['header'], 'w')
2502
+ h.puts %(// Auto-generated file. Do not edit.
2503
+ #if !defined(#{spec['header'].upcase.sub('.', '_')})
2504
+ #define #{spec['header'].upcase.sub('.', '_')}
2505
+
2506
+ #{license_block(lic2id)}
2507
+ )
2508
+ h.puts %(
2509
+ #{unique_in_order(piece_names, 'includes').join("\n")}
2510
+
2511
+ namespace #{spec['namespace']} {
2512
+
2513
+ #{unique_in_order(piece_names, 'declaration').join("\n")}
2514
+ #{(generated.keys.map { |k| generated[k][:forward].join("\n") }).join("\n")}
2515
+ )
2516
+ prev = nil
2517
+ piece_names.each do |name|
2518
+ piece = $PIECES[name]
2519
+ next if piece['header_stored'].nil?
2520
+ lic = piece['license_stored']
2521
+ if lic != prev
2522
+ h.puts
2523
+ h.puts(lic.nil? ? '// Unspecified license.' : "// Under #{lic2id[lic]}.")
2524
+ prev = lic
2525
+ end
2526
+ h.puts
2527
+ h.puts "// Origin: #{piece['header']}"
2528
+ h.puts(piece['header_content'])
2529
+ end
2530
+ generated.each_pair do |typename, object|
2531
+ h.puts %Q(
2532
+ // #{typename}
2533
+ #{object[:extern].join("\n")}
2534
+
2535
+ #{object[:typedef].join("\n")}
2536
+
2537
+ #{object[:class].join("\n")}
2538
+ )
2539
+ end
2540
+ h.puts %Q(
2541
+ } // namespace #{spec['namespace']}
2542
+
2543
+ #endif)
2544
+ h.close
2545
+ return spec['header']
2546
+ end
2547
+
2548
+ def make_source(spec, piece_names, generated, lic2id, header_name)
2549
+ h = File.new(spec['source'], 'w')
2550
+ h.puts %(// Auto-generated file. Do not edit.
2551
+ #{license_block(lic2id)}
2552
+
2553
+ #define INCLUDED_FROM_GENERATED_SOURCE 1
2554
+ #include "#{header_name}"
2555
+ #undef INCLUDED_FROM_GENERATED_SOURCE
2556
+ #{unique_in_order(piece_names, 'source_includes').join("\n")}
2557
+
2558
+ using namespace #{spec['namespace']};
2559
+ )
2560
+ prev = nil
2561
+ piece_names.each do |name|
2562
+ piece = $PIECES[name]
2563
+ next if piece['source_stored'].nil?
2564
+ lic = piece['license_stored']
2565
+ if lic != prev
2566
+ h.puts
2567
+ h.puts(lic.nil? ? '// Unspecified license.' : "// Under #{lic2id[lic]}.")
2568
+ prev = lic
2569
+ end
2570
+ h.puts
2571
+ h.puts "// Origin: #{piece['source']}"
2572
+ h.puts(piece['source_content'])
2573
+ end
2574
+ generated.each_pair do |typename, object|
2575
+ h.puts %(
2576
+ // #{typename}
2577
+ #{object[:extern_src].join("\n")}
2578
+ )
2579
+ end
2580
+ h.close
2581
+ return spec['source']
2582
+ end
2583
+
2584
+ specs.each_pair do |name, spec|
2585
+ defaults('specification', spec)
2586
+ default(spec, 'name', name)
2587
+ spec['header'] = "#{spec['name']}.#{spec['header_extension']}" if spec['header'].nil?
2588
+ spec['source'] = "#{spec['name']}.#{spec['source_extension']}" if spec['source'].nil?
2589
+ spec['generate'].each_pair do |typename, gen|
2590
+ unless spec['types'].key? typename
2591
+ aargh("#{name} generate #{typename} has no match in types: #{spec['types'].keys.sort.join(' ')}", 4)
2592
+ end
2593
+ defaults('generate', gen)
2594
+ end
2595
+ spec['types'].each_pair do |typename, object|
2596
+ unless spec['generate'].key? typename
2597
+ puts "#{name} #{typename} deleted since it has no match in generate: #{spec['generate'].keys.sort.join(' ')}"
2598
+ spec['types'].delete typename
2599
+ next
2600
+ end
2601
+ reqs = []
2602
+ object.each_pair do |field, desc|
2603
+ defaults('types', desc)
2604
+ if spec['generate'][typename]['parser']
2605
+ check_given(spec, 'types', 'format', "#{name} #{typename} #{field} has no 'format'.")
2606
+ desc['format'] = [ desc['format'] ] unless desc['format'].is_a? Array
2607
+ reqs.concat desc['format']
2608
+ end
2609
+ gen = spec['generate'][typename]
2610
+ if gen['writer'] && !gen['parser'] # Parser sets defaults later.
2611
+ unless desc['required']
2612
+ check_given(desc, 'types', 'checker', "#{name} #{typename} #{field} has no 'checker'.")
2613
+ end
2614
+ check_given(desc, 'types', 'accessor', "#{name} #{typename} #{field} has no 'accessor'.")
2615
+ end
2616
+ end
2617
+ object[:requires] = reqs.uniq
2618
+ end
2619
+ spec['types'].each_pair do |typename, object|
2620
+ object.each_pair do |field, desc|
2621
+ next unless field.is_a? String
2622
+ next unless spec['generate'][typename]['parser']
2623
+ desc['format'].each do |f|
2624
+ unless f.is_a? String
2625
+ aargh("#{name} #{typename} #{field} format not string.", 4)
2626
+ end
2627
+ if $PIECES.key? f
2628
+ object[:requires].push f
2629
+ next if $PIECES[f]['external']
2630
+ aargh("#{name} #{typename} #{field} format #{f} internal.", 4)
2631
+ end
2632
+ if spec['generate'].key? f
2633
+ next if spec['generate'][f]['parser']
2634
+ aargh("#{name} #{typename} #{field} format #{f} no parser.", 4)
2635
+ end
2636
+ if spec['types'].key? f
2637
+ aargh("#{name} #{typename} #{field} format #{f} not generated.")
2638
+ else
2639
+ aargh("#{name} #{typename} #{field} format #{f} not found: #{spec['types'].keys.sort.join(' ')}")
2640
+ end
2641
+ exit(4)
2642
+ end
2643
+ end
2644
+ end
2645
+ end
2646
+
2647
+ def classify_expression(expr)
2648
+ # Simple but good enough for now. If expression gets confused with method,
2649
+ # add space in any place where it does not affect the meaning.
2650
+ return :expression if expr.nil? # Will go unused in this case.
2651
+ return :expression if expr.include? ' '
2652
+ return :expression if expr.include?('.') || expr.include?('->')
2653
+ return :method if expr.end_with? '()'
2654
+ :member
2655
+ end
2656
+
2657
+ def write_function(spec, typename)
2658
+ object = spec['types'][typename]
2659
+ all_req = true
2660
+ object.each_value do |desc|
2661
+ all_req = false unless desc['required']
2662
+ end
2663
+ lines = [ %(
2664
+ #if !defined(INCLUDED_FROM_GENERATED_SOURCE)
2665
+ template<typename Sink>
2666
+ void Write(Sink& S, const #{typename}& Value, std::vector<char>& Buffer) {
2667
+ char c = '{';
2668
+ S.write(&c, 1);) ]
2669
+ lines.push(' bool separated = true;') unless all_req
2670
+ prev_req = nil
2671
+ fields = object.keys
2672
+ # If write order is ever something other than the key one, change it here.
2673
+ fields.each do |field|
2674
+ desc = object[field]
2675
+ fill = ''
2676
+ unless desc['required']
2677
+ lines.push " if (Value.#{desc['checker']}) {"
2678
+ fill = ' '
2679
+ end
2680
+ unless prev_req.nil?
2681
+ if all_req || prev_req
2682
+ lines.push "#{fill} c = ',';"
2683
+ lines.push "#{fill} S.write(&c, 1);"
2684
+ elsif !prev_req.nil?
2685
+ lines.push "#{fill} if (!separated) {"
2686
+ lines.push "#{fill} c = ',';"
2687
+ lines.push "#{fill} S.write(&c, 1);"
2688
+ lines.push "#{fill} }"
2689
+ end
2690
+ end
2691
+ lines.push "#{fill} Write(S, #{typename}_#{field}, Buffer);"
2692
+ lines.push "#{fill} c = ':';"
2693
+ lines.push "#{fill} S.write(&c, 1);"
2694
+ lines.push "#{fill} Write(S, Value.#{desc['accessor']}, Buffer);"
2695
+ lines.push("#{fill} separated = false;") unless all_req || field == fields.last
2696
+ lines.push(' }') unless desc['required']
2697
+ prev_req = desc['required']
2698
+ end
2699
+ lines.push %( c = '}';
2700
+ S.write(&c, 1);
2701
+ }
2702
+ #endif // INCLUDED_FROM_GENERATED_SOURCE
2703
+ )
2704
+ lines.join("\n")
2705
+ end
2706
+
2707
+ specs.each_pair do |name, spec|
2708
+ needed = []
2709
+ needed.concat spec['requires']
2710
+ spec['generate'].each_key do |typename|
2711
+ next unless spec['types'][typename].key? :requires
2712
+ needed.concat spec['types'][typename][:requires]
2713
+ needed.push 'ParseObject'
2714
+ spec['types'][typename].delete :requires
2715
+ end
2716
+ if needed.empty?
2717
+ unless spec['full']
2718
+ puts "#{name} needs nothing and not full, skipped."
2719
+ next
2720
+ end
2721
+ needed = $PIECES.keys
2722
+ else
2723
+ if spec['full']
2724
+ needed.concat($PIECES.keys)
2725
+ else
2726
+ $PIECES.each_pair do |name, piece|
2727
+ needed.push(name) if piece['writer']
2728
+ end
2729
+ reqs = []
2730
+ needed.each { |typename| reqs.concat $PIECES[typename]['requires'] }
2731
+ reqs.uniq!
2732
+ while true
2733
+ s = reqs.size
2734
+ added = []
2735
+ reqs.each { |typename| added.concat $PIECES[typename]['requires'] }
2736
+ reqs.concat added
2737
+ reqs.uniq!
2738
+ break if s == reqs.size
2739
+ end
2740
+ needed.concat reqs
2741
+ end
2742
+ spec['generate'].each_value do |gen|
2743
+ needed.push('String') if gen['parser']
2744
+ end
2745
+ needed.uniq!
2746
+ end
2747
+ parserpool_substitutions(needed, spec['namespace'])
2748
+ needed = arrange_needed(needed)
2749
+ lic2id = licenses(needed)
2750
+ generated = { }
2751
+ spec['generate'].each_pair do |typename, gen|
2752
+ object = spec['types'][typename]
2753
+ out = {
2754
+ forward: [],
2755
+ typedef: [],
2756
+ extern: [],
2757
+ extern_src: [],
2758
+ class: []
2759
+ }
2760
+ if gen['parser']
2761
+ out[:forward].push "class #{typename};"
2762
+ keyvalues = []
2763
+ values = []
2764
+ names = []
2765
+ object.each_pair do |field, desc|
2766
+ sub = "#{typename}_#{field}"
2767
+ # Field name string constant.
2768
+ out[:extern].push "extern const char #{sub}[];"
2769
+ out[:extern_src].push "const char #{spec['namespace']}::#{sub}[] = \"#{field}\";"
2770
+ k = desc['format'].size - 1
2771
+ f = desc['format'][k]
2772
+ p = $PIECES[f]
2773
+ out[:typedef].push "typedef #{p['parsername']} #{sub}_#{k};"
2774
+ while k.positive?
2775
+ k -= 1
2776
+ f = desc['format'][k]
2777
+ p = $PIECES[f]
2778
+ out[:typedef].push "typedef #{p['parsername']}<#{sub}_#{k + 1}> #{sub}_#{k};"
2779
+ end
2780
+ keyvalues.push "#{desc['required'] ? 'Required' : ''}Key#{desc['format'].size > 1 ? 'Container' : ''}Value<#{sub},#{sub}_0>"
2781
+ out[:typedef].push "typedef #{keyvalues.last} #{sub}_KeyValue;"
2782
+ values.push "Value<#{sub}_0>"
2783
+ names.push field
2784
+ default(desc, 'accessor', "#{field}()")
2785
+ desc[:access_type] = classify_expression(desc['accessor'])
2786
+ default(desc, 'checker', "#{field}Given()")
2787
+ desc[:check_type] = classify_expression(desc['checker'])
2788
+ end
2789
+ out[:typedef].push "typedef KeyValues<#{keyvalues.join(',')}> #{typename}_KeyValues;"
2790
+ out[:typedef].push "typedef NamelessValues<#{values.join(',')}> #{typename}_NamelessValues;"
2791
+ out[:typedef].push "typedef ParseObject<#{typename}_KeyValues,#{typename}_NamelessValues> #{typename}_Parser; // Parse with an instance of this."
2792
+ out[:class].push %(
2793
+ class #{typename} {
2794
+ public:
2795
+ #{(names.map { |n| " typedef #{values[names.find_index(n)]}::Type #{n}Type;" }).join("\n")}
2796
+ #{typename}_Parser::Type values;
2797
+
2798
+ #{(names.map { |n| " bool #{n}Given() const { return std::get<#{names.find_index(n)}>(values).Given(); }" }).join("\n")}
2799
+
2800
+ #{(names.map { |n| " #{n}Type& #{n}() { return std::get<#{names.find_index(n)}>(values).value; }" }).join("\n")}
2801
+ #{(names.map { |n| " const #{n}Type& #{n}() const { return std::get<#{names.find_index(n)}>(values).value; }" }).join("\n")}
2802
+ };
2803
+ )
2804
+ out[:class].push write_function(spec, typename) if gen['writer']
2805
+ generated[typename] = out
2806
+ elsif gen['writer']
2807
+ object.each_pair do |field, desc|
2808
+ sub = "#{typename}_#{field}"
2809
+ out[:extern].push "extern const char #{sub}[];"
2810
+ out[:extern_src].push "const char #{spec['namespace']}::#{sub}[] = \"#{field}\";"
2811
+ desc[:access_type] = classify_expression(desc['accessor'])
2812
+ desc[:check_type] = classify_expression(desc['checker'])
2813
+ desc[:tn] = "T_#{field}"
2814
+ end
2815
+ # Template class for write.
2816
+ get_ind = object.keys.select { |k| object[k][:access_type] == :method }
2817
+ get_dir = object.keys.select { |k| object[k][:access_type] != :method }
2818
+ chk_ind = object.keys.select { |k| object[k][:check_type] == :method && !object[k][:required] }
2819
+ tmpl = [ %(
2820
+ template<#{(object.keys.map { |k| "typename #{object[k][:tn]}" }).join(',')}>
2821
+ class #{typename}_Template {
2822
+ private:
2823
+ #{(get_ind.map { |f| " #{object[f][:tn]} #{f}_value;" }).join("\n")}
2824
+
2825
+ #{(chk_ind.map { |f| " bool #{f}_given;" }).join("\n")}
2826
+
2827
+ public:) ]
2828
+ unless chk_ind.empty? # Constructor to set given indicators to false.
2829
+ tmpl.push " #{typename}_Template() : #{(chk_ind.map { |f| "#{f}_given(false)" }).join(', ')} { }"
2830
+ end
2831
+ tmpl.push(%(
2832
+ #{(chk_ind.map { |f| " bool& #{object[f][:checker]} { return #{f}_given; }" }).join("\n")}
2833
+ #{(chk_ind.map { |f| " bool #{object[f][:checker]} const { return #{f}_given; }" }).join("\n")}
2834
+
2835
+ #{(get_dir.map { |f| " #{object[f][:tn]} #{f};" }).join("\n")}
2836
+
2837
+ #{(get_ind.map { |f| " #{object[f][:tn]}& #{object[f]['accessor']} { return #{f}_value; };" }).join("\n")}
2838
+ #{(get_ind.map { |f| " const #{object[f][:tn]}& #{object[f]['accessor']} const { return #{f}_value; }" }).join("\n")}
2839
+ };))
2840
+ tmpl = tmpl.join("\n")
2841
+ # Tweak the looks of output.
2842
+ until (tmpl.sub!("\n\n\n", "\n\n")).nil? # Shrink two empty lines to 1.
2843
+ end
2844
+ tmpl.sub!("private:\n\n", "private:\n")
2845
+ tmpl.sub!("public:\n\n", "public:\n")
2846
+ tmpl.sub!("private:\npublic:", 'public:') # Drop private if not used.
2847
+ tmpl.sub!("\n\n};", "\n};")
2848
+ out[:class].push tmpl
2849
+ # define check and typedef for template.
2850
+ out[:class].push %(
2851
+ #if defined(#{spec['namespace'].upcase}_#{typename.upcase}_TYPE)
2852
+ typedef #{spec['namespace'].upcase}_#{typename.upcase}_TYPE #{typename};
2853
+ #endif
2854
+ )
2855
+ out[:class].push write_function(spec, typename)
2856
+ generated[typename] = out
2857
+ end
2858
+ end
2859
+ puts "#{name}: #{generated.keys.join(' ')} #{needed.join(' ')}"
2860
+ hdr = make_header(spec, needed, generated, lic2id)
2861
+ src = make_source(spec, needed, generated, lic2id, hdr)
2862
+ puts " Header: #{hdr}, source: #{src}"
2863
+ end