pipegate 0.6.0

A payment authentication middleware with stablecoins
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
{
  "abi": [
    { "type": "constructor", "inputs": [], "stateMutability": "nonpayable" },
    {
      "type": "function",
      "name": "channelId",
      "inputs": [],
      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "channelState",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "uint8",
          "internalType": "enum PaymentChannel.ChannelState"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "claimTimeout",
      "inputs": [],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "close",
      "inputs": [
        {
          "name": "channelBalance",
          "type": "uint256",
          "internalType": "uint256"
        },
        { "name": "nonce", "type": "uint256", "internalType": "uint256" },
        { "name": "rawBody", "type": "bytes", "internalType": "bytes" },
        { "name": "signature", "type": "bytes", "internalType": "bytes" }
      ],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "deposit",
      "inputs": [
        { "name": "_amount", "type": "uint256", "internalType": "uint256" }
      ],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "expiration",
      "inputs": [],
      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "extend",
      "inputs": [
        {
          "name": "newExpiration",
          "type": "uint256",
          "internalType": "uint256"
        }
      ],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "factory",
      "inputs": [],
      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "getBalance",
      "inputs": [],
      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "getChannelInfo",
      "inputs": [],
      "outputs": [
        { "name": "id", "type": "uint256", "internalType": "uint256" },
        { "name": "senderAddr", "type": "address", "internalType": "address" },
        {
          "name": "recipientAddr",
          "type": "address",
          "internalType": "address"
        },
        { "name": "exp", "type": "uint256", "internalType": "uint256" },
        { "name": "balance", "type": "uint256", "internalType": "uint256" },
        {
          "name": "pricePerRequest",
          "type": "uint256",
          "internalType": "uint256"
        },
        { "name": "lastNonce", "type": "uint256", "internalType": "uint256" },
        {
          "name": "state",
          "type": "uint8",
          "internalType": "enum PaymentChannel.ChannelState"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "getEthSignedMessageHash",
      "inputs": [
        { "name": "_messageHash", "type": "bytes32", "internalType": "bytes32" }
      ],
      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
      "stateMutability": "pure"
    },
    {
      "type": "function",
      "name": "init",
      "inputs": [
        { "name": "_recipient", "type": "address", "internalType": "address" },
        { "name": "_sender", "type": "address", "internalType": "address" },
        { "name": "_duration", "type": "uint256", "internalType": "uint256" },
        {
          "name": "_tokenAddress",
          "type": "address",
          "internalType": "address"
        },
        { "name": "_amount", "type": "uint256", "internalType": "uint256" },
        { "name": "_price", "type": "uint256", "internalType": "uint256" },
        { "name": "_channelId", "type": "uint256", "internalType": "uint256" }
      ],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "lastProcessedNonce",
      "inputs": [],
      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "price",
      "inputs": [],
      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "recipient",
      "inputs": [],
      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "recoverSigner",
      "inputs": [
        {
          "name": "_ethSignedMessageHash",
          "type": "bytes32",
          "internalType": "bytes32"
        },
        { "name": "_signature", "type": "bytes", "internalType": "bytes" }
      ],
      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
      "stateMutability": "pure"
    },
    {
      "type": "function",
      "name": "sender",
      "inputs": [],
      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "splitSignature",
      "inputs": [{ "name": "sig", "type": "bytes", "internalType": "bytes" }],
      "outputs": [
        { "name": "r", "type": "bytes32", "internalType": "bytes32" },
        { "name": "s", "type": "bytes32", "internalType": "bytes32" },
        { "name": "v", "type": "uint8", "internalType": "uint8" }
      ],
      "stateMutability": "pure"
    },
    {
      "type": "function",
      "name": "token",
      "inputs": [],
      "outputs": [
        { "name": "", "type": "address", "internalType": "contract IERC20" }
      ],
      "stateMutability": "view"
    },
    {
      "type": "event",
      "name": "ChannelClosed",
      "inputs": [
        {
          "name": "channelId",
          "type": "uint256",
          "indexed": true,
          "internalType": "uint256"
        },
        {
          "name": "sender",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        },
        {
          "name": "recipient",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        },
        {
          "name": "timestamp",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        },
        {
          "name": "amountPaid",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        },
        {
          "name": "amountRefunded",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        },
        {
          "name": "finalNonce",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "ChannelCreated",
      "inputs": [
        {
          "name": "channelId",
          "type": "uint256",
          "indexed": true,
          "internalType": "uint256"
        },
        {
          "name": "sender",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        },
        {
          "name": "recipient",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        },
        {
          "name": "expiration",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        },
        {
          "name": "initialBalance",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        },
        {
          "name": "price",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "DepositMade",
      "inputs": [
        {
          "name": "channelId",
          "type": "uint256",
          "indexed": true,
          "internalType": "uint256"
        },
        {
          "name": "sender",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        },
        {
          "name": "amount",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        },
        {
          "name": "newBalance",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "ExpirationExtended",
      "inputs": [
        {
          "name": "channelId",
          "type": "uint256",
          "indexed": true,
          "internalType": "uint256"
        },
        {
          "name": "oldExpiration",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        },
        {
          "name": "newExpiration",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "TimeoutClaimed",
      "inputs": [
        {
          "name": "channelId",
          "type": "uint256",
          "indexed": true,
          "internalType": "uint256"
        },
        {
          "name": "sender",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        },
        {
          "name": "amount",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        },
        {
          "name": "timestamp",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        }
      ],
      "anonymous": false
    }
  ],
  "bytecode": {
    "object": "0x608060405234602257600e609b565b60146026565b612dd86100a78239612dd890f35b602c565b60405190565b5f80fd5b5f1b90565b90603f60ff916030565b9181191691161790565b634e487b7160e01b5f52602160045260245ffd5b60031115606657565b6049565b90607282605d565b565b607b90606a565b90565b90565b906091608d6097926074565b607e565b82546035565b9055565b60a460025f6081565b56fe60806040526004361015610013575b610bec565b61001d5f3561014c565b806308e8553e146101475780630e1da6c31461014257806312065fe01461013d57806330d281e0146101385780634665096d146101335780634e1b16ce1461012e57806355b550941461012957806366d003ac1461012457806367e404ce1461011f57806392aa5bcb1461011a5780639714378c1461011557806397aba7f914610110578063a035b1fe1461010b578063a7bb580314610106578063b6b55f2514610101578063c45a0155146100fc578063e2cee544146100f7578063fa540801146100f25763fc0c546a0361000e57610bb7565b610ae9565b610a81565b610a3d565b6109fb565b6109c3565b610907565b6108c2565b61073d565b6106e5565b61061d565b6105d9565b61054f565b6104c6565b6103a4565b610356565b61023d565b61020a565b6101d0565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f91031261016a57565b61015c565b1c90565b90565b61018690600861018b930261016f565b610173565b90565b906101999154610176565b90565b6101a860075f9061018e565b90565b90565b6101b7906101ab565b9052565b91906101ce905f602085019401906101ae565b565b34610200576101e0366004610160565b6101fc6101eb61019c565b6101f3610152565b918291826101bb565b0390f35b610158565b5f0190565b346102385761021a366004610160565b6102226112b1565b61022a610152565b8061023481610205565b0390f35b610158565b3461026d5761024d366004610160565b6102696102586112f8565b610260610152565b918291826101bb565b0390f35b610158565b60018060a01b031690565b61028690610272565b90565b6102929061027d565b9052565b634e487b7160e01b5f52602160045260245ffd5b600311156102b457565b610296565b906102c3826102aa565b565b6102ce906102b9565b90565b6102da906102c5565b9052565b959391989796949290986101008701995f88016102fa916101ae565b6020870161030791610289565b6040860161031491610289565b60608501610321916101ae565b6080840161032e916101ae565b60a0830161033b916101ae565b60c08201610348916101ae565b60e001610354916102d1565b565b3461039057610366366004610160565b61038c61037161139b565b94610383989698949194939293610152565b988998896102de565b0390f35b610158565b6103a160045f9061018e565b90565b346103d4576103b4366004610160565b6103d06103bf610395565b6103c7610152565b918291826101bb565b0390f35b610158565b5f80fd5b6103e6816101ab565b036103ed57565b5f80fd5b905035906103fe826103dd565b565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156104465781359167ffffffffffffffff831161044157602001926001830284011161043c57565b610408565b610404565b610400565b91906080838203126104c157610463815f85016103f1565b9261047182602083016103f1565b92604082013567ffffffffffffffff81116104bc578361049291840161040c565b929093606082013567ffffffffffffffff81116104b7576104b3920161040c565b9091565b6103d9565b6103d9565b61015c565b346104fb576104e56104d936600461044b565b94939093929192611c96565b6104ed610152565b806104f781610205565b0390f35b610158565b60ff1690565b61051690600861051b930261016f565b610500565b90565b906105299154610506565b90565b6105375f5f9061051e565b90565b919061054d905f602085019401906102d1565b565b3461057f5761055f366004610160565b61057b61056a61052c565b610572610152565b9182918261053a565b0390f35b610158565b60018060a01b031690565b61059f9060086105a4930261016f565b610584565b90565b906105b2915461058f565b90565b6105c160035f906105a7565b90565b91906105d7905f60208501940190610289565b565b34610609576105e9366004610160565b6106056105f46105b5565b6105fc610152565b918291826105c4565b0390f35b610158565b61061a60025f906105a7565b90565b3461064d5761062d366004610160565b61064961063861060e565b610640610152565b918291826105c4565b0390f35b610158565b61065b8161027d565b0361066257565b5f80fd5b9050359061067382610652565b565b60e0818303126106e05761068b825f8301610666565b926106998360208401610666565b926106a781604085016103f1565b926106b58260608301610666565b926106dd6106c684608085016103f1565b936106d48160a086016103f1565b9360c0016103f1565b90565b61015c565b3461071a576107046106f8366004610675565b959490949391936124fd565b61070c610152565b8061071681610205565b0390f35b610158565b9060208282031261073857610735915f016103f1565b90565b61015c565b3461076b5761075561075036600461071f565b612765565b61075d610152565b8061076781610205565b0390f35b610158565b90565b61077c81610770565b0361078357565b5f80fd5b9050359061079482610773565b565b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906107c29061079a565b810190811067ffffffffffffffff8211176107dc57604052565b6107a4565b906107f46107ed610152565b92836107b8565b565b67ffffffffffffffff81116108145761081060209161079a565b0190565b6107a4565b90825f939282370152565b90929192610839610834826107f6565b6107e1565b938185526020850190828401116108555761085392610819565b565b610796565b9080601f830112156108785781602061087593359101610824565b90565b610400565b9190916040818403126108bd57610896835f8301610787565b92602082013567ffffffffffffffff81116108b8576108b5920161085a565b90565b6103d9565b61015c565b346108f3576108ef6108de6108d836600461087d565b906127ae565b6108e6610152565b918291826105c4565b0390f35b610158565b61090460065f9061018e565b90565b3461093757610917366004610160565b6109336109226108f8565b61092a610152565b918291826101bb565b0390f35b610158565b9060208282031261096c575f82013567ffffffffffffffff811161096757610964920161085a565b90565b6103d9565b61015c565b61097a90610770565b9052565b60ff1690565b61098d9061097e565b9052565b6040906109ba6109c194969593966109b060608401985f850190610971565b6020830190610971565b0190610984565b565b346109f6576109f26109de6109d936600461093c565b6128cd565b6109e9939193610152565b93849384610991565b0390f35b610158565b34610a2957610a13610a0e36600461071f565b612cd7565b610a1b610152565b80610a2581610205565b0390f35b610158565b610a3a60085f906105a7565b90565b34610a6d57610a4d366004610160565b610a69610a58610a2e565b610a60610152565b918291826105c4565b0390f35b610158565b610a7e60015f9061018e565b90565b34610ab157610a91366004610160565b610aad610a9c610a72565b610aa4610152565b918291826101bb565b0390f35b610158565b90602082820312610acf57610acc915f01610787565b90565b61015c565b9190610ae7905f60208501940190610971565b565b34610b1957610b15610b04610aff366004610ab6565b612d59565b610b0c610152565b91829182610ad4565b0390f35b610158565b60018060a01b031690565b610b39906008610b3e930261016f565b610b1e565b90565b90610b4c9154610b29565b90565b610b5b60055f90610b41565b90565b90565b610b75610b70610b7a92610272565b610b5e565b610272565b90565b610b8690610b61565b90565b610b9290610b7d565b90565b610b9e90610b89565b9052565b9190610bb5905f60208501940190610b95565b565b34610be757610bc7366004610160565b610be3610bd2610b4f565b610bda610152565b91829182610ba2565b0390f35b610158565b5f80fd5b5f1c90565b610c01610c0691610bf0565b610584565b90565b610c139054610bf5565b90565b60209181520190565b60207f63616c6c00000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204f6e6c792073656e6465722063616e205f8201520152565b610c796024604092610c16565b610c8281610c1f565b0190565b610c9b9060208101905f818303910152610c6c565b90565b15610ca557565b610cad610152565b62461bcd60e51b815280610cc360048201610c86565b0390fd5b610cec33610ce6610ce0610cdb6002610c09565b61027d565b9161027d565b14610c9e565b610cf4610dbf565b565b610d02610d0791610bf0565b610500565b90565b610d149054610cf6565b90565b60207f7374617465000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c6964206368616e6e656c205f8201520152565b610d716025604092610c16565b610d7a81610d17565b0190565b610d939060208101905f818303910152610d64565b90565b15610d9d57565b610da5610152565b62461bcd60e51b815280610dbb60048201610d7e565b0390fd5b610de56001610ddf610dd9610dd35f610d0a565b926102b9565b916102b9565b14610d96565b610ded61115c565b565b610dfb610e0091610bf0565b610173565b90565b610e0d9054610def565b90565b60207f6578706972656420796574000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204368616e6e656c20686173206e6f74205f8201520152565b610e6a602b604092610c16565b610e7381610e10565b0190565b610e8c9060208101905f818303910152610e5d565b90565b15610e9657565b610e9e610152565b62461bcd60e51b815280610eb460048201610e77565b0390fd5b90565b610ecf610eca610ed492610eb8565b610b5e565b6101ab565b90565b60207f6d00000000000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204e6f2066756e647320746f20636c61695f8201520152565b610f316021604092610c16565b610f3a81610ed7565b0190565b610f539060208101905f818303910152610f24565b90565b15610f5d57565b610f65610152565b62461bcd60e51b815280610f7b60048201610f3e565b0390fd5b5f1b90565b90610f9060ff91610f7f565b9181191691161790565b610fa3906102b9565b90565b90565b90610fbe610fb9610fc592610f9a565b610fa6565b8254610f84565b9055565b610fd5610fda91610bf0565b610b1e565b90565b610fe79054610fc9565b90565b60e01b90565b151590565b610ffe81610ff0565b0361100557565b5f80fd5b9050519061101682610ff5565b565b906020828203126110315761102e915f01611009565b90565b61015c565b91602061105792949361105060408201965f830190610289565b01906101ae565b565b611061610152565b3d5f823e3d90fd5b60207f616e73666572206661696c656400000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a2054696d656f757420636c61696d2074725f8201520152565b6110c3602d604092610c16565b6110cc81611069565b0190565b6110e59060208101905f8183039101526110b6565b90565b156110ef57565b6110f7610152565b62461bcd60e51b81528061110d600482016110d0565b0390fd5b61112561112061112a926101ab565b610b5e565b6101ab565b90565b61113690610b7d565b90565b91602061115a92949361115360408201965f8301906101ae565b01906101ae565b565b6111824261117b6111756111706004610e03565b6101ab565b916101ab565b1015610e8f565b61118a6112f8565b6111a6816111a061119a5f610ebb565b916101ab565b11610f56565b6111b160025f610fa9565b6111c36111be6005610fdd565b610b89565b602063a9059cbb916111d56002610c09565b906111f35f86956111fe6111e7610152565b97889687958694610fea565b845260048401611036565b03925af180156112ac57611219915f9161127e575b506110e8565b6112236001610e03565b9061122e6002610c09565b90914261126461125e7f5877a459be8a3085203a9360a1e7e9baf9d156e9f280368fee78086dbe1f4fc893611111565b9361112d565b93611279611270610152565b92839283611139565b0390a3565b61129f915060203d81116112a5575b61129781836107b8565b810190611018565b5f611213565b503d61128d565b611059565b6112b9610cc7565b565b5f90565b6112c890610b7d565b90565b905051906112d8826103dd565b565b906020828203126112f3576112f0915f016112cb565b90565b61015c565b6113006112bb565b5061134a60206113186113136005610fdd565b610b89565b6370a082319061133f61132a306112bf565b92611333610152565b95869485938493610fea565b8352600483016105c4565b03915afa90811561138e575f91611360575b5090565b611381915060203d8111611387575b61137981836107b8565b8101906112da565b5f61135c565b503d61136f565b611059565b5f90565b5f90565b6113a36112bb565b506113ac611393565b506113b5611393565b506113be6112bb565b506113c76112bb565b506113d06112bb565b506113d96112bb565b506113e2611397565b506113ed6001610e03565b906113f86002610c09565b916114036003610c09565b9161140e6004610e03565b916114176112f8565b916114226006610e03565b9161142d6007610e03565b916114375f610d0a565b919796959493929190565b60207f616e2063616c6c00000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204f6e6c7920726563697069656e7420635f8201520152565b61149c6027604092610c16565b6114a581611442565b0190565b6114be9060208101905f81830391015261148f565b90565b156114c857565b6114d0610152565b62461bcd60e51b8152806114e6600482016114a9565b0390fd5b9061151d95949392916115183361151261150c6115076003610c09565b61027d565b9161027d565b146114c1565b61151f565b565b90611553959493929161154e600161154861154261153c5f610d0a565b926102b9565b916102b9565b14610d96565b6119ac565b565b5f7f5061796d656e744368616e6e656c3a20496e76616c6964206e6f6e6365000000910152565b611589601d602092610c16565b61159281611555565b0190565b6115ab9060208101905f81830391015261157c565b90565b156115b557565b6115bd610152565b62461bcd60e51b8152806115d360048201611596565b0390fd5b60207f62616c616e636500000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c6964206368616e6e656c205f8201520152565b6116316027604092610c16565b61163a816115d7565b0190565b6116539060208101905f818303910152611624565b90565b1561165d57565b611665610152565b62461bcd60e51b81528061167b6004820161163e565b0390fd5b90565b61168e611693916101ab565b61167f565b9052565b905090565b9091826116ac816116b393611697565b8093610819565b0190565b602080936116da82846116d26116e2966116e99c9a98611682565b018092611682565b018092611682565b019161169c565b90565b60200190565b5190565b611701913691610824565b90565b60207f6500000000000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c6964207369676e617475725f8201520152565b61175e6021604092610c16565b61176781611704565b0190565b6117809060208101905f818303910152611751565b90565b1561178a57565b611792610152565b62461bcd60e51b8152806117a86004820161176b565b0390fd5b634e487b7160e01b5f52601160045260245ffd5b6117cf6117d5919392936101ab565b926101ab565b82039182116117e057565b6117ac565b906117f15f1991610f7f565b9181191691161790565b90565b9061181361180e61181a92611111565b6117fb565b82546117e5565b9055565b60207f206661696c656400000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a205061796d656e74207472616e736665725f8201520152565b6118786027604092610c16565b6118818161181e565b0190565b61189a9060208101905f81830391015261186b565b90565b156118a457565b6118ac610152565b62461bcd60e51b8152806118c260048201611885565b0390fd5b60207f6661696c65640000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20526566756e64207472616e73666572205f8201520152565b6119206026604092610c16565b611929816118c6565b0190565b6119429060208101905f818303910152611913565b90565b1561194c57565b611954610152565b62461bcd60e51b81528061196a6004820161192d565b0390fd5b6119a36119aa9461199960609498979561198f608086019a5f8701906101ae565b60208501906101ae565b60408301906101ae565b01906101ae565b565b93611a6b90611a658397611a5f611a8c95611a478a611a38611a939b9a6119ee856119e86119e26119dd6007610e03565b6101ab565b916101ab565b116115ae565b6119f66112f8565b9b611a158d611a0e611a0887926101ab565b916101ab565b1115611656565b611a1f6001610e03565b9395919091611a2c610152565b968795602087016116b7565b602082018103825203826107b8565b611a59611a53826116f2565b916116ec565b20612d59565b926116f6565b906127ae565b611a86611a80611a7b6002610c09565b61027d565b9161027d565b14611783565b82906117c0565b90611a9f60025f610fa9565b611aaa8360076117fe565b81611abd611ab75f610ebb565b916101ab565b11611bf6575b80611ad6611ad05f610ebb565b916101ab565b11611b56575b611ae66001610e03565b611af06002610c09565b91611afb6003610c09565b93611b5142919296611b3f611b39611b337fecd9483a3eeee5869735d702da6a98e633032f959185588e1a8c36e754d4dcca97611111565b9761112d565b9761112d565b97611b48610152565b9485948561196e565b0390a4565b611b68611b636005610fdd565b610b89565b602063a9059cbb91611b7a6002610c09565b90611b985f8695611ba3611b8c610152565b97889687958694610fea565b845260048401611036565b03925af18015611bf157611bbe915f91611bc3575b50611945565b611adc565b611be4915060203d8111611bea575b611bdc81836107b8565b810190611018565b5f611bb8565b503d611bd2565b611059565b611c08611c036005610fdd565b610b89565b602063a9059cbb91611c1a6003610c09565b90611c385f8795611c43611c2c610152565b97889687958694610fea565b845260048401611036565b03925af18015611c9157611c5e915f91611c63575b5061189d565b611ac3565b611c84915060203d8111611c8a575b611c7c81836107b8565b810190611018565b5f611c58565b503d611c72565b611059565b90611ca495949392916114ea565b565b90611cda969594939291611cd55f611ccf611cc9611cc35f610d0a565b926102b9565b916102b9565b14610d96565b6122aa565b565b611cf0611ceb611cf592610eb8565b610b5e565b610272565b90565b611d0190611cdc565b90565b60207f7420616464726573730000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c696420726563697069656e5f8201520152565b611d5e6029604092610c16565b611d6781611d04565b0190565b611d809060208101905f818303910152611d51565b90565b15611d8a57565b611d92610152565b62461bcd60e51b815280611da860048201611d6b565b0390fd5b60207f6464726573730000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c69642073656e64657220615f8201520152565b611e066026604092610c16565b611e0f81611dac565b0190565b611e289060208101905f818303910152611df9565b90565b15611e3257565b611e3a610152565b62461bcd60e51b815280611e5060048201611e13565b0390fd5b60207f6472657373000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c696420746f6b656e2061645f8201520152565b611eae6025604092610c16565b611eb781611e54565b0190565b611ed09060208101905f818303910152611ea1565b90565b15611eda57565b611ee2610152565b62461bcd60e51b815280611ef860048201611ebb565b0390fd5b60207f7573742062652067726561746572207468616e20300000000000000000000000917f5061796d656e744368616e6e656c3a20496e697469616c20616d6f756e74206d5f8201520152565b611f566035604092610c16565b611f5f81611efc565b0190565b611f789060208101905f818303910152611f49565b90565b15611f8257565b611f8a610152565b62461bcd60e51b815280611fa060048201611f63565b0390fd5b60207f6561746572207468616e20300000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a205072696365206d7573742062652067725f8201520152565b611ffe602c604092610c16565b61200781611fa4565b0190565b6120209060208101905f818303910152611ff1565b90565b1561202a57565b612032610152565b62461bcd60e51b8152806120486004820161200b565b0390fd5b60207f2067726561746572207468616e20300000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204475726174696f6e206d7573742062655f8201520152565b6120a6602f604092610c16565b6120af8161204c565b0190565b6120c89060208101905f818303910152612099565b90565b156120d257565b6120da610152565b62461bcd60e51b8152806120f0600482016120b3565b0390fd5b9061210560018060a01b0391610f7f565b9181191691161790565b90565b9061212761212261212e9261112d565b61210f565b82546120f4565b9055565b612141612147919392936101ab565b926101ab565b820180921161215257565b6117ac565b61216090610b61565b90565b61216c90612157565b90565b61217890612157565b90565b90565b9061219361218e61219a9261216f565b61217b565b82546120f4565b9055565b6040906121c76121ce94969593966121bd60608401985f850190610289565b6020830190610289565b01906101ae565b565b60207f7472616e73666572206661696c65640000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e697469616c206465706f736974205f8201520152565b61222a602f604092610c16565b612233816121d0565b0190565b61224c9060208101905f81830391015261221d565b90565b1561225657565b61225e610152565b62461bcd60e51b81528061227460048201612237565b0390fd5b6040906122a16122a8949695939661229760608401985f8501906101ae565b60208301906101ae565b01906101ae565b565b6123c5936123b26123ab6123cc98956123a56123b79561239e6123be986123548d9f9d6122f2856122eb6122e56122e05f611cf8565b61027d565b9161027d565b1415611d83565b6123178361231061230a6123055f611cf8565b61027d565b9161027d565b1415611e2b565b61233c8a61233561232f61232a5f611cf8565b61027d565b9161027d565b1415611ed3565b61234e6123485f610ebb565b916101ab565b11611f7b565b6123708b61236a6123645f610ebb565b916101ab565b11612023565b61238c856123866123805f610ebb565b916101ab565b116120cb565b612397336008612112565b6002612112565b6003612112565b42612132565b60046117fe565b612163565b600561217e565b60066117fe565b60016117fe565b6123d760015f610fa9565b6123e96123e46005610fdd565b610b89565b60206323b872dd9133906124195f612400306112bf565b956124248861240d610152565b98899788968795610fea565b85526004850161219e565b03925af180156124f85761243f915f916124ca575b5061224f565b6124496001610e03565b6124536002610c09565b61245d6003610c09565b916124686004610e03565b936124736006610e03565b946124c56124b36124ad6124a77ffd150ce817ab1c0882a105ce18b55642f117bfa03930a45e7ea3d013f78e967d96611111565b9661112d565b9661112d565b966124bc610152565b93849384612278565b0390a4565b6124eb915060203d81116124f1575b6124e381836107b8565b810190611018565b5f612439565b503d6124d9565b611059565b9061250c969594939291611ca6565b565b61253c906125373361253161252b6125266002610c09565b61027d565b9161027d565b14610c9e565b61253e565b565b61256d90612568600161256261255c6125565f610d0a565b926102b9565b916102b9565b14610d96565b6126bf565b565b60207f757374206265206c617465720000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204e65772065787069726174696f6e206d5f8201520152565b6125c9602c604092610c16565b6125d28161256f565b0190565b6125eb9060208101905f8183039101526125bc565b90565b156125f557565b6125fd610152565b62461bcd60e51b815280612613600482016125d6565b0390fd5b60207f75737420626520696e2074686520667574757265000000000000000000000000917f5061796d656e744368616e6e656c3a204e65772065787069726174696f6e206d5f8201520152565b6126716034604092610c16565b61267a81612617565b0190565b6126939060208101905f818303910152612664565b90565b1561269d57565b6126a5610152565b62461bcd60e51b8152806126bb6004820161267e565b0390fd5b6126e4816126de6126d86126d36004610e03565b6101ab565b916101ab565b116125ee565b612700816126fa6126f4426101ab565b916101ab565b11612696565b61270a6004610e03565b6127158260046117fe565b61271f6001610e03565b909161274b7f7f201ba94f1edd1b6bc4682a0861aa5b75b1742feacc168871d6600710e8084c92611111565b92612760612757610152565b92839283611139565b0390a2565b61276e9061250e565b565b6127a56127ac9461279b606094989795612791608086019a5f870190610971565b6020850190610984565b6040830190610971565b0190610971565b565b6127de5f916127c76020946127c1611393565b506128cd565b9093919390936127d5610152565b94859485612770565b838052039060015afa156127f9576127f65f51610f7f565b90565b611059565b5f90565b5f90565b90565b61281d61281861282292612806565b610b5e565b6101ab565b90565b60207f65206c656e677468000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c6964207369676e617475725f8201520152565b61287f6028604092610c16565b61288881612825565b0190565b6128a19060208101905f818303910152612872565b90565b156128ab57565b6128b3610152565b62461bcd60e51b8152806128c96004820161288c565b0390fd5b6128d56127fe565b506128de6127fe565b506128e7612802565b5061290d6128f4826116f2565b6129076129016041612809565b916101ab565b146128a4565b602081015191606060408301519201515f1a90565b6129509061294b3361294561293f61293a6002610c09565b61027d565b9161027d565b14610c9e565b612952565b565b6129819061297c600161297661297061296a5f610d0a565b926102b9565b916102b9565b14610d96565b612a2b565b565b60207f7265640000000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204368616e6e656c2068617320657870695f8201520152565b6129dd6023604092610c16565b6129e681612983565b0190565b6129ff9060208101905f8183039101526129d0565b90565b15612a0957565b612a11610152565b62461bcd60e51b815280612a27600482016129ea565b0390fd5b612a5990612a5442612a4e612a48612a436004610e03565b6101ab565b916101ab565b10612a02565b612bab565b565b60207f7573742062652067726561746572207468616e20300000000000000000000000917f5061796d656e744368616e6e656c3a204465706f73697420616d6f756e74206d5f8201520152565b612ab56035604092610c16565b612abe81612a5b565b0190565b612ad79060208101905f818303910152612aa8565b90565b15612ae157565b612ae9610152565b62461bcd60e51b815280612aff60048201612ac2565b0390fd5b60207f206661696c656400000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204465706f736974207472616e736665725f8201520152565b612b5d6027604092610c16565b612b6681612b03565b0190565b612b7f9060208101905f818303910152612b50565b90565b15612b8957565b612b91610152565b62461bcd60e51b815280612ba760048201612b6a565b0390fd5b612bc781612bc1612bbb5f610ebb565b916101ab565b11612ada565b612bd9612bd46005610fdd565b610b89565b60206323b872dd91612beb6002610c09565b90612c125f612bf9306112bf565b95612c1d88612c06610152565b98899788968795610fea565b85526004850161219e565b03925af18015612cd257612c38915f91612ca4575b50612b82565b612c426001610e03565b90612c4d6002610c09565b9091612c576112f8565b612c8a612c847ff7748ed362ae6427631c778e495f7eb63b00c0794b6066744a0cba2c59135a6593611111565b9361112d565b93612c9f612c96610152565b92839283611139565b0390a3565b612cc5915060203d8111612ccb575b612cbd81836107b8565b810190611018565b5f612c32565b503d612cb3565b611059565b612ce090612922565b565b905090565b5f7f19457468657265756d205369676e6564204d6573736167653a0a333200000000910152565b612d1a601c8092612ce2565b612d2381612ce7565b0190565b90565b612d36612d3b91610770565b612d27565b9052565b90612d55612d4e602093612d0e565b8092612d2a565b0190565b612d8c612d7d91612d686127fe565b50612d71610152565b92839160208301612d3f565b602082018103825203826107b8565b612d9e612d98826116f2565b916116ec565b209056fea2646970667358221220a81e9e945a772fc4d4529cf23a0c28973c459e5a9d3db191f84587bcb9dc14f864736f6c634300081c0033",
    "sourceMap": "707:13346:2:-:0;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;707:13346:2;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;4147:139::-;4245:34;4260:19;4245:34;;:::i;:::-;4147:139::o",
    "linkReferences": {}
  },
  "deployedBytecode": {
    "object": "0x60806040526004361015610013575b610bec565b61001d5f3561014c565b806308e8553e146101475780630e1da6c31461014257806312065fe01461013d57806330d281e0146101385780634665096d146101335780634e1b16ce1461012e57806355b550941461012957806366d003ac1461012457806367e404ce1461011f57806392aa5bcb1461011a5780639714378c1461011557806397aba7f914610110578063a035b1fe1461010b578063a7bb580314610106578063b6b55f2514610101578063c45a0155146100fc578063e2cee544146100f7578063fa540801146100f25763fc0c546a0361000e57610bb7565b610ae9565b610a81565b610a3d565b6109fb565b6109c3565b610907565b6108c2565b61073d565b6106e5565b61061d565b6105d9565b61054f565b6104c6565b6103a4565b610356565b61023d565b61020a565b6101d0565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f91031261016a57565b61015c565b1c90565b90565b61018690600861018b930261016f565b610173565b90565b906101999154610176565b90565b6101a860075f9061018e565b90565b90565b6101b7906101ab565b9052565b91906101ce905f602085019401906101ae565b565b34610200576101e0366004610160565b6101fc6101eb61019c565b6101f3610152565b918291826101bb565b0390f35b610158565b5f0190565b346102385761021a366004610160565b6102226112b1565b61022a610152565b8061023481610205565b0390f35b610158565b3461026d5761024d366004610160565b6102696102586112f8565b610260610152565b918291826101bb565b0390f35b610158565b60018060a01b031690565b61028690610272565b90565b6102929061027d565b9052565b634e487b7160e01b5f52602160045260245ffd5b600311156102b457565b610296565b906102c3826102aa565b565b6102ce906102b9565b90565b6102da906102c5565b9052565b959391989796949290986101008701995f88016102fa916101ae565b6020870161030791610289565b6040860161031491610289565b60608501610321916101ae565b6080840161032e916101ae565b60a0830161033b916101ae565b60c08201610348916101ae565b60e001610354916102d1565b565b3461039057610366366004610160565b61038c61037161139b565b94610383989698949194939293610152565b988998896102de565b0390f35b610158565b6103a160045f9061018e565b90565b346103d4576103b4366004610160565b6103d06103bf610395565b6103c7610152565b918291826101bb565b0390f35b610158565b5f80fd5b6103e6816101ab565b036103ed57565b5f80fd5b905035906103fe826103dd565b565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156104465781359167ffffffffffffffff831161044157602001926001830284011161043c57565b610408565b610404565b610400565b91906080838203126104c157610463815f85016103f1565b9261047182602083016103f1565b92604082013567ffffffffffffffff81116104bc578361049291840161040c565b929093606082013567ffffffffffffffff81116104b7576104b3920161040c565b9091565b6103d9565b6103d9565b61015c565b346104fb576104e56104d936600461044b565b94939093929192611c96565b6104ed610152565b806104f781610205565b0390f35b610158565b60ff1690565b61051690600861051b930261016f565b610500565b90565b906105299154610506565b90565b6105375f5f9061051e565b90565b919061054d905f602085019401906102d1565b565b3461057f5761055f366004610160565b61057b61056a61052c565b610572610152565b9182918261053a565b0390f35b610158565b60018060a01b031690565b61059f9060086105a4930261016f565b610584565b90565b906105b2915461058f565b90565b6105c160035f906105a7565b90565b91906105d7905f60208501940190610289565b565b34610609576105e9366004610160565b6106056105f46105b5565b6105fc610152565b918291826105c4565b0390f35b610158565b61061a60025f906105a7565b90565b3461064d5761062d366004610160565b61064961063861060e565b610640610152565b918291826105c4565b0390f35b610158565b61065b8161027d565b0361066257565b5f80fd5b9050359061067382610652565b565b60e0818303126106e05761068b825f8301610666565b926106998360208401610666565b926106a781604085016103f1565b926106b58260608301610666565b926106dd6106c684608085016103f1565b936106d48160a086016103f1565b9360c0016103f1565b90565b61015c565b3461071a576107046106f8366004610675565b959490949391936124fd565b61070c610152565b8061071681610205565b0390f35b610158565b9060208282031261073857610735915f016103f1565b90565b61015c565b3461076b5761075561075036600461071f565b612765565b61075d610152565b8061076781610205565b0390f35b610158565b90565b61077c81610770565b0361078357565b5f80fd5b9050359061079482610773565b565b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906107c29061079a565b810190811067ffffffffffffffff8211176107dc57604052565b6107a4565b906107f46107ed610152565b92836107b8565b565b67ffffffffffffffff81116108145761081060209161079a565b0190565b6107a4565b90825f939282370152565b90929192610839610834826107f6565b6107e1565b938185526020850190828401116108555761085392610819565b565b610796565b9080601f830112156108785781602061087593359101610824565b90565b610400565b9190916040818403126108bd57610896835f8301610787565b92602082013567ffffffffffffffff81116108b8576108b5920161085a565b90565b6103d9565b61015c565b346108f3576108ef6108de6108d836600461087d565b906127ae565b6108e6610152565b918291826105c4565b0390f35b610158565b61090460065f9061018e565b90565b3461093757610917366004610160565b6109336109226108f8565b61092a610152565b918291826101bb565b0390f35b610158565b9060208282031261096c575f82013567ffffffffffffffff811161096757610964920161085a565b90565b6103d9565b61015c565b61097a90610770565b9052565b60ff1690565b61098d9061097e565b9052565b6040906109ba6109c194969593966109b060608401985f850190610971565b6020830190610971565b0190610984565b565b346109f6576109f26109de6109d936600461093c565b6128cd565b6109e9939193610152565b93849384610991565b0390f35b610158565b34610a2957610a13610a0e36600461071f565b612cd7565b610a1b610152565b80610a2581610205565b0390f35b610158565b610a3a60085f906105a7565b90565b34610a6d57610a4d366004610160565b610a69610a58610a2e565b610a60610152565b918291826105c4565b0390f35b610158565b610a7e60015f9061018e565b90565b34610ab157610a91366004610160565b610aad610a9c610a72565b610aa4610152565b918291826101bb565b0390f35b610158565b90602082820312610acf57610acc915f01610787565b90565b61015c565b9190610ae7905f60208501940190610971565b565b34610b1957610b15610b04610aff366004610ab6565b612d59565b610b0c610152565b91829182610ad4565b0390f35b610158565b60018060a01b031690565b610b39906008610b3e930261016f565b610b1e565b90565b90610b4c9154610b29565b90565b610b5b60055f90610b41565b90565b90565b610b75610b70610b7a92610272565b610b5e565b610272565b90565b610b8690610b61565b90565b610b9290610b7d565b90565b610b9e90610b89565b9052565b9190610bb5905f60208501940190610b95565b565b34610be757610bc7366004610160565b610be3610bd2610b4f565b610bda610152565b91829182610ba2565b0390f35b610158565b5f80fd5b5f1c90565b610c01610c0691610bf0565b610584565b90565b610c139054610bf5565b90565b60209181520190565b60207f63616c6c00000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204f6e6c792073656e6465722063616e205f8201520152565b610c796024604092610c16565b610c8281610c1f565b0190565b610c9b9060208101905f818303910152610c6c565b90565b15610ca557565b610cad610152565b62461bcd60e51b815280610cc360048201610c86565b0390fd5b610cec33610ce6610ce0610cdb6002610c09565b61027d565b9161027d565b14610c9e565b610cf4610dbf565b565b610d02610d0791610bf0565b610500565b90565b610d149054610cf6565b90565b60207f7374617465000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c6964206368616e6e656c205f8201520152565b610d716025604092610c16565b610d7a81610d17565b0190565b610d939060208101905f818303910152610d64565b90565b15610d9d57565b610da5610152565b62461bcd60e51b815280610dbb60048201610d7e565b0390fd5b610de56001610ddf610dd9610dd35f610d0a565b926102b9565b916102b9565b14610d96565b610ded61115c565b565b610dfb610e0091610bf0565b610173565b90565b610e0d9054610def565b90565b60207f6578706972656420796574000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204368616e6e656c20686173206e6f74205f8201520152565b610e6a602b604092610c16565b610e7381610e10565b0190565b610e8c9060208101905f818303910152610e5d565b90565b15610e9657565b610e9e610152565b62461bcd60e51b815280610eb460048201610e77565b0390fd5b90565b610ecf610eca610ed492610eb8565b610b5e565b6101ab565b90565b60207f6d00000000000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204e6f2066756e647320746f20636c61695f8201520152565b610f316021604092610c16565b610f3a81610ed7565b0190565b610f539060208101905f818303910152610f24565b90565b15610f5d57565b610f65610152565b62461bcd60e51b815280610f7b60048201610f3e565b0390fd5b5f1b90565b90610f9060ff91610f7f565b9181191691161790565b610fa3906102b9565b90565b90565b90610fbe610fb9610fc592610f9a565b610fa6565b8254610f84565b9055565b610fd5610fda91610bf0565b610b1e565b90565b610fe79054610fc9565b90565b60e01b90565b151590565b610ffe81610ff0565b0361100557565b5f80fd5b9050519061101682610ff5565b565b906020828203126110315761102e915f01611009565b90565b61015c565b91602061105792949361105060408201965f830190610289565b01906101ae565b565b611061610152565b3d5f823e3d90fd5b60207f616e73666572206661696c656400000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a2054696d656f757420636c61696d2074725f8201520152565b6110c3602d604092610c16565b6110cc81611069565b0190565b6110e59060208101905f8183039101526110b6565b90565b156110ef57565b6110f7610152565b62461bcd60e51b81528061110d600482016110d0565b0390fd5b61112561112061112a926101ab565b610b5e565b6101ab565b90565b61113690610b7d565b90565b91602061115a92949361115360408201965f8301906101ae565b01906101ae565b565b6111824261117b6111756111706004610e03565b6101ab565b916101ab565b1015610e8f565b61118a6112f8565b6111a6816111a061119a5f610ebb565b916101ab565b11610f56565b6111b160025f610fa9565b6111c36111be6005610fdd565b610b89565b602063a9059cbb916111d56002610c09565b906111f35f86956111fe6111e7610152565b97889687958694610fea565b845260048401611036565b03925af180156112ac57611219915f9161127e575b506110e8565b6112236001610e03565b9061122e6002610c09565b90914261126461125e7f5877a459be8a3085203a9360a1e7e9baf9d156e9f280368fee78086dbe1f4fc893611111565b9361112d565b93611279611270610152565b92839283611139565b0390a3565b61129f915060203d81116112a5575b61129781836107b8565b810190611018565b5f611213565b503d61128d565b611059565b6112b9610cc7565b565b5f90565b6112c890610b7d565b90565b905051906112d8826103dd565b565b906020828203126112f3576112f0915f016112cb565b90565b61015c565b6113006112bb565b5061134a60206113186113136005610fdd565b610b89565b6370a082319061133f61132a306112bf565b92611333610152565b95869485938493610fea565b8352600483016105c4565b03915afa90811561138e575f91611360575b5090565b611381915060203d8111611387575b61137981836107b8565b8101906112da565b5f61135c565b503d61136f565b611059565b5f90565b5f90565b6113a36112bb565b506113ac611393565b506113b5611393565b506113be6112bb565b506113c76112bb565b506113d06112bb565b506113d96112bb565b506113e2611397565b506113ed6001610e03565b906113f86002610c09565b916114036003610c09565b9161140e6004610e03565b916114176112f8565b916114226006610e03565b9161142d6007610e03565b916114375f610d0a565b919796959493929190565b60207f616e2063616c6c00000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204f6e6c7920726563697069656e7420635f8201520152565b61149c6027604092610c16565b6114a581611442565b0190565b6114be9060208101905f81830391015261148f565b90565b156114c857565b6114d0610152565b62461bcd60e51b8152806114e6600482016114a9565b0390fd5b9061151d95949392916115183361151261150c6115076003610c09565b61027d565b9161027d565b146114c1565b61151f565b565b90611553959493929161154e600161154861154261153c5f610d0a565b926102b9565b916102b9565b14610d96565b6119ac565b565b5f7f5061796d656e744368616e6e656c3a20496e76616c6964206e6f6e6365000000910152565b611589601d602092610c16565b61159281611555565b0190565b6115ab9060208101905f81830391015261157c565b90565b156115b557565b6115bd610152565b62461bcd60e51b8152806115d360048201611596565b0390fd5b60207f62616c616e636500000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c6964206368616e6e656c205f8201520152565b6116316027604092610c16565b61163a816115d7565b0190565b6116539060208101905f818303910152611624565b90565b1561165d57565b611665610152565b62461bcd60e51b81528061167b6004820161163e565b0390fd5b90565b61168e611693916101ab565b61167f565b9052565b905090565b9091826116ac816116b393611697565b8093610819565b0190565b602080936116da82846116d26116e2966116e99c9a98611682565b018092611682565b018092611682565b019161169c565b90565b60200190565b5190565b611701913691610824565b90565b60207f6500000000000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c6964207369676e617475725f8201520152565b61175e6021604092610c16565b61176781611704565b0190565b6117809060208101905f818303910152611751565b90565b1561178a57565b611792610152565b62461bcd60e51b8152806117a86004820161176b565b0390fd5b634e487b7160e01b5f52601160045260245ffd5b6117cf6117d5919392936101ab565b926101ab565b82039182116117e057565b6117ac565b906117f15f1991610f7f565b9181191691161790565b90565b9061181361180e61181a92611111565b6117fb565b82546117e5565b9055565b60207f206661696c656400000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a205061796d656e74207472616e736665725f8201520152565b6118786027604092610c16565b6118818161181e565b0190565b61189a9060208101905f81830391015261186b565b90565b156118a457565b6118ac610152565b62461bcd60e51b8152806118c260048201611885565b0390fd5b60207f6661696c65640000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20526566756e64207472616e73666572205f8201520152565b6119206026604092610c16565b611929816118c6565b0190565b6119429060208101905f818303910152611913565b90565b1561194c57565b611954610152565b62461bcd60e51b81528061196a6004820161192d565b0390fd5b6119a36119aa9461199960609498979561198f608086019a5f8701906101ae565b60208501906101ae565b60408301906101ae565b01906101ae565b565b93611a6b90611a658397611a5f611a8c95611a478a611a38611a939b9a6119ee856119e86119e26119dd6007610e03565b6101ab565b916101ab565b116115ae565b6119f66112f8565b9b611a158d611a0e611a0887926101ab565b916101ab565b1115611656565b611a1f6001610e03565b9395919091611a2c610152565b968795602087016116b7565b602082018103825203826107b8565b611a59611a53826116f2565b916116ec565b20612d59565b926116f6565b906127ae565b611a86611a80611a7b6002610c09565b61027d565b9161027d565b14611783565b82906117c0565b90611a9f60025f610fa9565b611aaa8360076117fe565b81611abd611ab75f610ebb565b916101ab565b11611bf6575b80611ad6611ad05f610ebb565b916101ab565b11611b56575b611ae66001610e03565b611af06002610c09565b91611afb6003610c09565b93611b5142919296611b3f611b39611b337fecd9483a3eeee5869735d702da6a98e633032f959185588e1a8c36e754d4dcca97611111565b9761112d565b9761112d565b97611b48610152565b9485948561196e565b0390a4565b611b68611b636005610fdd565b610b89565b602063a9059cbb91611b7a6002610c09565b90611b985f8695611ba3611b8c610152565b97889687958694610fea565b845260048401611036565b03925af18015611bf157611bbe915f91611bc3575b50611945565b611adc565b611be4915060203d8111611bea575b611bdc81836107b8565b810190611018565b5f611bb8565b503d611bd2565b611059565b611c08611c036005610fdd565b610b89565b602063a9059cbb91611c1a6003610c09565b90611c385f8795611c43611c2c610152565b97889687958694610fea565b845260048401611036565b03925af18015611c9157611c5e915f91611c63575b5061189d565b611ac3565b611c84915060203d8111611c8a575b611c7c81836107b8565b810190611018565b5f611c58565b503d611c72565b611059565b90611ca495949392916114ea565b565b90611cda969594939291611cd55f611ccf611cc9611cc35f610d0a565b926102b9565b916102b9565b14610d96565b6122aa565b565b611cf0611ceb611cf592610eb8565b610b5e565b610272565b90565b611d0190611cdc565b90565b60207f7420616464726573730000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c696420726563697069656e5f8201520152565b611d5e6029604092610c16565b611d6781611d04565b0190565b611d809060208101905f818303910152611d51565b90565b15611d8a57565b611d92610152565b62461bcd60e51b815280611da860048201611d6b565b0390fd5b60207f6464726573730000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c69642073656e64657220615f8201520152565b611e066026604092610c16565b611e0f81611dac565b0190565b611e289060208101905f818303910152611df9565b90565b15611e3257565b611e3a610152565b62461bcd60e51b815280611e5060048201611e13565b0390fd5b60207f6472657373000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c696420746f6b656e2061645f8201520152565b611eae6025604092610c16565b611eb781611e54565b0190565b611ed09060208101905f818303910152611ea1565b90565b15611eda57565b611ee2610152565b62461bcd60e51b815280611ef860048201611ebb565b0390fd5b60207f7573742062652067726561746572207468616e20300000000000000000000000917f5061796d656e744368616e6e656c3a20496e697469616c20616d6f756e74206d5f8201520152565b611f566035604092610c16565b611f5f81611efc565b0190565b611f789060208101905f818303910152611f49565b90565b15611f8257565b611f8a610152565b62461bcd60e51b815280611fa060048201611f63565b0390fd5b60207f6561746572207468616e20300000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a205072696365206d7573742062652067725f8201520152565b611ffe602c604092610c16565b61200781611fa4565b0190565b6120209060208101905f818303910152611ff1565b90565b1561202a57565b612032610152565b62461bcd60e51b8152806120486004820161200b565b0390fd5b60207f2067726561746572207468616e20300000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204475726174696f6e206d7573742062655f8201520152565b6120a6602f604092610c16565b6120af8161204c565b0190565b6120c89060208101905f818303910152612099565b90565b156120d257565b6120da610152565b62461bcd60e51b8152806120f0600482016120b3565b0390fd5b9061210560018060a01b0391610f7f565b9181191691161790565b90565b9061212761212261212e9261112d565b61210f565b82546120f4565b9055565b612141612147919392936101ab565b926101ab565b820180921161215257565b6117ac565b61216090610b61565b90565b61216c90612157565b90565b61217890612157565b90565b90565b9061219361218e61219a9261216f565b61217b565b82546120f4565b9055565b6040906121c76121ce94969593966121bd60608401985f850190610289565b6020830190610289565b01906101ae565b565b60207f7472616e73666572206661696c65640000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e697469616c206465706f736974205f8201520152565b61222a602f604092610c16565b612233816121d0565b0190565b61224c9060208101905f81830391015261221d565b90565b1561225657565b61225e610152565b62461bcd60e51b81528061227460048201612237565b0390fd5b6040906122a16122a8949695939661229760608401985f8501906101ae565b60208301906101ae565b01906101ae565b565b6123c5936123b26123ab6123cc98956123a56123b79561239e6123be986123548d9f9d6122f2856122eb6122e56122e05f611cf8565b61027d565b9161027d565b1415611d83565b6123178361231061230a6123055f611cf8565b61027d565b9161027d565b1415611e2b565b61233c8a61233561232f61232a5f611cf8565b61027d565b9161027d565b1415611ed3565b61234e6123485f610ebb565b916101ab565b11611f7b565b6123708b61236a6123645f610ebb565b916101ab565b11612023565b61238c856123866123805f610ebb565b916101ab565b116120cb565b612397336008612112565b6002612112565b6003612112565b42612132565b60046117fe565b612163565b600561217e565b60066117fe565b60016117fe565b6123d760015f610fa9565b6123e96123e46005610fdd565b610b89565b60206323b872dd9133906124195f612400306112bf565b956124248861240d610152565b98899788968795610fea565b85526004850161219e565b03925af180156124f85761243f915f916124ca575b5061224f565b6124496001610e03565b6124536002610c09565b61245d6003610c09565b916124686004610e03565b936124736006610e03565b946124c56124b36124ad6124a77ffd150ce817ab1c0882a105ce18b55642f117bfa03930a45e7ea3d013f78e967d96611111565b9661112d565b9661112d565b966124bc610152565b93849384612278565b0390a4565b6124eb915060203d81116124f1575b6124e381836107b8565b810190611018565b5f612439565b503d6124d9565b611059565b9061250c969594939291611ca6565b565b61253c906125373361253161252b6125266002610c09565b61027d565b9161027d565b14610c9e565b61253e565b565b61256d90612568600161256261255c6125565f610d0a565b926102b9565b916102b9565b14610d96565b6126bf565b565b60207f757374206265206c617465720000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204e65772065787069726174696f6e206d5f8201520152565b6125c9602c604092610c16565b6125d28161256f565b0190565b6125eb9060208101905f8183039101526125bc565b90565b156125f557565b6125fd610152565b62461bcd60e51b815280612613600482016125d6565b0390fd5b60207f75737420626520696e2074686520667574757265000000000000000000000000917f5061796d656e744368616e6e656c3a204e65772065787069726174696f6e206d5f8201520152565b6126716034604092610c16565b61267a81612617565b0190565b6126939060208101905f818303910152612664565b90565b1561269d57565b6126a5610152565b62461bcd60e51b8152806126bb6004820161267e565b0390fd5b6126e4816126de6126d86126d36004610e03565b6101ab565b916101ab565b116125ee565b612700816126fa6126f4426101ab565b916101ab565b11612696565b61270a6004610e03565b6127158260046117fe565b61271f6001610e03565b909161274b7f7f201ba94f1edd1b6bc4682a0861aa5b75b1742feacc168871d6600710e8084c92611111565b92612760612757610152565b92839283611139565b0390a2565b61276e9061250e565b565b6127a56127ac9461279b606094989795612791608086019a5f870190610971565b6020850190610984565b6040830190610971565b0190610971565b565b6127de5f916127c76020946127c1611393565b506128cd565b9093919390936127d5610152565b94859485612770565b838052039060015afa156127f9576127f65f51610f7f565b90565b611059565b5f90565b5f90565b90565b61281d61281861282292612806565b610b5e565b6101ab565b90565b60207f65206c656e677468000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a20496e76616c6964207369676e617475725f8201520152565b61287f6028604092610c16565b61288881612825565b0190565b6128a19060208101905f818303910152612872565b90565b156128ab57565b6128b3610152565b62461bcd60e51b8152806128c96004820161288c565b0390fd5b6128d56127fe565b506128de6127fe565b506128e7612802565b5061290d6128f4826116f2565b6129076129016041612809565b916101ab565b146128a4565b602081015191606060408301519201515f1a90565b6129509061294b3361294561293f61293a6002610c09565b61027d565b9161027d565b14610c9e565b612952565b565b6129819061297c600161297661297061296a5f610d0a565b926102b9565b916102b9565b14610d96565b612a2b565b565b60207f7265640000000000000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204368616e6e656c2068617320657870695f8201520152565b6129dd6023604092610c16565b6129e681612983565b0190565b6129ff9060208101905f8183039101526129d0565b90565b15612a0957565b612a11610152565b62461bcd60e51b815280612a27600482016129ea565b0390fd5b612a5990612a5442612a4e612a48612a436004610e03565b6101ab565b916101ab565b10612a02565b612bab565b565b60207f7573742062652067726561746572207468616e20300000000000000000000000917f5061796d656e744368616e6e656c3a204465706f73697420616d6f756e74206d5f8201520152565b612ab56035604092610c16565b612abe81612a5b565b0190565b612ad79060208101905f818303910152612aa8565b90565b15612ae157565b612ae9610152565b62461bcd60e51b815280612aff60048201612ac2565b0390fd5b60207f206661696c656400000000000000000000000000000000000000000000000000917f5061796d656e744368616e6e656c3a204465706f736974207472616e736665725f8201520152565b612b5d6027604092610c16565b612b6681612b03565b0190565b612b7f9060208101905f818303910152612b50565b90565b15612b8957565b612b91610152565b62461bcd60e51b815280612ba760048201612b6a565b0390fd5b612bc781612bc1612bbb5f610ebb565b916101ab565b11612ada565b612bd9612bd46005610fdd565b610b89565b60206323b872dd91612beb6002610c09565b90612c125f612bf9306112bf565b95612c1d88612c06610152565b98899788968795610fea565b85526004850161219e565b03925af18015612cd257612c38915f91612ca4575b50612b82565b612c426001610e03565b90612c4d6002610c09565b9091612c576112f8565b612c8a612c847ff7748ed362ae6427631c778e495f7eb63b00c0794b6066744a0cba2c59135a6593611111565b9361112d565b93612c9f612c96610152565b92839283611139565b0390a3565b612cc5915060203d8111612ccb575b612cbd81836107b8565b810190611018565b5f612c32565b503d612cb3565b611059565b612ce090612922565b565b905090565b5f7f19457468657265756d205369676e6564204d6573736167653a0a333200000000910152565b612d1a601c8092612ce2565b612d2381612ce7565b0190565b90565b612d36612d3b91610770565b612d27565b9052565b90612d55612d4e602093612d0e565b8092612d2a565b0190565b612d8c612d7d91612d686127fe565b50612d71610152565b92839160208301612d3f565b602082018103825203826107b8565b612d9e612d98826116f2565b916116ec565b209056fea2646970667358221220a81e9e945a772fc4d4529cf23a0c28973c459e5a9d3db191f84587bcb9dc14f864736f6c634300081c0033",
    "sourceMap": "707:13346:2:-:0;;;;;;;;;-1:-1:-1;707:13346:2;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;:::o;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;1591:33::-;;;;;;:::i;:::-;;:::o;707:13346::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;707:13346:2;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1309:25::-;;;;;;:::i;:::-;;:::o;707:13346::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;932:32::-;;;;;;:::i;:::-;;:::o;707:13346::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;1193:24::-;;;;;;:::i;:::-;;:::o;707:13346::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1113:21::-;;;;;;:::i;:::-;;:::o;707:13346::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1501:20::-;;;;;;:::i;:::-;;:::o;707:13346::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;1712:22::-;;;;;;:::i;:::-;;:::o;707:13346::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1030:24::-;;;;;;:::i;:::-;;:::o;707:13346::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;1403:19::-;;;;;;:::i;:::-;;:::o;707:13346::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;3241:119;3273:69;3281:10;:20;;3295:6;;;:::i;:::-;3281:20;:::i;:::-;;;:::i;:::-;;3273:69;:::i;:::-;3352:1;;:::i;:::-;3241:119::o;707:13346::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;3667:190;3726:113;10542:17;3747:29;;:12;;;:::i;:::-;3763:13;3747:29;:::i;:::-;;;:::i;:::-;;3726:113;:::i;:::-;3849:1;;:::i;:::-;3667:190::o;707:13346::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;10486:618::-;10571:119;10592:15;:29;;10611:10;;;:::i;:::-;10592:29;:::i;:::-;;;:::i;:::-;;;10571:119;:::i;:::-;10719:12;;:::i;:::-;10741:57;10749:7;:11;;10759:1;10749:11;:::i;:::-;;;:::i;:::-;;10741:57;:::i;:::-;10854:34;10869:19;10854:34;;:::i;:::-;10920:14;:5;;;:::i;:::-;:14;:::i;:::-;:31;:14;10935:6;;;;:::i;:::-;10943:7;10920:31;;10943:7;10920:31;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;10899:123;10920:31;;;;;10486:618;10899:123;;:::i;:::-;11053:9;;;:::i;:::-;11064:6;;;;:::i;:::-;11072:7;11081:15;;11038:59;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;10486:618::o;10920:31::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;10486:618::-;;;:::i;:::-;:::o;707:13346::-;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;11249:106::-;11292:7;;:::i;:::-;11318:5;:30;;:15;:5;;;:::i;:::-;:15;:::i;:::-;;11342:4;11318:30;11334:13;11342:4;11334:13;:::i;:::-;11318:30;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;11249:106;11311:37;;:::o;11318:30::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;707:13346::-;;;:::o;:::-;;;:::o;11778:559::-;11864:10;;:::i;:::-;11888:18;;;:::i;:::-;11920:21;;;:::i;:::-;11955:11;;;:::i;:::-;11980:15;;;:::i;:::-;12009:23;;;:::i;:::-;12046:17;;;:::i;:::-;12077:18;;;:::i;:::-;12141:9;;;;:::i;:::-;12164:6;;;;:::i;:::-;12184:9;;;;:::i;:::-;12207:10;;;;:::i;:::-;12231:12;;;:::i;:::-;12257:5;;;;:::i;:::-;12276:18;;;;:::i;:::-;12308:12;;;;:::i;:::-;12120:210;;;;;;;;;:::o;707:13346::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;3438:162;;3592:1;3438:162;;;;;3473:109;3494:10;:23;;3508:9;;;:::i;:::-;3494:23;:::i;:::-;;;:::i;:::-;;3473:109;:::i;:::-;3592:1;:::i;:::-;3438:162::o;3667:190::-;;3849:1;3667:190;;;;;3726:113;7896:17;3747:29;;:12;;;:::i;:::-;3763:13;3747:29;:::i;:::-;;;:::i;:::-;;3726:113;:::i;:::-;3849:1;:::i;:::-;3667:190::o;707:13346::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::o;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;7719:1818::-;;8435:46;7719:1818;8435:46;7719:1818;;8367:36;8414:136;7719:1818;8257:59;7719:1818;8257:59;8680:31;7719:1818;;7925:68;7933:5;:26;;7941:18;;;:::i;:::-;7933:26;:::i;:::-;;;:::i;:::-;;7925:68;:::i;:::-;8029:12;;:::i;:::-;8072:14;8051:118;8072:14;:32;;:14;8090;8072:32;:::i;:::-;;;:::i;:::-;;;8051:118;:::i;:::-;8274:9;;;:::i;:::-;8285:14;8301:5;8308:7;;8257:59;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;8234:92;;;;:::i;:::-;;;:::i;:::-;;8367:36;:::i;:::-;8471:9;8435:46;:::i;:::-;;;:::i;:::-;:56;;8485:6;;;:::i;:::-;8435:56;:::i;:::-;;;:::i;:::-;;8414:136;:::i;:::-;8697:14;8680:31;;:::i;:::-;8783:19;8768:34;8783:19;8768:34;;:::i;:::-;8812:26;8833:5;8812:26;;:::i;:::-;8894:13;:17;;8910:1;8894:17;:::i;:::-;;;:::i;:::-;;8890:186;;7719:1818;9143:14;:18;;9160:1;9143:18;:::i;:::-;;;:::i;:::-;;9139:184;;7719:1818;9365:9;;;:::i;:::-;9388:6;;;:::i;:::-;9408:9;;;;:::i;:::-;9431:15;9338:192;9431:15;9460:13;9487:14;9515:5;9338:192;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;;:::i;:::-;;;;7719:1818::o;9139:184::-;9202:14;:5;;;:::i;:::-;:14;:::i;:::-;:38;:14;9217:6;;;;:::i;:::-;9225:14;9202:38;;9225:14;9202:38;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;9177:135;9202:38;;;;;9139:184;9177:135;;:::i;:::-;9139:184;;9202:38;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;8890:186::-;8952:14;:5;;;:::i;:::-;:14;:::i;:::-;:40;:14;8967:9;;;;:::i;:::-;8978:13;8952:40;;8978:13;8952:40;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;8927:138;8952:40;;;;;8890:186;8927:138;;:::i;:::-;8890:186;;8952:40;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;7719:1818::-;;;;;;;;;:::i;:::-;:::o;3667:190::-;;3849:1;3667:190;;;;;;3726:113;5117:26;3747:29;;:12;;;:::i;:::-;3763:13;3747:29;:::i;:::-;;;:::i;:::-;;3726:113;:::i;:::-;3849:1;:::i;:::-;3667:190::o;707:13346::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;4888:1653::-;6051:14;4888:1653;5962:40;5975:27;6075:22;4888:1653;;5930:22;6020:21;4888:1653;5904:16;6012:29;4888:1653;5514:111;4888:1653;;;5155:112;5176:10;:24;;5190:10;5198:1;5190:10;:::i;:::-;5176:24;:::i;:::-;;;:::i;:::-;;;5155:112;:::i;:::-;5277:106;5298:7;:21;;5309:10;5317:1;5309:10;:::i;:::-;5298:21;:::i;:::-;;;:::i;:::-;;;5277:106;:::i;:::-;5393:111;5414:13;:27;;5431:10;5439:1;5431:10;:::i;:::-;5414:27;:::i;:::-;;;:::i;:::-;;;5393:111;:::i;:::-;5535:11;;5545:1;5535:11;:::i;:::-;;;:::i;:::-;;5514:111;:::i;:::-;5635:67;5643:6;:10;;5652:1;5643:10;:::i;:::-;;;:::i;:::-;;5635:67;:::i;:::-;5712:107;5733:9;:13;;5745:1;5733:13;:::i;:::-;;;:::i;:::-;;5712:107;:::i;:::-;5873:20;5883:10;5873:20;;:::i;:::-;5904:16;;:::i;:::-;5930:22;;:::i;:::-;5975:15;:27;:::i;:::-;5962:40;;:::i;:::-;6020:21;:::i;:::-;6012:29;;:::i;:::-;6051:14;;:::i;:::-;6075:22;;:::i;:::-;6107:32;6122:17;6107:32;;:::i;:::-;6237:18;:5;;;:::i;:::-;:18;:::i;:::-;:54;:18;6256:10;;6276:4;6237:54;;6268:13;6276:4;6268:13;:::i;:::-;6283:7;6237:54;6283:7;6237:54;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;6216:148;6237:54;;;;;4888:1653;6216:148;;:::i;:::-;6408:9;;;:::i;:::-;6431:6;;;:::i;:::-;6451:9;;;:::i;:::-;6474:10;;;;:::i;:::-;6498:7;6519:5;;;:::i;:::-;6380:154;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;;:::i;:::-;;;;4888:1653::o;6237:54::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;4888:1653::-;;;;;;;;;;:::i;:::-;:::o;3241:119::-;3352:1;3241:119;3273:69;3281:10;:20;;3295:6;;;:::i;:::-;3281:20;:::i;:::-;;;:::i;:::-;;3273:69;:::i;:::-;3352:1;:::i;:::-;3241:119::o;3667:190::-;3849:1;3667:190;3726:113;9862:17;3747:29;;:12;;;:::i;:::-;3763:13;3747:29;:::i;:::-;;;:::i;:::-;;3726:113;:::i;:::-;3849:1;:::i;:::-;3667:190::o;707:13346::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;9777:534;9891:117;9912:13;:26;;9928:10;;;:::i;:::-;9912:26;:::i;:::-;;;:::i;:::-;;9891:117;:::i;:::-;10018:130;10039:13;:31;;10055:15;10039:31;:::i;:::-;;;:::i;:::-;;10018:130;:::i;:::-;10183:10;;;:::i;:::-;10203:26;10216:13;10203:26;;:::i;:::-;10264:9;;;:::i;:::-;10275:13;10290;10245:59;;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;9777:534::o;:::-;;;;:::i;:::-;:::o;707:13346::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;12663:266::-;12881:41;;12663:266;12838:26;12881:41;12663:266;12785:7;;:::i;:::-;12853:10;12838:26;:::i;:::-;12804:60;;;;;12917:1;12881:41;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;12874:48;:::o;12881:41::-;;:::i;707:13346::-;;;:::o;:::-;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;13210:344;13287:9;;:::i;:::-;13298;;;:::i;:::-;13309:7;;;:::i;:::-;13336:3;13328:69;13336:10;:3;:10;:::i;:::-;:16;;13350:2;13336:16;:::i;:::-;;;:::i;:::-;;13328:69;:::i;:::-;13408:140;;;;;;;;;;;;;;;13210:344;:::o;3241:119::-;3352:1;3241:119;3273:69;3281:10;:20;;3295:6;;;:::i;:::-;3281:20;:::i;:::-;;;:::i;:::-;;3273:69;:::i;:::-;3352:1;:::i;:::-;3241:119::o;3667:190::-;3849:1;3667:190;3726:113;6844:17;3747:29;;:12;;;:::i;:::-;3763:13;3747:29;:::i;:::-;;;:::i;:::-;;3726:113;:::i;:::-;3849:1;:::i;:::-;3667:190::o;707:13346::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;3915:160;4067:1;3915:160;3947:110;3968:15;:28;;3986:10;;;:::i;:::-;3968:28;:::i;:::-;;;:::i;:::-;;3947:110;:::i;:::-;4067:1;:::i;:::-;3915:160::o;707:13346::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;6764:454;6884:111;6905:7;:11;;6915:1;6905:11;:::i;:::-;;;:::i;:::-;;6884:111;:::i;:::-;7027:18;:5;;;:::i;:::-;:18;:::i;:::-;:50;:18;7046:6;;;;:::i;:::-;7062:4;7027:50;;7054:13;7062:4;7054:13;:::i;:::-;7069:7;7027:50;7069:7;7027:50;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;7006:136;7027:50;;;;;6764:454;7006:136;;:::i;:::-;7170:9;;;:::i;:::-;7181:6;;;;:::i;:::-;7189:7;7198:12;;;:::i;:::-;7158:53;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;6764:454::o;7027:50::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;6764:454::-;;;;:::i;:::-;:::o;707:13346::-;;;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;13751:300::-;13906:124;;13751:300;13841:7;;:::i;:::-;14000:12;13906:124;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;13879:165;;;;:::i;:::-;;;:::i;:::-;;13860:184;:::o",
    "linkReferences": {}
  },
  "methodIdentifiers": {
    "channelId()": "e2cee544",
    "channelState()": "55b55094",
    "claimTimeout()": "0e1da6c3",
    "close(uint256,uint256,bytes,bytes)": "4e1b16ce",
    "deposit(uint256)": "b6b55f25",
    "expiration()": "4665096d",
    "extend(uint256)": "9714378c",
    "factory()": "c45a0155",
    "getBalance()": "12065fe0",
    "getChannelInfo()": "30d281e0",
    "getEthSignedMessageHash(bytes32)": "fa540801",
    "init(address,address,uint256,address,uint256,uint256,uint256)": "92aa5bcb",
    "lastProcessedNonce()": "08e8553e",
    "price()": "a035b1fe",
    "recipient()": "66d003ac",
    "recoverSigner(bytes32,bytes)": "97aba7f9",
    "sender()": "67e404ce",
    "splitSignature(bytes)": "a7bb5803",
    "token()": "fc0c546a"
  },
  "rawMetadata": "{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"channelId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountPaid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountRefunded\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"finalNonce\",\"type\":\"uint256\"}],\"name\":\"ChannelClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"channelId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"ChannelCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"channelId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DepositMade\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"channelId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldExpiration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newExpiration\",\"type\":\"uint256\"}],\"name\":\"ExpirationExtended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"channelId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"TimeoutClaimed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"channelId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"channelState\",\"outputs\":[{\"internalType\":\"enum PaymentChannel.ChannelState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"channelBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"rawBody\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"close\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expiration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newExpiration\",\"type\":\"uint256\"}],\"name\":\"extend\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChannelInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"senderAddr\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientAddr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"exp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pricePerRequest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastNonce\",\"type\":\"uint256\"},{\"internalType\":\"enum PaymentChannel.ChannelState\",\"name\":\"state\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_messageHash\",\"type\":\"bytes32\"}],\"name\":\"getEthSignedMessageHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_channelId\",\"type\":\"uint256\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastProcessedNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"price\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"recipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_ethSignedMessageHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"recoverSigner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sig\",\"type\":\"bytes\"}],\"name\":\"splitSignature\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract allows for off-chain signed transactions that can be settled on-chain The channel supports deposits, signature-based closures, and timeout mechanisms\",\"kind\":\"dev\",\"methods\":{\"claimTimeout()\":{\"details\":\"Can only be called after expiration timestamp has passed\"},\"close(uint256,uint256,bytes,bytes)\":{\"details\":\"Can only be called by the recipient. Validates signature and prevents replay attacks\",\"params\":{\"channelBalance\":\"The remaining balance that should stay in the channel\",\"nonce\":\"Nonce for replay protection (must be greater than lastProcessedNonce)\",\"rawBody\":\"Additional data that was signed (for extensibility)\",\"signature\":\"Sender's signature authorizing the payment\"}},\"deposit(uint256)\":{\"details\":\"Can only be called by the channel sender while channel is open\",\"params\":{\"_amount\":\"Amount of tokens to deposit\"}},\"extend(uint256)\":{\"details\":\"Can only be called by the sender while channel is open\",\"params\":{\"newExpiration\":\"New expiration timestamp (must be later than current expiration)\"}},\"getBalance()\":{\"returns\":{\"_0\":\"The balance of tokens held by this contract\"}},\"getChannelInfo()\":{\"returns\":{\"balance\":\"Current token balance\",\"exp\":\"Expiration timestamp\",\"id\":\"Channel ID\",\"lastNonce\":\"Last processed nonce\",\"pricePerRequest\":\"Price per API request\",\"recipientAddr\":\"Recipient address\",\"senderAddr\":\"Sender address\",\"state\":\"Current channel state\"}},\"getEthSignedMessageHash(bytes32)\":{\"params\":{\"_messageHash\":\"The original message hash\"},\"returns\":{\"_0\":\"The Ethereum signed message hash\"}},\"init(address,address,uint256,address,uint256,uint256,uint256)\":{\"details\":\"Can only be called once by the factory contract\",\"params\":{\"_amount\":\"Initial deposit amount from the sender\",\"_channelId\":\"Unique identifier for this channel\",\"_duration\":\"Duration in seconds before the channel can be force-closed\",\"_price\":\"Price per API request in token units\",\"_recipient\":\"The API provider who will receive payments\",\"_sender\":\"The API consumer who will make payments\",\"_tokenAddress\":\"Address of the ERC20 token to be used for payments\"}},\"recoverSigner(bytes32,bytes)\":{\"params\":{\"_ethSignedMessageHash\":\"The hash of the signed message\",\"_signature\":\"The signature bytes\"},\"returns\":{\"_0\":\"The address of the signer\"}},\"splitSignature(bytes)\":{\"params\":{\"sig\":\"The signature bytes to split\"},\"returns\":{\"r\":\"The r component of the signature\",\"s\":\"The s component of the signature\",\"v\":\"The v component of the signature\"}}},\"title\":\"PaymentChannel\",\"version\":1},\"userdoc\":{\"events\":{\"ChannelClosed(uint256,address,address,uint256,uint256,uint256,uint256)\":{\"notice\":\"Emitted when a payment channel is closed via signature\"},\"ChannelCreated(uint256,address,address,uint256,uint256,uint256)\":{\"notice\":\"Emitted when a new payment channel is created\"},\"DepositMade(uint256,address,uint256,uint256)\":{\"notice\":\"Emitted when additional funds are deposited to the channel\"},\"ExpirationExtended(uint256,uint256,uint256)\":{\"notice\":\"Emitted when channel expiration is extended\"},\"TimeoutClaimed(uint256,address,uint256,uint256)\":{\"notice\":\"Emitted when sender claims funds after timeout\"}},\"kind\":\"user\",\"methods\":{\"channelId()\":{\"notice\":\"Unique identifier for this payment channel\"},\"channelState()\":{\"notice\":\"Current state of the payment channel\"},\"claimTimeout()\":{\"notice\":\"Allows sender to claim all remaining funds after the channel expires\"},\"close(uint256,uint256,bytes,bytes)\":{\"notice\":\"Closes the channel using a signature from the sender\"},\"constructor\":{\"notice\":\"Sets the factory address during contract creation\"},\"deposit(uint256)\":{\"notice\":\"Allows the sender to deposit additional funds to the channel\"},\"expiration()\":{\"notice\":\"Timestamp when the channel expires and can be force-closed by sender\"},\"extend(uint256)\":{\"notice\":\"Extends the expiration time of the channel\"},\"factory()\":{\"notice\":\"Address authorized to initialize this channel (factory contract)\"},\"getBalance()\":{\"notice\":\"Returns the current token balance of the channel\"},\"getChannelInfo()\":{\"notice\":\"Returns comprehensive channel information\"},\"getEthSignedMessageHash(bytes32)\":{\"notice\":\"Converts a message hash to an Ethereum signed message hash\"},\"init(address,address,uint256,address,uint256,uint256,uint256)\":{\"notice\":\"Initializes a new payment channel\"},\"lastProcessedNonce()\":{\"notice\":\"Last processed nonce to prevent replay attacks\"},\"price()\":{\"notice\":\"Price per API request in token units (set by recipient)\"},\"recipient()\":{\"notice\":\"Address of the API provider (payee)\"},\"recoverSigner(bytes32,bytes)\":{\"notice\":\"Recovers the signer address from an Ethereum signed message hash and signature\"},\"sender()\":{\"notice\":\"Address of the API consumer (payer)\"},\"splitSignature(bytes)\":{\"notice\":\"Splits a signature into its r, s, v components\"},\"token()\":{\"notice\":\"ERC20 token used for payments in this channel\"}},\"notice\":\"A payment channel contract that enables micropayments between API consumers and providers\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/PaymentChannel.sol\":\"PaymentChannel\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/PaymentChannel.sol\":{\"keccak256\":\"0x9bb9c77698edd5007e20f0068dd5356600b658c65087d6164b4c649b0a285ca9\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://6a08428f0dd09bdd827da4e4f8ba985a77f95edc3fb229a106355bd69ec7ab8a\",\"dweb:/ipfs/QmbLzFo1iUPRTDkBeJhQVQn6pSqwexs5e4YfEuuLQpr6V2\"]}},\"version\":1}",
  "metadata": {
    "compiler": { "version": "0.8.28+commit.7893614a" },
    "language": "Solidity",
    "output": {
      "abi": [
        {
          "inputs": [],
          "stateMutability": "nonpayable",
          "type": "constructor"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "channelId",
              "type": "uint256",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "sender",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "uint256",
              "name": "timestamp",
              "type": "uint256",
              "indexed": false
            },
            {
              "internalType": "uint256",
              "name": "amountPaid",
              "type": "uint256",
              "indexed": false
            },
            {
              "internalType": "uint256",
              "name": "amountRefunded",
              "type": "uint256",
              "indexed": false
            },
            {
              "internalType": "uint256",
              "name": "finalNonce",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "ChannelClosed",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "channelId",
              "type": "uint256",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "sender",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "uint256",
              "name": "expiration",
              "type": "uint256",
              "indexed": false
            },
            {
              "internalType": "uint256",
              "name": "initialBalance",
              "type": "uint256",
              "indexed": false
            },
            {
              "internalType": "uint256",
              "name": "price",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "ChannelCreated",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "channelId",
              "type": "uint256",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "sender",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256",
              "indexed": false
            },
            {
              "internalType": "uint256",
              "name": "newBalance",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "DepositMade",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "channelId",
              "type": "uint256",
              "indexed": true
            },
            {
              "internalType": "uint256",
              "name": "oldExpiration",
              "type": "uint256",
              "indexed": false
            },
            {
              "internalType": "uint256",
              "name": "newExpiration",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "ExpirationExtended",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "channelId",
              "type": "uint256",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "sender",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256",
              "indexed": false
            },
            {
              "internalType": "uint256",
              "name": "timestamp",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "TimeoutClaimed",
          "anonymous": false
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "channelId",
          "outputs": [
            { "internalType": "uint256", "name": "", "type": "uint256" }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "channelState",
          "outputs": [
            {
              "internalType": "enum PaymentChannel.ChannelState",
              "name": "",
              "type": "uint8"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "claimTimeout"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "channelBalance",
              "type": "uint256"
            },
            { "internalType": "uint256", "name": "nonce", "type": "uint256" },
            { "internalType": "bytes", "name": "rawBody", "type": "bytes" },
            { "internalType": "bytes", "name": "signature", "type": "bytes" }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "close"
        },
        {
          "inputs": [
            { "internalType": "uint256", "name": "_amount", "type": "uint256" }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "deposit"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "expiration",
          "outputs": [
            { "internalType": "uint256", "name": "", "type": "uint256" }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "newExpiration",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "extend"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "factory",
          "outputs": [
            { "internalType": "address", "name": "", "type": "address" }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "getBalance",
          "outputs": [
            { "internalType": "uint256", "name": "", "type": "uint256" }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "getChannelInfo",
          "outputs": [
            { "internalType": "uint256", "name": "id", "type": "uint256" },
            {
              "internalType": "address",
              "name": "senderAddr",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "recipientAddr",
              "type": "address"
            },
            { "internalType": "uint256", "name": "exp", "type": "uint256" },
            { "internalType": "uint256", "name": "balance", "type": "uint256" },
            {
              "internalType": "uint256",
              "name": "pricePerRequest",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lastNonce",
              "type": "uint256"
            },
            {
              "internalType": "enum PaymentChannel.ChannelState",
              "name": "state",
              "type": "uint8"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "bytes32",
              "name": "_messageHash",
              "type": "bytes32"
            }
          ],
          "stateMutability": "pure",
          "type": "function",
          "name": "getEthSignedMessageHash",
          "outputs": [
            { "internalType": "bytes32", "name": "", "type": "bytes32" }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_recipient",
              "type": "address"
            },
            { "internalType": "address", "name": "_sender", "type": "address" },
            {
              "internalType": "uint256",
              "name": "_duration",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "_tokenAddress",
              "type": "address"
            },
            { "internalType": "uint256", "name": "_amount", "type": "uint256" },
            { "internalType": "uint256", "name": "_price", "type": "uint256" },
            {
              "internalType": "uint256",
              "name": "_channelId",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "init"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "lastProcessedNonce",
          "outputs": [
            { "internalType": "uint256", "name": "", "type": "uint256" }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "price",
          "outputs": [
            { "internalType": "uint256", "name": "", "type": "uint256" }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "recipient",
          "outputs": [
            { "internalType": "address", "name": "", "type": "address" }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "bytes32",
              "name": "_ethSignedMessageHash",
              "type": "bytes32"
            },
            { "internalType": "bytes", "name": "_signature", "type": "bytes" }
          ],
          "stateMutability": "pure",
          "type": "function",
          "name": "recoverSigner",
          "outputs": [
            { "internalType": "address", "name": "", "type": "address" }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "sender",
          "outputs": [
            { "internalType": "address", "name": "", "type": "address" }
          ]
        },
        {
          "inputs": [
            { "internalType": "bytes", "name": "sig", "type": "bytes" }
          ],
          "stateMutability": "pure",
          "type": "function",
          "name": "splitSignature",
          "outputs": [
            { "internalType": "bytes32", "name": "r", "type": "bytes32" },
            { "internalType": "bytes32", "name": "s", "type": "bytes32" },
            { "internalType": "uint8", "name": "v", "type": "uint8" }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "token",
          "outputs": [
            { "internalType": "contract IERC20", "name": "", "type": "address" }
          ]
        }
      ],
      "devdoc": {
        "kind": "dev",
        "methods": {
          "claimTimeout()": {
            "details": "Can only be called after expiration timestamp has passed"
          },
          "close(uint256,uint256,bytes,bytes)": {
            "details": "Can only be called by the recipient. Validates signature and prevents replay attacks",
            "params": {
              "channelBalance": "The remaining balance that should stay in the channel",
              "nonce": "Nonce for replay protection (must be greater than lastProcessedNonce)",
              "rawBody": "Additional data that was signed (for extensibility)",
              "signature": "Sender's signature authorizing the payment"
            }
          },
          "deposit(uint256)": {
            "details": "Can only be called by the channel sender while channel is open",
            "params": { "_amount": "Amount of tokens to deposit" }
          },
          "extend(uint256)": {
            "details": "Can only be called by the sender while channel is open",
            "params": {
              "newExpiration": "New expiration timestamp (must be later than current expiration)"
            }
          },
          "getBalance()": {
            "returns": { "_0": "The balance of tokens held by this contract" }
          },
          "getChannelInfo()": {
            "returns": {
              "balance": "Current token balance",
              "exp": "Expiration timestamp",
              "id": "Channel ID",
              "lastNonce": "Last processed nonce",
              "pricePerRequest": "Price per API request",
              "recipientAddr": "Recipient address",
              "senderAddr": "Sender address",
              "state": "Current channel state"
            }
          },
          "getEthSignedMessageHash(bytes32)": {
            "params": { "_messageHash": "The original message hash" },
            "returns": { "_0": "The Ethereum signed message hash" }
          },
          "init(address,address,uint256,address,uint256,uint256,uint256)": {
            "details": "Can only be called once by the factory contract",
            "params": {
              "_amount": "Initial deposit amount from the sender",
              "_channelId": "Unique identifier for this channel",
              "_duration": "Duration in seconds before the channel can be force-closed",
              "_price": "Price per API request in token units",
              "_recipient": "The API provider who will receive payments",
              "_sender": "The API consumer who will make payments",
              "_tokenAddress": "Address of the ERC20 token to be used for payments"
            }
          },
          "recoverSigner(bytes32,bytes)": {
            "params": {
              "_ethSignedMessageHash": "The hash of the signed message",
              "_signature": "The signature bytes"
            },
            "returns": { "_0": "The address of the signer" }
          },
          "splitSignature(bytes)": {
            "params": { "sig": "The signature bytes to split" },
            "returns": {
              "r": "The r component of the signature",
              "s": "The s component of the signature",
              "v": "The v component of the signature"
            }
          }
        },
        "version": 1
      },
      "userdoc": {
        "kind": "user",
        "methods": {
          "channelId()": {
            "notice": "Unique identifier for this payment channel"
          },
          "channelState()": {
            "notice": "Current state of the payment channel"
          },
          "claimTimeout()": {
            "notice": "Allows sender to claim all remaining funds after the channel expires"
          },
          "close(uint256,uint256,bytes,bytes)": {
            "notice": "Closes the channel using a signature from the sender"
          },
          "constructor": {
            "notice": "Sets the factory address during contract creation"
          },
          "deposit(uint256)": {
            "notice": "Allows the sender to deposit additional funds to the channel"
          },
          "expiration()": {
            "notice": "Timestamp when the channel expires and can be force-closed by sender"
          },
          "extend(uint256)": {
            "notice": "Extends the expiration time of the channel"
          },
          "factory()": {
            "notice": "Address authorized to initialize this channel (factory contract)"
          },
          "getBalance()": {
            "notice": "Returns the current token balance of the channel"
          },
          "getChannelInfo()": {
            "notice": "Returns comprehensive channel information"
          },
          "getEthSignedMessageHash(bytes32)": {
            "notice": "Converts a message hash to an Ethereum signed message hash"
          },
          "init(address,address,uint256,address,uint256,uint256,uint256)": {
            "notice": "Initializes a new payment channel"
          },
          "lastProcessedNonce()": {
            "notice": "Last processed nonce to prevent replay attacks"
          },
          "price()": {
            "notice": "Price per API request in token units (set by recipient)"
          },
          "recipient()": { "notice": "Address of the API provider (payee)" },
          "recoverSigner(bytes32,bytes)": {
            "notice": "Recovers the signer address from an Ethereum signed message hash and signature"
          },
          "sender()": { "notice": "Address of the API consumer (payer)" },
          "splitSignature(bytes)": {
            "notice": "Splits a signature into its r, s, v components"
          },
          "token()": {
            "notice": "ERC20 token used for payments in this channel"
          }
        },
        "version": 1
      }
    },
    "settings": {
      "remappings": ["forge-std/=lib/forge-std/src/"],
      "optimizer": { "enabled": false, "runs": 200 },
      "metadata": { "bytecodeHash": "ipfs" },
      "compilationTarget": { "src/PaymentChannel.sol": "PaymentChannel" },
      "evmVersion": "prague",
      "libraries": {},
      "viaIR": true
    },
    "sources": {
      "src/PaymentChannel.sol": {
        "keccak256": "0x9bb9c77698edd5007e20f0068dd5356600b658c65087d6164b4c649b0a285ca9",
        "urls": [
          "bzz-raw://6a08428f0dd09bdd827da4e4f8ba985a77f95edc3fb229a106355bd69ec7ab8a",
          "dweb:/ipfs/QmbLzFo1iUPRTDkBeJhQVQn6pSqwexs5e4YfEuuLQpr6V2"
        ],
        "license": "UNLICENSED"
      }
    },
    "version": 1
  },
  "id": 2
}