provenance_mark/
lib.rs

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
1015
1016
1017
1018
1019
1020
1021
1022
1023
#![doc(html_root_url = "https://docs.rs/provenance-mark/0.3.2")]
#![warn(rust_2018_idioms)]

//! # Introduction
//!
//! [Provenance Marks](https://provemark.com) provide a
//! cryptographically-secured system for establishing and verifying the
//! authenticity of works in an age of rampant AI-powered manipulation and
//! plagiarism. By combining cryptography, pseudorandom number generation, and
//! linguistic representation, this system generates unique, sequential marks
//! that commit to the content of preceding and subsequent works. These marks
//! ensure public and easy verification of provenance, offering robust security
//! and intuitive usability. Provenance Marks are particularly valuable for
//! securing artistic, intellectual, and commercial works against fraud and deep
//! fakes, protecting creatorsโ€™ reputations and the integrity of their
//! creations.
//!
//! # Getting Started
//!
//! ```toml
//! [dependencies]
//! provenance-mark = "0.3.2"
//! ```
//!
//! # Examples
//!
//! See the unit tests in the source code for examples of how to use this library.

mod resolution;
pub use resolution::*;
mod mark;
pub use mark::*;
mod mark_info;
pub use mark_info::*;
mod generator;
pub use generator::*;
mod seed;
pub use seed::*;
mod rng_state;
pub use rng_state::*;
mod date;
mod crypto_utils;
mod xoshiro256starstar;
pub mod util;

#[cfg(feature = "envelope")]
mod envelope;

#[cfg(test)]
mod tests {
    use bc_ur::prelude::*;
    use chrono::TimeZone;
    use dcbor::Date;

    use super::*;

    #[allow(clippy::too_many_arguments)]
    fn run_test(
        resolution: ProvenanceMarkResolution,
        include_info: bool,
        expected_display: &[&str],
        expected_debug: &[&str],
        expected_bytewords: &[&str],
        expected_id_words: &[&str],
        expected_bytemoji_ids: &[&str],
        expected_urs: &[&str],
        expected_urls: &[&str],
    ) {
        #[cfg(feature = "envelope")]
        crate::register_tags();

        let provenance_gen = ProvenanceMarkGenerator::new_with_passphrase(resolution, "Wolf");
        let count = 10;
        // let base_date = Date::from_string("2023-06-20T12:00:00Z").unwrap();
        let calendar = chrono::Utc;
        let dates: Vec<Date> = (0..count)
            .map(|i| {
                Date::from_datetime(
                    calendar
                        .with_ymd_and_hms(2023, 6, 20, 12, 0, 0)
                        .single()
                        .unwrap()
                        .checked_add_signed(chrono::Duration::days(i))
                        .unwrap()
                )
            })
            .collect();

        let mut encoded_generator = serde_json::to_string(&provenance_gen).unwrap();

        let marks = dates
            .iter()
            .map(|date| {
                let mut gen: ProvenanceMarkGenerator = serde_json
                    ::from_str(&encoded_generator)
                    .unwrap();

                let title = if include_info { Some("Lorem ipsum sit dolor amet.") } else { None };
                let result = gen.next(date.clone(), title);

                encoded_generator = serde_json::to_string(&gen).unwrap();

                result
            })
            .collect::<Vec<_>>();

        assert!(ProvenanceMark::is_sequence_valid(&marks));

        assert!(!marks[1].precedes(&marks[0]));

        if expected_display.is_empty() {
            marks.iter().for_each(|mark| println!(r#""{}","#, mark));
        } else {
            assert_eq!(
                marks
                    .iter()
                    .map(|mark| format!("{}", mark))
                    .collect::<Vec<_>>(),
                    expected_display
            );
        }

        if expected_debug.is_empty() {
            marks.iter().for_each(|mark| println!("{:?}", mark));
        } else {
            assert_eq!(
                marks
                    .iter()
                    .map(|mark| format!("{:?}", mark))
                    .collect::<Vec<_>>(),
                    expected_debug
            );
        }

        let bytewords = marks
            .iter()
            .map(|mark| mark.to_bytewords())
            .collect::<Vec<_>>();
        if expected_bytewords.is_empty() {
            bytewords.iter().for_each(|byteword| println!("{:?}", byteword));
        } else {
            assert_eq!(bytewords, expected_bytewords);
        }
        let bytewords_marks = bytewords
            .iter()
            .map(|byteword| ProvenanceMark::from_bytewords(resolution, byteword).unwrap())
            .collect::<Vec<_>>();
        assert_eq!(marks, bytewords_marks);

        let id_words = marks
            .iter()
            .map(|mark| mark.bytewords_identifier(false))
            .collect::<Vec<_>>();
        if expected_id_words.is_empty() {
            id_words.iter().for_each(|id_word| println!("{:?}", id_word));
        } else {
            assert_eq!(id_words, expected_id_words);
        }

        let bytemoji_ids = marks
            .iter()
            .map(|mark| mark.bytemoji_identifier(false))
            .collect::<Vec<_>>();
        if expected_bytemoji_ids.is_empty() {
            bytemoji_ids.iter().for_each(|bytemoji_id| println!("{:?}", bytemoji_id));
        } else {
            assert_eq!(bytemoji_ids, expected_bytemoji_ids);
        }

        let urs = marks
            .iter()
            .map(|mark| mark.ur_string())
            .collect::<Vec<_>>();
        if expected_urs.is_empty() {
            urs.iter().for_each(|ur| println!("{:?}", ur));
        } else {
            assert_eq!(urs, expected_urs);
        }
        let ur_marks = urs
            .iter()
            .map(|ur| ProvenanceMark::from_ur_string(ur).unwrap())
            .collect::<Vec<_>>();
        assert_eq!(marks, ur_marks);

        let base_url = "https://example.com/validate";
        let urls = marks
            .iter()
            .map(|mark| mark.to_url(base_url))
            .collect::<Vec<_>>();
        if expected_urls.is_empty() {
            urls.iter().for_each(|url| println!("{:?}", url));
        } else {
            assert_eq!(
                urls
                    .iter()
                    .map(|url| url.to_string())
                    .collect::<Vec<_>>(),
                expected_urls
            );
        }
        let url_marks = urls
            .iter()
            .map(|url| ProvenanceMark::from_url(url).unwrap())
            .collect::<Vec<_>>();
        assert_eq!(marks, url_marks);

        for mark in marks.clone() {
            let data = serde_json::to_string(&mark).unwrap();
            let mark2: ProvenanceMark = serde_json::from_str(&data).unwrap();
            assert_eq!(mark, mark2);
        }
    }

    #[test]
    fn test_low() {
        let expected_display = [
            "ProvenanceMark(5bdcec81)",
            "ProvenanceMark(477e3ce6)",
            "ProvenanceMark(3e5da986)",
            "ProvenanceMark(41c525a1)",
            "ProvenanceMark(8095afb4)",
            "ProvenanceMark(3bcacc8d)",
            "ProvenanceMark(41486af2)",
            "ProvenanceMark(5fa35da9)",
            "ProvenanceMark(e369288f)",
            "ProvenanceMark(7ce8f8bc)",
        ];
        let expected_debug = [
            r#"ProvenanceMark(key: 090bf2f8, hash: 5bdcec81, chainID: 090bf2f8, seq: 0, date: 2023-06-20)"#,
            r#"ProvenanceMark(key: 558dbfc6, hash: 477e3ce6, chainID: 090bf2f8, seq: 1, date: 2023-06-21)"#,
            r#"ProvenanceMark(key: 536b2968, hash: 3e5da986, chainID: 090bf2f8, seq: 2, date: 2023-06-22)"#,
            r#"ProvenanceMark(key: 75bb47d0, hash: 41c525a1, chainID: 090bf2f8, seq: 3, date: 2023-06-23)"#,
            r#"ProvenanceMark(key: 85cf746e, hash: 8095afb4, chainID: 090bf2f8, seq: 4, date: 2023-06-24)"#,
            r#"ProvenanceMark(key: ca274110, hash: 3bcacc8d, chainID: 090bf2f8, seq: 5, date: 2023-06-25)"#,
            r#"ProvenanceMark(key: de5cbde4, hash: 41486af2, chainID: 090bf2f8, seq: 6, date: 2023-06-26)"#,
            r#"ProvenanceMark(key: 0f34e1b6, hash: 5fa35da9, chainID: 090bf2f8, seq: 7, date: 2023-06-27)"#,
            r#"ProvenanceMark(key: 51372ca2, hash: e369288f, chainID: 090bf2f8, seq: 8, date: 2023-06-28)"#,
            r#"ProvenanceMark(key: abc6aa64, hash: 7ce8f8bc, chainID: 090bf2f8, seq: 9, date: 2023-06-29)"#,
        ];
        let expected_bytewords = [
            "axis bald whiz yoga rich join body jazz yurt wall monk fact urge cola exam arch kick fuel omit echo",
            "gyro lung runs skew flew yank yawn lung king sets luau idle draw aunt knob high jazz veto cola road",
            "guru jade diet iris gift zoom slot list omit ruby visa noon dark vibe road stub tied waxy race huts",
            "keep rock fuel taxi jugs fish fair fish help dull hope rust claw next urge zoom monk fern maze diet",
            "limp task jury jolt vows surf cost silk yoga king huts claw vibe mint yell quiz zinc wall join cost",
            "song deli flap blue work zone jump item heat stub mint kick gems vows love rock iris undo legs yell",
            "urge high ruby vibe fish jolt iced diet safe lion webs stub exam user work part wave fish back logo",
            "bias edge very ramp free surf wasp void hawk door also zoom gray down wall tent holy waxy leaf mint",
            "gray exam draw oboe unit yawn surf junk curl eyes keno belt crux navy need cats ruby noon yell noon",
            "play skew peck idle tent many song vibe open urge slot plus bulb free dice able keno buzz girl gear",
        ];
        let expected_id_words = [
            "HELP UNDO WASP LAZY",
            "FUEL KNOB FERN VISA",
            "FILM HILL PART LION",
            "FLAP SILK DATA OBEY",
            "LAVA MILD POSE QUIZ",
            "FAIR SONG SURF LUNG",
            "FLAP FUND ITEM WHIZ",
            "HOPE OMIT HILL PART",
            "VIAL IRON DICE MANY",
            "KITE VOWS YOGA ROOF",
        ];
        let expected_bytemoji_ids = [
            "๐ŸŒฎ ๐Ÿฐ ๐Ÿฆ„ ๐Ÿ’”",
            "๐Ÿ ๐Ÿช ๐Ÿฆถ ๐Ÿต",
            "๐ŸŠ ๐Ÿฑ ๐Ÿงฎ ๐Ÿšฉ",
            "๐Ÿ‰ ๐Ÿ”ฅ ๐Ÿ‘ฝ ๐Ÿช‘",
            "๐Ÿ’› ๐Ÿš€ ๐Ÿ“ก ๐ŸŽ",
            "๐Ÿคš ๐Ÿฉณ ๐Ÿ‘” ๐Ÿ›‘",
            "๐Ÿ‰ ๐Ÿฅ ๐Ÿ„ ๐Ÿข",
            "๐Ÿค ๐Ÿ’Œ ๐Ÿฑ ๐Ÿงฎ",
            "๐Ÿฎ ๐Ÿ ๐Ÿ˜ป ๐Ÿš—",
            "๐Ÿ’ซ ๐Ÿฅ ๐Ÿชผ ๐Ÿ†",
        ];
        let expected_urs = [
            "ur:provenance/lfaegdasbdwzyarhjnbyjzytwlmkftuecaemahwmfgaxcl",
            "ur:provenance/lfaegdgolgrsswfwykynlgkgssluiedwatkbhhzevlrypd",
            "ur:provenance/lfaegdgujedtisgtzmstltotryvanndkverdsbfzwsbzjk",
            "ur:provenance/lfaegdkprkfltijsfhfrfhhpdlhertcwntuezmbkfsehfr",
            "ur:provenance/lfaegdlptkjyjtvssfctskyakghscwvemtylqzjlvssnbt",
            "ur:provenance/lfaegdsgdifpbewkzejpimhtsbmtkkgsvslerkzsutcnvw",
            "ur:provenance/lfaegduehhryvefhjtiddtselnwssbemurwkptlbfmpkny",
            "ur:provenance/lfaegdbseevyrpfesfwpvdhkdraozmgydnwlttsfwscplr",
            "ur:provenance/lfaegdgyemdwoeutynsfjkcleskobtcxnyndcsdlnehglk",
            "ur:provenance/lfaegdpyswpkiettmysgveonuestpsbbfedeaevebbwyhk",
        ];
        let expected_urls = [
            "https://example.com/validate?provenance=tngdgmgwhflfaegdasbdwzyarhjnbyjzytwlmkftuecaemahdpbswmkb",
            "https://example.com/validate?provenance=tngdgmgwhflfaegdgolgrsswfwykynlgkgssluiedwatkbhhetpkgoyl",
            "https://example.com/validate?provenance=tngdgmgwhflfaegdgujedtisgtzmstltotryvanndkverdsblnolzcdw",
            "https://example.com/validate?provenance=tngdgmgwhflfaegdkprkfltijsfhfrfhhpdlhertcwntuezmsfjytaie",
            "https://example.com/validate?provenance=tngdgmgwhflfaegdlptkjyjtvssfctskyakghscwvemtylqzptoydagm",
            "https://example.com/validate?provenance=tngdgmgwhflfaegdsgdifpbewkzejpimhtsbmtkkgsvslerkfnmwsbrd",
            "https://example.com/validate?provenance=tngdgmgwhflfaegduehhryvefhjtiddtselnwssbemurwkptrhktfwsk",
            "https://example.com/validate?provenance=tngdgmgwhflfaegdbseevyrpfesfwpvdhkdraozmgydnwlttbkolsguy",
            "https://example.com/validate?provenance=tngdgmgwhflfaegdgyemdwoeutynsfjkcleskobtcxnyndcswltbrste",
            "https://example.com/validate?provenance=tngdgmgwhflfaegdpyswpkiettmysgveonuestpsbbfedeaecphlamam",
        ];

        run_test(
            ProvenanceMarkResolution::Low,
            false,
            &expected_display,
            &expected_debug,
            &expected_bytewords,
            &expected_id_words,
            &expected_bytemoji_ids,
            &expected_urs,
            &expected_urls,
        );
    }

    #[test]
    fn test_low_with_info() {
        let expected_display = [
            "ProvenanceMark(baee34c2)",
            "ProvenanceMark(7b80837c)",
            "ProvenanceMark(548fecfb)",
            "ProvenanceMark(f3365320)",
            "ProvenanceMark(bd61dc41)",
            "ProvenanceMark(e7d3f969)",
            "ProvenanceMark(4921b6e9)",
            "ProvenanceMark(f3d069fd)",
            "ProvenanceMark(bc4ca470)",
            "ProvenanceMark(5e798c9a)",
        ];
        let expected_debug = [
            r#"ProvenanceMark(key: 090bf2f8, hash: baee34c2, chainID: 090bf2f8, seq: 0, date: 2023-06-20, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 558dbfc6, hash: 7b80837c, chainID: 090bf2f8, seq: 1, date: 2023-06-21, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 536b2968, hash: 548fecfb, chainID: 090bf2f8, seq: 2, date: 2023-06-22, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 75bb47d0, hash: f3365320, chainID: 090bf2f8, seq: 3, date: 2023-06-23, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 85cf746e, hash: bd61dc41, chainID: 090bf2f8, seq: 4, date: 2023-06-24, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: ca274110, hash: e7d3f969, chainID: 090bf2f8, seq: 5, date: 2023-06-25, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: de5cbde4, hash: 4921b6e9, chainID: 090bf2f8, seq: 6, date: 2023-06-26, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 0f34e1b6, hash: f3d069fd, chainID: 090bf2f8, seq: 7, date: 2023-06-27, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 51372ca2, hash: bc4ca470, chainID: 090bf2f8, seq: 8, date: 2023-06-28, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: abc6aa64, hash: 5e798c9a, chainID: 090bf2f8, seq: 9, date: 2023-06-29, info: "Lorem ipsum sit dolor amet.")"#,
        ];
        let expected_bytewords = [
            "axis bald whiz yoga rich join body jazz cats ugly fizz kick urge cola exam arch girl navy jugs flew unit keys flap very cyan cola flew rock zero jazz yoga owls fair glow film quad runs scar barn glow belt onyx foxy cost apex purr data wave poem",
            "gyro lung runs skew flew yank yawn lung fuel fact edge zone draw aunt knob high king wave axis game chef need mint roof stub jugs dull dull exam iron claw runs dice skew many unit vibe free taco silk code horn yurt door game rich purr wasp brag",
            "guru jade diet iris gift zoom slot list solo jowl omit vial dark vibe road stub real curl hawk lamb gyro kiln peck love lamb peck omit ramp aunt blue inky omit runs gyro fair crux lava safe real foxy zero ruby heat keep visa duty saga exit user",
            "keep rock fuel taxi jugs fish fair fish wall undo diet flap claw next urge zoom acid many kite beta time hope brag nail loud mild zero gray bias jury keep iced zoom bias real cook beta jowl very paid stub puma grim numb iced cost tied purr race",
            "limp task jury jolt vows surf cost silk silk many brag waxy vibe mint yell quiz visa curl race curl hawk visa silk axis dull skew gush jury days game data curl flap undo flux fact deli wave film swan jade lion fuel cyan menu waxy game twin even",
            "song deli flap blue work zone jump item lion tied omit next gems vows love rock fair maze ruby half need days high hope barn buzz cash keep numb city fuel cost part cats jowl webs zinc meow tuna hard view lion noon yawn yoga maze exam dice king",
            "urge high ruby vibe fish jolt iced diet solo webs echo taxi exam user work part swan user monk soap keys gush yank lazy edge yell mild half code zinc wave tiny monk gift lazy gear help saga draw down frog easy inch omit wolf memo leaf owls love",
            "bias edge very ramp free surf wasp void yank hawk even play gray down wall tent foxy puma swan jump miss gems quad lamb axis what blue mint film epic open cola visa mild zero noon hang surf purr miss also meow nail iron undo film zone arch miss",
            "gray exam draw oboe unit yawn surf junk knob code zaps whiz crux navy need cats numb cost zest buzz jump stub keno fair body need fish gush aqua bias gray urge fair curl dice bald jury days join cusp fizz fair code game miss flew oval gyro foxy",
            "play skew peck idle tent many song vibe list glow quad love bulb free dice able quad brew gray news jury flew into data oval scar veto also runs love gear legs unit runs epic task jump bias also owls luau skew trip buzz help chef note tied film",
        ];
        let expected_id_words = [
            "ROAD WAXY EDGE SAGA",
            "KING LAVA LEGS KITE",
            "GUSH MANY WASP ZERO",
            "WOLF EVEN GURU CRUX",
            "RUBY HUTS UNDO FLAP",
            "VOID TIME YURT IRON",
            "GALA CURL RAMP WALL",
            "WOLF TAXI IRON ZINC",
            "ROOF GEMS ONYX JUDO",
            "HOLY KICK LUCK NAVY",
        ];
        let expected_bytemoji_ids = [
            "๐Ÿ”ญ ๐Ÿ› ๐Ÿ’ช ๐ŸŽพ",
            "๐ŸŒŽ ๐Ÿ’› ๐Ÿ’– ๐Ÿ’ซ",
            "๐Ÿง€ ๐Ÿš— ๐Ÿฆ„ ๐Ÿš",
            "๐Ÿบ ๐Ÿฆท ๐Ÿž ๐Ÿ˜ˆ",
            "๐Ÿฅ ๐Ÿฅ  ๐Ÿฐ ๐Ÿ‰",
            "๐Ÿ” ๐Ÿ‘Ÿ ๐Ÿฆž ๐Ÿ",
            "๐Ÿ† ๐Ÿ‘น ๐ŸŽ‰ ๐Ÿฆ†",
            "๐Ÿบ ๐Ÿงต ๐Ÿ ๐ŸŸ",
            "๐Ÿ† ๐Ÿ… ๐Ÿ“ฆ ๐Ÿ’จ",
            "๐Ÿœ ๐ŸŒœ ๐ŸŸฉ ๐ŸŽก",
        ];
        let expected_urs = [
            "ur:provenance/lfaehddpasbdwzyarhjnbyjzcsuyfzkkuecaemahglnyjsfwutksfpvycncafwrkzojzyaosfrgwfmqdrssrbngwbtoxfyctaxgwgewmqd",
            "ur:provenance/lfaehddpgolgrsswfwykynlgflfteezedwatkbhhkgweasgecfndmtrfsbjsdldlemincwrsdeswmyutvefetoskcehnytdrgefyutwdbn",
            "ur:provenance/lfaehddpgujedtisgtzmstltsojlotvldkverdsbrlclhklbgoknpklelbpkotrpatbeiyotrsgofrcxlaserlfyzoryhtkpvasnpmfmse",
            "ur:provenance/lfaehddpkprkfltijsfhfrfhwluodtfpcwntuezmadmykebatehebgnlldmdzogybsjykpidzmbsrlckbajlvypdsbpagmnbidvoryqzpy",
            "ur:provenance/lfaehddplptkjyjtvssfctskskmybgwyvemtylqzvaclreclhkvaskasdlswghjydsgedaclfpuofxftdiwefmsnjelnflcnmubwdauode",
            "ur:provenance/lfaehddpsgdifpbewkzejpimlntdotntgsvslerkfrmeryhfnddshhhebnbzchkpnbcyflctptcsjlwszcmwtahdvwlnnnynyajzhddmih",
            "ur:provenance/lfaehddpuehhryvefhjtiddtsowseotiemurwkptsnurmkspksghyklyeeylmdhfcezcwetymkgtlygrhpsadwdnfgeyihotwfjlweoymw",
            "ur:provenance/lfaehddpbseevyrpfesfwpvdykhkenpygydnwlttfypasnjpmsgsqdlbaswtbemtfmeconcavamdzonnhgsfprmsaomwnlinuosrmeaxld",
            "ur:provenance/lfaehddpgyemdwoeutynsfjkkbcezswzcxnyndcsnbctztbzjpsbkofrbyndfhghaabsgyuefrcldebdjydsjncpfzfrcegemsrssoguht",
            "ur:provenance/lfaehddppyswpkiettmysgveltgwqdlebbfedeaeqdbwgynsjyfwiodaolsrvoaorslegrlsutrsectkjpbsaoosluswtpbzhpvewttycx",
        ];
        let expected_urls = [
            "https://example.com/validate?provenance=tngdgmgwhflfaehddpasbdwzyarhjnbyjzcsuyfzkkuecaemahglnyjsfwutksfpvycncafwrkzojzyaosfrgwfmqdrssrbngwbtoxfyctaxpdkpyahl",
            "https://example.com/validate?provenance=tngdgmgwhflfaehddpgolgrsswfwykynlgflfteezedwatkbhhkgweasgecfndmtrfsbjsdldlemincwrsdeswmyutvefetoskcehnytdrgeotvoytvo",
            "https://example.com/validate?provenance=tngdgmgwhflfaehddpgujedtisgtzmstltsojlotvldkverdsbrlclhklbgoknpklelbpkotrpatbeiyotrsgofrcxlaserlfyzoryhtkpvadrmodpdl",
            "https://example.com/validate?provenance=tngdgmgwhflfaehddpkprkfltijsfhfrfhwluodtfpcwntuezmadmykebatehebgnlldmdzogybsjykpidzmbsrlckbajlvypdsbpagmnbidahlfosfe",
            "https://example.com/validate?provenance=tngdgmgwhflfaehddplptkjyjtvssfctskskmybgwyvemtylqzvaclreclhkvaskasdlswghjydsgedaclfpuofxftdiwefmsnjelnflcnmuwkcytksw",
            "https://example.com/validate?provenance=tngdgmgwhflfaehddpsgdifpbewkzejpimlntdotntgsvslerkfrmeryhfnddshhhebnbzchkpnbcyflctptcsjlwszcmwtahdvwlnnnynyaluiofslu",
            "https://example.com/validate?provenance=tngdgmgwhflfaehddpuehhryvefhjtiddtsowseotiemurwkptsnurmkspksghyklyeeylmdhfcezcwetymkgtlygrhpsadwdnfgeyihotwflotdprkn",
            "https://example.com/validate?provenance=tngdgmgwhflfaehddpbseevyrpfesfwpvdykhkenpygydnwlttfypasnjpmsgsqdlbaswtbemtfmeconcavamdzonnhgsfprmsaomwnlinuodkplbeio",
            "https://example.com/validate?provenance=tngdgmgwhflfaehddpgyemdwoeutynsfjkkbcezswzcxnyndcsnbctztbzjpsbkofrbyndfhghaabsgyuefrcldebdjydsjncpfzfrcegemshdynfzqz",
            "https://example.com/validate?provenance=tngdgmgwhflfaehddppyswpkiettmysgveltgwqdlebbfedeaeqdbwgynsjyfwiodaolsrvoaorslegrlsutrsectkjpbsaoosluswtpbzhpaxtkstto",
        ];

        run_test(
            ProvenanceMarkResolution::Low,
            true,
            &expected_display,
            &expected_debug,
            &expected_bytewords,
            &expected_id_words,
            &expected_bytemoji_ids,
            &expected_urs,
            &expected_urls,
        );
    }

    #[test]
    fn test_medium() {
        let expected_display = [
            "ProvenanceMark(188d6bd9)",
            "ProvenanceMark(a5e79a0c)",
            "ProvenanceMark(f0580498)",
            "ProvenanceMark(161820ef)",
            "ProvenanceMark(ab14cd40)",
            "ProvenanceMark(be52dd20)",
            "ProvenanceMark(10a0cfe0)",
            "ProvenanceMark(a6378b0c)",
            "ProvenanceMark(9e740bf4)",
            "ProvenanceMark(a298dc7c)",
        ];
        let expected_debug = [
            r#"ProvenanceMark(key: 090bf2f8b55be45b, hash: 188d6bd9ad8bc4f3, chainID: 090bf2f8b55be45b, seq: 0, date: 2023-06-20T12:00:00Z)"#,
            r#"ProvenanceMark(key: 558dbfc6536b2968, hash: a5e79a0c4ac31e1d, chainID: 090bf2f8b55be45b, seq: 1, date: 2023-06-21T12:00:00Z)"#,
            r#"ProvenanceMark(key: 75bb47d085cf746e, hash: f0580498d879ef1d, chainID: 090bf2f8b55be45b, seq: 2, date: 2023-06-22T12:00:00Z)"#,
            r#"ProvenanceMark(key: ca274110de5cbde4, hash: 161820ef30016ef1, chainID: 090bf2f8b55be45b, seq: 3, date: 2023-06-23T12:00:00Z)"#,
            r#"ProvenanceMark(key: 0f34e1b651372ca2, hash: ab14cd40dc6c6924, chainID: 090bf2f8b55be45b, seq: 4, date: 2023-06-24T12:00:00Z)"#,
            r#"ProvenanceMark(key: abc6aa642861a61a, hash: be52dd20857e89e2, chainID: 090bf2f8b55be45b, seq: 5, date: 2023-06-25T12:00:00Z)"#,
            r#"ProvenanceMark(key: 42c751c2012df374, hash: 10a0cfe0c0a8cc38, chainID: 090bf2f8b55be45b, seq: 6, date: 2023-06-26T12:00:00Z)"#,
            r#"ProvenanceMark(key: e6528cad9d939b51, hash: a6378b0caeb1821d, chainID: 090bf2f8b55be45b, seq: 7, date: 2023-06-27T12:00:00Z)"#,
            r#"ProvenanceMark(key: 5e78dd288b3915f9, hash: 9e740bf4b82e0848, chainID: 090bf2f8b55be45b, seq: 8, date: 2023-06-28T12:00:00Z)"#,
            r#"ProvenanceMark(key: 7fc7b276b810e4fc, hash: a298dc7c4f57bcba, chainID: 090bf2f8b55be45b, seq: 9, date: 2023-06-29T12:00:00Z)"#,
        ];
        let expected_bytewords = [
            "axis bald whiz yoga race help vibe help scar many list undo buzz puma urge hawk omit memo judo away void leaf maze numb slot back back vial join play days open tent cola visa memo",
            "gyro lung runs skew guru jade diet iris wasp rust body yoga jowl apex drop dark kite lava aunt road yank iced memo unit wasp gems echo wave diet limp tomb vial saga draw edge fact",
            "keep rock fuel taxi limp task jury jolt frog hang gems void saga epic legs curl even lava numb view toil tuna bias film drop cost flap roof slot glow aqua race aqua hard onyx peck",
            "song deli flap blue urge high ruby vibe yawn keno draw yell twin safe ramp rich silk grim apex vial surf veto limp aqua love note keys inch half solo tuna tied zinc cusp whiz hawk",
            "bias edge very ramp gray exam draw oboe redo glow tied quad onyx memo scar dull keno open cyan king ruin buzz puma urge vast scar many rich blue kiwi drop tent into runs ruby luau",
            "play skew peck idle dice huts oval city cash fizz cola idea task idea road time ugly cook grim apex zinc body into vial rich lung yawn holy gift cook undo fish iron veto puma idle",
            "flew slot gray saga acid drop wolf jury ruby easy noon luau song kept waxy list part task gush dark play huts high webs warm back kept city beta fish toys bald good exit tent yurt",
            "visa grim luck poem next menu need gray void nail epic also idle knob king kiwi unit heat buzz game news guru vial holy film figs logo help quiz apex peck free high purr zaps tomb",
            "holy keys unit dice luau eyes buzz yurt zero hard pool city curl tiny dark kiln logo quiz note tent jade gear ruby brew toil dark cyan swan whiz stub lion zone idle frog visa rock",
            "lamb slot purr keno redo blue vibe zest inky whiz drum ugly knob saga tied puff road crux yurt zinc leaf swan zero flap dark hope memo race zest jowl tiny brag code jugs cusp webs",
        ];
        let expected_id_words = [
            "CATS LUNG JADE TUNA",
            "OPEN VOID NAVY BARN",
            "WHAT HARD AQUA MONK",
            "CALM CATS CRUX WEBS",
            "PLAY BULB SWAN FIZZ",
            "RUIN GRIM UNIT CRUX",
            "BLUE NUMB TASK VAST",
            "OVAL EXAM LUAU BARN",
            "NOON JURY BALD WORK",
            "OBOE MONK UNDO KITE",
        ];
        let expected_bytemoji_ids = [
            "๐Ÿค  ๐Ÿ›‘ ๐ŸŒน ๐Ÿถ",
            "๐Ÿ“ซ ๐Ÿ” ๐ŸŽก ๐Ÿคฉ",
            "๐ŸŒ ๐Ÿ” ๐Ÿ™„ ๐Ÿšฆ",
            "๐Ÿคข ๐Ÿค  ๐Ÿ˜ˆ ๐Ÿฆ‹",
            "๐Ÿ’Ž ๐Ÿ˜ต ๐Ÿงข ๐ŸŒ",
            "๐ŸŽท ๐Ÿฅฏ ๐ŸฆŠ ๐Ÿ˜ˆ",
            "๐Ÿฅต ๐Ÿšช ๐Ÿงถ ๐Ÿจ",
            "๐Ÿ“– ๐Ÿ‘‚ ๐Ÿ”ท ๐Ÿคฉ",
            "๐Ÿ”” ๐ŸŒ€ ๐Ÿฅฑ ๐Ÿ",
            "๐ŸŽˆ ๐Ÿšฆ ๐Ÿฐ ๐Ÿ’ซ",
        ];
        let expected_urs = [
            "ur:provenance/lfadhdcxasbdwzyarehpvehpsrmyltuobzpauehkotmojoayvdlfmenbstbkbkvljnpydsonurlefxhf",
            "ur:provenance/lfadhdcxgolgrsswgujedtiswprtbyyajlaxdpdkkelaatrdykidmoutwpgseowedtlptbvlsfrkmeze",
            "ur:provenance/lfadhdcxkprkfltilptkjyjtfghggsvdsaeclsclenlanbvwtltabsfmdpctfprfstgwaarebktkadjt",
            "ur:provenance/lfadhdcxsgdifpbeuehhryveynkodwyltnserprhskgmaxvlsfvolpaaleneksihhfsotatdwfrehgnt",
            "ur:provenance/lfadhdcxbseevyrpgyemdwoerogwtdqdoxmosrdlkooncnkgrnbzpauevtsrmyrhbekidpttindecsgw",
            "ur:provenance/lfadhdcxpyswpkiedehsolcychfzcaiatkiardteuyckgmaxzcbyiovlrhlgynhygtckuofhiokpbbnb",
            "ur:provenance/lfadhdcxfwstgysaaddpwfjyryeynnlusgktwyltpttkghdkpyhshhwswmbkktcybafhtsbdhypejyfs",
            "ur:provenance/lfadhdcxvagmlkpmntmundgyvdnlecaoiekbkgkiuthtbzgensguvlhyfmfslohpqzaxpkfegmdahebg",
            "ur:provenance/lfadhdcxhyksutdeluesbzytzohdplcycltydkknloqznettjegrrybwtldkcnsnwzsblnzeimttfxlb",
            "ur:provenance/lfadhdcxlbstprkorobeveztiywzdmuykbsatdpfrdcxytzclfsnzofpdkhemoreztjltybgbgvaltdn",
        ];
        let expected_urls = [
            "https://example.com/validate?provenance=tngdgmgwhflfadhdcxasbdwzyarehpvehpsrmyltuobzpauehkotmojoayvdlfmenbstbkbkvljnpydsonsrehgsly",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdcxgolgrsswgujedtiswprtbyyajlaxdpdkkelaatrdykidmoutwpgseowedtlptbvltiaenndt",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdcxkprkfltilptkjyjtfghggsvdsaeclsclenlanbvwtltabsfmdpctfprfstgwaarecmjybarh",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdcxsgdifpbeuehhryveynkodwyltnserprhskgmaxvlsfvolpaaleneksihhfsotatdwsbahdge",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdcxbseevyrpgyemdwoerogwtdqdoxmosrdlkooncnkgrnbzpauevtsrmyrhbekidpttkpmuchmk",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdcxpyswpkiedehsolcychfzcaiatkiardteuyckgmaxzcbyiovlrhlgynhygtckuofhkgtocwkt",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdcxfwstgysaaddpwfjyryeynnlusgktwyltpttkghdkpyhshhwswmbkktcybafhtsbdfwbbkgwd",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdcxvagmlkpmntmundgyvdnlecaoiekbkgkiuthtbzgensguvlhyfmfslohpqzaxpkfeglnngdsk",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdcxhyksutdeluesbzytzohdplcycltydkknloqznettjegrrybwtldkcnsnwzsblnzekoimgspd",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdcxlbstprkorobeveztiywzdmuykbsatdpfrdcxytzclfsnzofpdkhemoreztjltybgbahllozt",
        ];

        run_test(
            ProvenanceMarkResolution::Medium,
            false,
            &expected_display,
            &expected_debug,
            &expected_bytewords,
            &expected_id_words,
            &expected_bytemoji_ids,
            &expected_urs,
            &expected_urls,
        );
    }

    #[test]
    fn test_medium_with_info() {
        let expected_display = [
            "ProvenanceMark(999b6a32)",
            "ProvenanceMark(cefdeacc)",
            "ProvenanceMark(a1cb0985)",
            "ProvenanceMark(f8f50783)",
            "ProvenanceMark(317961c4)",
            "ProvenanceMark(679dce5f)",
            "ProvenanceMark(ce0d6942)",
            "ProvenanceMark(fd0e42a9)",
            "ProvenanceMark(6b3452d4)",
            "ProvenanceMark(87f1c482)",
        ];
        let expected_debug = [
            r#"ProvenanceMark(key: 090bf2f8b55be45b, hash: 999b6a32516e7ff8, chainID: 090bf2f8b55be45b, seq: 0, date: 2023-06-20T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 558dbfc6536b2968, hash: cefdeacc3f161286, chainID: 090bf2f8b55be45b, seq: 1, date: 2023-06-21T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 75bb47d085cf746e, hash: a1cb09851a4b0e63, chainID: 090bf2f8b55be45b, seq: 2, date: 2023-06-22T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: ca274110de5cbde4, hash: f8f507836a2944ae, chainID: 090bf2f8b55be45b, seq: 3, date: 2023-06-23T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 0f34e1b651372ca2, hash: 317961c4b69daec5, chainID: 090bf2f8b55be45b, seq: 4, date: 2023-06-24T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: abc6aa642861a61a, hash: 679dce5fc17f6ce0, chainID: 090bf2f8b55be45b, seq: 5, date: 2023-06-25T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 42c751c2012df374, hash: ce0d69422ce2c3dd, chainID: 090bf2f8b55be45b, seq: 6, date: 2023-06-26T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: e6528cad9d939b51, hash: fd0e42a9448fca02, chainID: 090bf2f8b55be45b, seq: 7, date: 2023-06-27T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 5e78dd288b3915f9, hash: 6b3452d45e5e467d, chainID: 090bf2f8b55be45b, seq: 8, date: 2023-06-28T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 7fc7b276b810e4fc, hash: 87f1c4826fbc5d23, chainID: 090bf2f8b55be45b, seq: 9, date: 2023-06-29T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
        ];
        let expected_bytewords = [
            "axis bald whiz yoga race help vibe help scar many list undo buzz puma urge hawk cusp liar jugs vial claw into door play slot back back vial join play days open void mint visa help grim peck waxy jowl tuna play onyx yank many fuel brag cash brew girl tiny arch webs very vial lamb safe owls iron onyx fair lamb data flux wall",
            "gyro lung runs skew guru jade diet iris wasp rust body yoga jowl apex drop dark cash navy kept kiln lava real noon frog wasp gems echo wave diet limp tomb vial iris race even aqua bias tiny back good dice puma keys knob jazz foxy hope body gems road real able cost cost dark waxy flux jade bald zoom liar flap chef cyan lava",
            "keep rock fuel taxi limp task jury jolt frog hang gems void saga epic legs curl into brew poem yoga cash warm waxy fizz drop cost flap roof slot glow aqua race kiln peck soap inch waxy fuel flux eyes legs item hawk brag apex mild surf guru junk tomb quad high roof eyes frog pool tomb grim inky undo jowl data road into race",
            "song deli flap blue urge high ruby vibe yawn keno draw yell twin safe ramp rich down runs dark many mint song pose help love note keys inch half solo tuna tied toys into gift deli toys heat gush math kiwi flew wolf lava door eyes zero cusp fact limp leaf brew jade zoom flap knob ugly keep twin omit need oboe item dark cats",
            "bias edge very ramp gray exam draw oboe redo glow tied quad onyx memo scar dull wasp soap many zoom tiny vibe keno fish vast scar many rich blue kiwi drop tent king crux belt dark when glow king flew help diet quiz webs horn junk pool judo down mint waxy cyan keys gear chef keys urge iced each code horn bias exit love yawn",
            "play skew peck idle dice huts oval city cash fizz cola idea task idea road time also tent flap kite rich blue leaf very rich lung yawn holy gift cook undo fish void figs visa quad numb eyes taxi aunt scar guru miss kick vast echo liar atom beta gems zero duty quad memo inch quiz meow jump oboe bald ramp oboe gala fund aunt",
            "flew slot gray saga acid drop wolf jury ruby easy noon luau song kept waxy list kept iced whiz lion fuel down guru back warm back kept city beta fish toys bald vows jugs bald cyan cost zest hard able grim tomb knob wave city loud scar huts twin away heat vows frog main acid void monk foxy puma roof vast tied acid vial brew",
            "visa grim luck poem next menu need gray void nail epic also idle knob king kiwi lion idea undo webs keno join play flap film figs logo help quiz apex peck free limp zoom quiz holy jury undo maze data leaf fuel tomb huts silk keys part liar brew eyes vial fern aunt curl open lava cusp legs part nail vast wolf logo dice away",
            "holy keys unit dice luau eyes buzz yurt zero hard pool city curl tiny dark kiln kiwi work skew when lung fair wolf days toil dark cyan swan whiz stub lion zone draw yoga hawk dull rich swan tuna loud luau jury flew also oval lung axis gush song warm fish knob lava even each main glow girl tuna redo miss soap kiln noon belt",
            "lamb slot purr keno redo blue vibe zest inky whiz drum ugly knob saga tied puff note gala very apex oboe days city trip dark hope memo race zest jowl tiny brag real silk mild trip jugs quiz monk poem hang quiz numb iron what fair noon poem luau taco unit ramp figs twin veto menu wall away solo figs skew kick cola zest apex",
        ];
        let expected_id_words = [
            "NAIL NEED ITEM EASY",
            "TACO ZINC WAND SURF",
            "OBEY STUB AXIS LIMP",
            "YOGA YANK AUNT LEGS",
            "EACH KICK HUTS SETS",
            "INTO NEXT TACO HOPE",
            "TACO BELT IRON FLEW",
            "ZINC BETA FLEW PART",
            "JADE EDGE GRIM TINY",
            "LIST WHEN SETS LEAF",
        ];
        let expected_bytemoji_ids = [
            "๐Ÿฐ ๐ŸŽข ๐Ÿ„ ๐Ÿ‘ˆ",
            "๐Ÿ‘“ ๐ŸŸ ๐Ÿฆ‰ ๐Ÿ‘”",
            "๐Ÿช‘ ๐Ÿ‘— ๐Ÿ˜ญ ๐Ÿ",
            "๐Ÿชผ ๐Ÿชฝ ๐Ÿ˜ ๐Ÿ’–",
            "๐Ÿ‘Ž ๐ŸŒœ ๐Ÿฅ  โœจ",
            "๐ŸŒฑ ๐Ÿ  ๐Ÿ‘“ ๐Ÿค",
            "๐Ÿ‘“ ๐Ÿ˜ถ ๐Ÿ ๐Ÿ‡",
            "๐ŸŸ ๐Ÿคจ ๐Ÿ‡ ๐Ÿงฎ",
            "๐ŸŒน ๐Ÿ’ช ๐Ÿฅฏ ๐Ÿงฆ",
            "๐Ÿ’ฌ ๐Ÿž โœจ ๐Ÿ’˜",
        ];
        let expected_urs = [
            "ur:provenance/lfadhdfsasbdwzyarehpvehpsrmyltuobzpauehkcplrjsvlcwiodrpystbkbkvljnpydsonvdmtvahpgmpkwyjltapyoxykmyflbgchbwgltyahwsvyvllbseosinoxfrdttlhffg",
            "ur:provenance/lfadhdfsgolgrsswgujedtiswprtbyyajlaxdpdkchnyktknlarlnnfgwpgseowedtlptbvlisreenaabstybkgddepakskbjzfyhebygsrdrlaectctdkwyfxjebdzmlrchwlendl",
            "ur:provenance/lfadhdfskprkfltilptkjyjtfghggsvdsaeclscliobwpmyachwmwyfzdpctfprfstgwaareknpkspihwyflfxeslsimhkbgaxmdsfgujktbqdhhrfesfgpltbgmiyuojljkgejpcy",
            "ur:provenance/lfadhdfssgdifpbeuehhryveynkodwyltnserprhdnrsdkmymtsgpehpleneksihhfsotatdtsiogtditshtghmhkifwwfladreszocpftlplfbwjezmfpkbuykptnotndwknyehrl",
            "ur:provenance/lfadhdfsbseevyrpgyemdwoerogwtdqdoxmosrdlwpspmyzmtyvekofhvtsrmyrhbekidpttkgcxbtdkwngwkgfwhpdtqzwshnjkpljodnmtwycnksgrcfksueidehcehnhkspnehk",
            "ur:provenance/lfadhdfspyswpkiedehsolcychfzcaiatkiardteaottfpkerhbelfvyrhlgynhygtckuofhvdfsvaqdnbestiatsrgumskkvteolrambagszodyqdmoihqzmwjpoebdrpwkrhhlpd",
            "ur:provenance/lfadhdfsfwstgysaaddpwfjyryeynnlusgktwyltktidwzlnfldngubkwmbkktcybafhtsbdvsjsbdcnctzthdaegmtbkbwecyldsrhstnayhtvsfgmnadvdmkfyparfvtlrwnynrf",
            "ur:provenance/lfadhdfsvagmlkpmntmundgyvdnlecaoiekbkgkilniauowskojnpyfpfmfslohpqzaxpkfelpzmqzhyjyuomedalffltbhsskksptlrbwesvlfnatclonlacplsptnlvtonksfsos",
            "ur:provenance/lfadhdfshyksutdeluesbzytzohdplcycltydkknkiwkswwnlgfrwfdstldkcnsnwzsblnzedwyahkdlrhsntaldlujyfwaoollgasghsgwmfhkblaenehmngwgltaromsnnleluoe",
            "ur:provenance/lfadhdfslbstprkorobeveztiywzdmuykbsatdpfnegavyaxoedscytpdkhemoreztjltybgrlskmdtpjsqzmkpmhgqznbinwtfrnnpmlutoutrpfstnvomuwlaysofsswdlwewlps",
        ];
        let expected_urls = [
            "https://example.com/validate?provenance=tngdgmgwhflfadhdfsasbdwzyarehpvehpsrmyltuobzpauehkcplrjsvlcwiodrpystbkbkvljnpydsonvdmtvahpgmpkwyjltapyoxykmyflbgchbwgltyahwsvyvllbseosinoxfrchhhfnzo",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdfsgolgrsswgujedtiswprtbyyajlaxdpdkchnyktknlarlnnfgwpgseowedtlptbvlisreenaabstybkgddepakskbjzfyhebygsrdrlaectctdkwyfxjebdzmlrdthnhhmo",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdfskprkfltilptkjyjtfghggsvdsaeclscliobwpmyachwmwyfzdpctfprfstgwaareknpkspihwyflfxeslsimhkbgaxmdsfgujktbqdhhrfesfgpltbgmiyuojlgtsrcsos",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdfssgdifpbeuehhryveynkodwyltnserprhdnrsdkmymtsgpehpleneksihhfsotatdtsiogtditshtghmhkifwwfladreszocpftlplfbwjezmfpkbuykptnotndsgbwhpbk",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdfsbseevyrpgyemdwoerogwtdqdoxmosrdlwpspmyzmtyvekofhvtsrmyrhbekidpttkgcxbtdkwngwkgfwhpdtqzwshnjkpljodnmtwycnksgrcfksueidehcehniofpykve",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdfspyswpkiedehsolcychfzcaiatkiardteaottfpkerhbelfvyrhlgynhygtckuofhvdfsvaqdnbestiatsrgumskkvteolrambagszodyqdmoihqzmwjpoebdrpsgdyembz",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdfsfwstgysaaddpwfjyryeynnlusgktwyltktidwzlnfldngubkwmbkktcybafhtsbdvsjsbdcnctzthdaegmtbkbwecyldsrhstnayhtvsfgmnadvdmkfyparfvtrdksnsad",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdfsvagmlkpmntmundgyvdnlecaoiekbkgkilniauowskojnpyfpfmfslohpqzaxpkfelpzmqzhyjyuomedalffltbhsskksptlrbwesvlfnatclonlacplsptnlvtndwnhgcy",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdfshyksutdeluesbzytzohdplcycltydkknkiwkswwnlgfrwfdstldkcnsnwzsblnzedwyahkdlrhsntaldlujyfwaoollgasghsgwmfhkblaenehmngwgltaromsnbaxvyct",
            "https://example.com/validate?provenance=tngdgmgwhflfadhdfslbstprkorobeveztiywzdmuykbsatdpfnegavyaxoedscytpdkhemoreztjltybgrlskmdtpjsqzmkpmhgqznbinwtfrnnpmlutoutrpfstnvomuwlaysofsswbyielsby",
        ];

        run_test(
            ProvenanceMarkResolution::Medium,
            true,
            &expected_display,
            &expected_debug,
            &expected_bytewords,
            &expected_id_words,
            &expected_bytemoji_ids,
            &expected_urs,
            &expected_urls,
        );
    }

    #[test]
    fn test_quartile() {
        let expected_display = [
            "ProvenanceMark(4a0738a3)",
            "ProvenanceMark(d95dc357)",
            "ProvenanceMark(a427f3d2)",
            "ProvenanceMark(706fada0)",
            "ProvenanceMark(2ad78680)",
            "ProvenanceMark(94169f21)",
            "ProvenanceMark(479cac60)",
            "ProvenanceMark(575cbdd1)",
            "ProvenanceMark(cfc526bf)",
            "ProvenanceMark(a308d3f2)",
        ];
        let expected_debug = [
            r#"ProvenanceMark(key: 090bf2f8b55be45b4661b24b7e9c340c, hash: 4a0738a31a3e9073f1c01999cd01ff0a, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 0, date: 2023-06-20T12:00:00Z)"#,
            r#"ProvenanceMark(key: 558dbfc6536b296875bb47d085cf746e, hash: d95dc3573bee6e1f4504ce6e971de31a, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 1, date: 2023-06-21T12:00:00Z)"#,
            r#"ProvenanceMark(key: ca274110de5cbde40f34e1b651372ca2, hash: a427f3d2f56c956e715d05089a9c1125, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 2, date: 2023-06-22T12:00:00Z)"#,
            r#"ProvenanceMark(key: abc6aa642861a61a42c751c2012df374, hash: 706fada07359cfc46e9f227405e5a50a, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 3, date: 2023-06-23T12:00:00Z)"#,
            r#"ProvenanceMark(key: e6528cad9d939b515e78dd288b3915f9, hash: 2ad78680ddfa4a7789cfc974b99edab3, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 4, date: 2023-06-24T12:00:00Z)"#,
            r#"ProvenanceMark(key: 7fc7b276b810e4fc14a72ac53b5cd9b5, hash: 94169f216caa0853c1108435cf51856f, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 5, date: 2023-06-25T12:00:00Z)"#,
            r#"ProvenanceMark(key: 445dbfc1264fd6de95b5ca8c060c24ba, hash: 479cac604e8b022e0f63688f165a4334, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 6, date: 2023-06-26T12:00:00Z)"#,
            r#"ProvenanceMark(key: 1dadf8aa6a2b2fa657fc7a0225d1880e, hash: 575cbdd132391fc3a0d5f1f2038d1923, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 7, date: 2023-06-27T12:00:00Z)"#,
            r#"ProvenanceMark(key: 5946b5fd32e588c593923750478d74d4, hash: cfc526bf20716acb922a0eb52c4e88f7, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 8, date: 2023-06-28T12:00:00Z)"#,
            r#"ProvenanceMark(key: 469cbdca128f2d85d803e81b3e0e3a7d, hash: a308d3f2b0cb42330b971ceef18a168e, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 9, date: 2023-06-29T12:00:00Z)"#,
        ];
        let expected_bytewords = [
            "axis bald whiz yoga race help vibe help frog huts purr gear knob news edge barn inky jump mild warm warm pose obey ruby very hill yank song frog into maze work exam veto foxy iron quiz edge arch cusp blue gray zaps task saga half monk jolt menu peck fern fizz item cost rich mild nail omit lazy song meow claw",
            "gyro lung runs skew guru jade diet iris keep rock fuel taxi limp task jury jolt fair puma luau fact lamb days eyes eyes omit ruin lava eyes soap huts fact part swan many king visa scar yank part trip drop fund toys twin sets door tied whiz huts guru logo skew exam scar brew jolt work memo flew knob inch list",
            "song deli flap blue urge high ruby vibe bias edge very ramp gray exam draw oboe redo loud lion item yurt lion taxi oval chef crux song quiz need pose rust void wave aunt oval tomb aqua numb limp grim buzz body navy wave taxi flux cook kite wave owls ruby work view memo frog road tomb ruin webs owls rock frog",
            "play skew peck idle dice huts oval city flew slot gray saga acid drop wolf jury fern tomb hope keys down plus keno able twin claw oval jugs bulb horn taxi twin jury draw deli bias exam love vial item song silk saga curl runs fact flux vast rock road toil ramp diet cusp buzz eyes gear flew part math drop yoga",
            "visa grim luck poem next menu need gray holy keys unit dice luau eyes buzz yurt zone jazz tomb days purr when main vast work eyes diet kept onyx visa fact iron limp drop swan gear fair paid kiln grim math scar flew cash soap memo cusp flew jump zone oval unit main ramp taxi also memo wall numb dull webs vial",
            "lamb slot purr keno redo blue vibe zest bulb owls door silk fair high tuna race idle main scar gear vast numb urge wasp lamb memo poem into void idle ruin arch horn kick even zone unit gift easy puma flux view edge edge gift lava zest mild apex wall logo hang film webs tent race safe huts visa gems away undo",
            "foxy hill runs safe days glow tomb urge mild race song luck atom barn dark road work foxy meow crux flux back jugs also flew purr liar jugs knob drum monk race bias idle oval peck leaf noon soap cats grim king wasp keys gems flap bald news king kick arch fern guru kick edge eyes fern pose gift curl join curl",
            "cola poem yoga peck item down dull oval hang zest kiln also data tent logo beta body yurt mint code jugs scar task oval wolf belt stub hard edge memo cost fish heat miss gala jade main cook safe help belt kick even liar idle lung vows chef unit toil hope crux liar yell what cusp noon aqua yurt dull fund taxi",
            "hawk frog race zinc easy view logo silk menu memo exam good fuel lung jury tiny able kick iced iced free visa down undo time ruin tent jump body kiwi cook saga hope body owls beta half flux free gray keep mild slot edge jump join undo judo aqua owls work safe vast apex song aqua help eyes jade zone zinc gems",
            "frog news ruby song brag many drop limp trip apex vows claw film beta fact kiwi fern ruin luck hard city paid nail grim flux zaps ramp kiwi exam tent free even gray film brag purr pool cost skew body zone zinc eyes half yoga easy vial puma brew loud real surf warm ugly cats away lamb beta hawk exam trip plus",
        ];
        let expected_id_words = [
            "GAME AUNT EXIT OMIT",
            "TUNA HILL SCAR HANG",
            "ONYX DELI WOLF TIED",
            "JUDO JOWL POEM NUMB",
            "DOOR TOYS LION LAVA",
            "MEOW CALM NOTE CURL",
            "FUEL NEWS PLUS HORN",
            "HANG HIGH RUBY TENT",
            "TASK SILK DAYS RUNS",
            "OMIT AWAY TIME WHIZ",
        ];
        let expected_bytemoji_ids = [
            "๐Ÿฅ‘ ๐Ÿ˜ ๐Ÿ‘ƒ ๐Ÿ’Œ",
            "๐Ÿถ ๐Ÿฑ ๐Ÿ“ ๐ŸŒญ",
            "๐Ÿ“ฆ ๐Ÿ˜น ๐Ÿบ ๐Ÿ‘ ",
            "๐Ÿ’จ ๐ŸŒธ โฐ ๐Ÿšช",
            "๐Ÿ™€ ๐Ÿ‘œ ๐Ÿšฉ ๐Ÿ’›",
            "๐Ÿšจ ๐Ÿคข ๐Ÿ”‘ ๐Ÿ‘น",
            "๐Ÿ ๐ŸŽ  ๐Ÿ“ท ๐Ÿš",
            "๐ŸŒญ ๐Ÿฅ™ ๐Ÿฅ ๐Ÿ’",
            "๐Ÿงถ ๐Ÿ”ฅ ๐Ÿ˜บ ๐ŸŽบ",
            "๐Ÿ’Œ ๐Ÿ˜˜ ๐Ÿ‘Ÿ ๐Ÿข",
        ];
        let expected_urs = [
            "ur:provenance/lfaohdftasbdwzyarehpvehpfghsprgrkbnseebniyjpmdwmwmpeoyryvyhlyksgfgiomewkemvofyinqzeeahcpbegyzstksahfmkjtmupkfnfzimctrhmdnlotcywzfrzo",
            "ur:provenance/lfaohdftgolgrsswgujedtiskprkfltilptkjyjtfrpaluftlbdsesesotrnlaessphsftptsnmykgvasrykpttpdpfdtstnssdrtdwzhsguloswemsrbwjtwkmotafgsgio",
            "ur:provenance/lfaohdftsgdifpbeuehhryvebseevyrpgyemdwoeroldlnimytlntiolcfcxsgqzndpertvdweatoltbaanblpgmbzbynywetifxckkeweosrywkvwmofgrdtbrnjynebbol",
            "ur:provenance/lfaohdftpyswpkiedehsolcyfwstgysaaddpwfjyfntbheksdnpskoaetncwoljsbbhntitnjydwdibsemlevlimsgsksaclrsftfxvtrkrdtlrpdtcpbzesgrfweypdlfcs",
            "ur:provenance/lfaohdftvagmlkpmntmundgyhyksutdeluesbzytzejztbdsprwnmnvtwkesdtktoxvaftinlpdpsngrfrpdkngmmhsrfwchspmocpfwjpzeolutmnrptiaomowlfrchfzax",
            "ur:provenance/lfaohdftlbstprkorobeveztbbosdrskfrhhtareiemnsrgrvtnbuewplbmopmiovdiernahhnkkenzeutgteypafxvweeeegtlaztmdaxwllohgfmwsttresehskijyosfn",
            "ur:provenance/lfaohdftfyhlrssedsgwtbuemdresglkambndkrdwkfymwcxfxbkjsaofwprlrjskbdmmkrebsieolpklfnnspcsgmkgwpksgsfpbdnskgkkahfngukkeeesfnpetbcfsase",
            "ur:provenance/lfaohdftcapmyapkimdndlolhgztknaodattlobabyytmtcejssrtkolwfbtsbhdeemoctfhhtmsgajemncksehpbtkkenlrielgvscfuttlhecxlrylwtcpnnaaidchvddy",
            "ur:provenance/lfaohdfthkfgrezceyvwloskmumoemgdfllgjytyaekkididfevadnuoternttjpbykicksahebyosbahffxfegykpmdsteejpjnuojoaaoswksevtaxsgaahpeswtswgmps",
            "ur:provenance/lfaohdftfgnsrysgbgmydplptpaxvscwfmbaftkifnrnlkhdcypdnlgmfxzsrpkiemttfeengyfmbgprplctswbyzezceshfyaeyvlpabwldrlsfwmuycsaylbbasabsktgs",
        ];
        let expected_urls = [
            "https://example.com/validate?provenance=tngdgmgwhflfaohdftasbdwzyarehpvehpfghsprgrkbnseebniyjpmdwmwmpeoyryvyhlyksgfgiomewkemvofyinqzeeahcpbegyzstksahfmkjtmupkfnfzimctrhmdnlothposhyuo",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdftgolgrsswgujedtiskprkfltilptkjyjtfrpaluftlbdsesesotrnlaessphsftptsnmykgvasrykpttpdpfdtstnssdrtdwzhsguloswemsrbwjtwkmomkbwpefz",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdftsgdifpbeuehhryvebseevyrpgyemdwoeroldlnimytlntiolcfcxsgqzndpertvdweatoltbaanblpgmbzbynywetifxckkeweosrywkvwmofgrdtbrnecsgjsly",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdftpyswpkiedehsolcyfwstgysaaddpwfjyfntbheksdnpskoaetncwoljsbbhntitnjydwdibsemlevlimsgsksaclrsftfxvtrkrdtlrpdtcpbzesgrfwjkzcvdfh",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdftvagmlkpmntmundgyhyksutdeluesbzytzejztbdsprwnmnvtwkesdtktoxvaftinlpdpsngrfrpdkngmmhsrfwchspmocpfwjpzeolutmnrptiaomowlknfwdadk",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdftlbstprkorobeveztbbosdrskfrhhtareiemnsrgrvtnbuewplbmopmiovdiernahhnkkenzeutgteypafxvweeeegtlaztmdaxwllohgfmwsttresehsfnclsacw",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdftfyhlrssedsgwtbuemdresglkambndkrdwkfymwcxfxbkjsaofwprlrjskbdmmkrebsieolpklfnnspcsgmkgwpksgsfpbdnskgkkahfngukkeeesfnpemsgsosva",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdftcapmyapkimdndlolhgztknaodattlobabyytmtcejssrtkolwfbtsbhdeemoctfhhtmsgajemncksehpbtkkenlrielgvscfuttlhecxlrylwtcpnnaacnfwlfch",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdfthkfgrezceyvwloskmumoemgdfllgjytyaekkididfevadnuoternttjpbykicksahebyosbahffxfegykpmdsteejpjnuojoaaoswksevtaxsgaahpespamuemlu",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdftfgnsrysgbgmydplptpaxvscwfmbaftkifnrnlkhdcypdnlgmfxzsrpkiemttfeengyfmbgprplctswbyzezceshfyaeyvlpabwldrlsfwmuycsaylbbalshtbgje",
        ];

        run_test(
            ProvenanceMarkResolution::Quartile,
            false,
            &expected_display,
            &expected_debug,
            &expected_bytewords,
            &expected_id_words,
            &expected_bytemoji_ids,
            &expected_urs,
            &expected_urls,
        );
    }

    #[test]
    fn test_quartile_with_info() {
        let expected_display = [
            "ProvenanceMark(5bbcccab)",
            "ProvenanceMark(9b1f7fe6)",
            "ProvenanceMark(89272fb4)",
            "ProvenanceMark(363c21c2)",
            "ProvenanceMark(8a9828a8)",
            "ProvenanceMark(50aeeb37)",
            "ProvenanceMark(84e26272)",
            "ProvenanceMark(25c8850f)",
            "ProvenanceMark(9ade9daa)",
            "ProvenanceMark(1c0b6f5e)",
        ];
        let expected_debug = [
            r#"ProvenanceMark(key: 090bf2f8b55be45b4661b24b7e9c340c, hash: 5bbcccab578f10c794a2a66fd42abff1, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 0, date: 2023-06-20T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 558dbfc6536b296875bb47d085cf746e, hash: 9b1f7fe61f3f9a2fbfc5f896b5e1bb5c, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 1, date: 2023-06-21T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: ca274110de5cbde40f34e1b651372ca2, hash: 89272fb4945aa03ce0efe8bb7d454773, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 2, date: 2023-06-22T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: abc6aa642861a61a42c751c2012df374, hash: 363c21c2ca486cd34922912670a6c525, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 3, date: 2023-06-23T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: e6528cad9d939b515e78dd288b3915f9, hash: 8a9828a898c97d76e114d00af3bcdc1d, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 4, date: 2023-06-24T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 7fc7b276b810e4fc14a72ac53b5cd9b5, hash: 50aeeb375a05e2f870f302b221972dd2, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 5, date: 2023-06-25T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 445dbfc1264fd6de95b5ca8c060c24ba, hash: 84e2627277ea03eb2384ce167bba24a3, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 6, date: 2023-06-26T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 1dadf8aa6a2b2fa657fc7a0225d1880e, hash: 25c8850f0d4f74aefaea5460f5990317, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 7, date: 2023-06-27T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 5946b5fd32e588c593923750478d74d4, hash: 9ade9daaa70c28c38b6de6b5e93f7174, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 8, date: 2023-06-28T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 469cbdca128f2d85d803e81b3e0e3a7d, hash: 1c0b6f5e7521a6ebd2d2e96adae4df25, chainID: 090bf2f8b55be45b4661b24b7e9c340c, seq: 9, date: 2023-06-29T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
        ];
        let expected_bytewords = [
            "axis bald whiz yoga race help vibe help frog huts purr gear knob news edge barn inky jump mild warm warm pose obey ruby very hill yank song frog into maze work days hawk puff huts yurt limp limp mint keep echo free eyes ugly kiwi trip mild menu peck fern fizz item cost rich mild nail omit drum meow sets work zinc edge beta zero draw redo king math real dice onyx cats help iris join oboe nail slot barn news jury fact miss eyes love jury soap surf nail",
            "gyro lung runs skew guru jade diet iris keep rock fuel taxi limp task jury jolt fair puma luau fact lamb days eyes eyes omit ruin lava eyes soap huts fact part many swan slot hang void dark hill vows toys loud very cusp visa tomb love quiz huts guru logo skew exam scar brew jolt work memo task puma ramp zest redo high body trip many body door zest soap idle fish kiln webs kiwi jowl redo roof play warm able gems figs miss back visa silk lava quiz aunt",
            "song deli flap blue urge high ruby vibe bias edge very ramp gray exam draw oboe redo loud lion item yurt lion taxi oval chef crux song quiz need pose rust void rust aunt kiln puff inch mint puff able liar omit kept holy exam navy fund door wave owls ruby work view memo frog road tomb ruin data paid curl king scar axis flew math logo kiln frog jury flap judo omit peck edge pose unit code void puma maze road item ramp unit poem lamb task pose wave dull",
            "play skew peck idle dice huts oval city flew slot gray saga acid drop wolf jury fern tomb hope keys down plus keno able twin claw oval jugs bulb horn taxi twin easy lamb play join main need fizz kiwi wave keys jugs junk song kick cyan task rock road toil ramp diet cusp buzz eyes gear flew plus rock gift logo veto play calm sets yawn taco maze sets tomb owls dark film game item tent game lung ruby tuna blue calm trip help game kite warm luck fish work",
            "visa grim luck poem next menu need gray holy keys unit dice luau eyes buzz yurt zone jazz tomb days purr when main vast work eyes diet kept onyx visa fact iron data iced idea idea knob need gift guru yoga cats help iron leaf puff dark wasp jump zone oval unit main ramp taxi also memo wall even meow open menu hawk into frog inky wand task data surf yank half door grim kiln huts quiz huts item gala scar loud yoga dice webs zero keno gala lung slot lazy",
            "lamb slot purr keno redo blue vibe zest bulb owls door silk fair high tuna race idle main scar gear vast numb urge wasp lamb memo poem into void idle ruin arch onyx safe flew vows warm veto trip city whiz atom purr quad omit frog gush dice apex wall logo hang film webs tent race safe huts flew what love memo omit inky yawn paid puff saga kick fish dull many peck free play nail yawn scar keep idle part into zest wolf calm help fern wolf lung keep kiwi",
            "foxy hill runs safe days glow tomb urge mild race song luck atom barn dark road work foxy meow crux flux back jugs also flew purr liar jugs knob drum monk race surf city iris redo rock zoom solo unit knob news game very curl obey jazz bald king kick arch fern guru kick edge eyes fern pose aqua zone flew jolt jury game monk huts drop vows gyro undo figs king crux luck unit nail zoom blue cats gush vibe yurt omit flew zoom item vibe fern iced diet edge",
            "cola poem yoga peck item down dull oval hang zest kiln also data tent logo beta body yurt mint code jugs scar task oval wolf belt stub hard edge memo cost fish dice apex jugs race puma iris peck even hang frog menu calm memo nail whiz drop unit toil hope crux liar yell what cusp noon aqua work exam trip miss skew easy what free scar rock data body help roof away item king swan keep chef legs purr half kite brag gray lion hope love iris love road list",
            "hawk frog race zinc easy view logo silk menu memo exam good fuel lung jury tiny able kick iced iced free visa down undo time ruin tent jump body kiwi cook saga back back code claw tent film aunt hawk jazz tied dull edge real code data wolf aqua owls work safe vast apex song aqua help eyes news kite drop body bulb when junk diet jolt limp memo onyx girl echo omit crux draw axis whiz door huts edge numb jade real loud ruin saga fish obey wolf race good",
            "frog news ruby song brag many drop limp trip apex vows claw film beta fact kiwi fern ruin luck hard city paid nail grim flux zaps ramp kiwi exam tent free even waxy figs pool cook jade yank cusp solo deli redo surf tied time high door city brew loud real surf warm ugly cats away lamb beta judo diet work monk down vial visa menu also city view help solo real taxi visa flap apex edge help iron cost warm fuel chef free surf fact legs vows judo wall cats",
        ];
        let expected_id_words = [
            "HELP ROOF SURF PLAY",
            "NEED COST LAMB VISA",
            "LOUD DELI DULL QUIZ",
            "EVEN FERN CURL SAGA",
            "LOVE MONK DICE PAID",
            "GOOD POOL WARM EXAM",
            "LIAR VETO ICED JUMP",
            "DATA SOAP LIMP BIAS",
            "NAVY URGE NEXT PECK",
            "CODE BALD JOWL HOLY",
        ];
        let expected_bytemoji_ids = [
            "๐ŸŒฎ ๐Ÿ† ๐Ÿ‘” ๐Ÿ’Ž",
            "๐ŸŽข ๐Ÿคฏ ๐ŸŒ ๐Ÿต",
            "๐Ÿšซ ๐Ÿ˜น ๐Ÿค ๐ŸŽ",
            "๐Ÿฆท ๐Ÿฆถ ๐Ÿ‘น ๐ŸŽพ",
            "๐Ÿ”ด ๐Ÿšฆ ๐Ÿ˜ป ๐Ÿ“Œ",
            "๐Ÿง„ โณ ๐Ÿด ๐Ÿ‘‚",
            "๐Ÿ’• ๐Ÿฆ ๐Ÿจ ๐Ÿ’ง",
            "๐Ÿ‘ฝ ๐Ÿ‘š ๐Ÿ ๐Ÿซฅ",
            "๐ŸŽก ๐Ÿป ๐Ÿ  ๐Ÿ”’",
            "๐Ÿ˜ฌ ๐Ÿฅฑ ๐ŸŒธ ๐Ÿœ",
        ];
        let expected_urs = [
            "ur:provenance/lfaohdhgasbdwzyarehpvehpfghsprgrkbnseebniyjpmdwmwmpeoyryvyhlyksgfgiomewkdshkpfhsytlplpmtkpeofeesuykitpmdmupkfnfzimctrhmdnlotdmmwsswkzceebazodwrokgmhrldeoxcshpisjnoenlstbnnsjyftmseslejolemozs",
            "ur:provenance/lfaohdhggolgrsswgujedtiskprkfltilptkjyjtfrpaluftlbdsesesotrnlaessphsftptmysnsthgvddkhlvstsldvycpvatbleqzhsguloswemsrbwjtwkmotkparpztrohhbytpmybydrztspiefhknwskijlrorfpywmaegsfsmsbkvasesawdie",
            "ur:provenance/lfaohdhgsgdifpbeuehhryvebseevyrpgyemdwoeroldlnimytlntiolcfcxsgqzndpertvdrtatknpfihmtpfaelrotkthyemnyfddrweosrywkvwmofgrdtbrndapdclkgsrasfwmhloknfgjyfpjootpkeepeutcevdpamerdimrputpmlbsbweqdgs",
            "ur:provenance/lfaohdhgpyswpkiedehsolcyfwstgysaaddpwfjyfntbheksdnpskoaetncwoljsbbhntitneylbpyjnmnndfzkiweksjsjksgkkcntkrkrdtlrpdtcpbzesgrfwpsrkgtlovopycmssyntomesstbosdkfmgeimttgelgrytabecmtphpgekewstohsms",
            "ur:provenance/lfaohdhgvagmlkpmntmundgyhyksutdeluesbzytzejztbdsprwnmnvtwkesdtktoxvaftindaidiaiakbndgtguyacshpinlfpfdkwpjpzeolutmnrptiaomowlenmwonmuhkiofgiywdtkdasfykhfdrgmknhsqzhsimgasrldyadewszokogttknlvo",
            "ur:provenance/lfaohdhglbstprkorobeveztbbosdrskfrhhtareiemnsrgrvtnbuewplbmopmiovdiernahoxsefwvswmvotpcywzamprqdotfgghdeaxwllohgfmwsttresehsfwwtlemootiyynpdpfsakkfhdlmypkfepynlynsrkpieptioztwfcmhpfnyltkdnck",
            "ur:provenance/lfaohdhgfyhlrssedsgwtbuemdresglkambndkrdwkfymwcxfxbkjsaofwprlrjskbdmmkresfcyisrorkzmsoutkbnsgevycloyjzbdkgkkahfngukkeeesfnpeaazefwjtjygemkhsdpvsgouofskgcxlkutnlzmbecsghveytotfwzmimveetcxkthg",
            "ur:provenance/lfaohdhgcapmyapkimdndlolhgztknaodattlobabyytmtcejssrtkolwfbtsbhdeemoctfhdeaxjsrepaispkenhgfgmucmmonlwzdputtlhecxlrylwtcpnnaawkemtpmssweywtfesrrkdabyhprfayimkgsnkpcflsprhfkebggylnhelejzspveve",
            "ur:provenance/lfaohdhghkfgrezceyvwloskmumoemgdfllgjytyaekkididfevadnuoternttjpbykicksabkbkcecwttfmathkjztddleerlcedawfaaoswksevtaxsgaahpesnskedpbybbwnjkdtjtlpmooxgleootcxdwaswzdrhseenbjerlldrnsafhonpawmeo",
            "ur:provenance/lfaohdhgfgnsrysgbgmydplptpaxvscwfmbaftkifnrnlkhdcypdnlgmfxzsrpkiemttfeenwyfsplckjeykcpsodirosftdtehhdrcybwldrlsfwmuycsaylbbajodtwkmkdnvlvamuaocyvwhpsorltivafpaxeehpinctwmflcffesfftlswpeyrlkg",
        ];
        let expected_urls = [
            "https://example.com/validate?provenance=tngdgmgwhflfaohdhgasbdwzyarehpvehpfghsprgrkbnseebniyjpmdwmwmpeoyryvyhlyksgfgiomewkdshkpfhsytlplpmtkpeofeesuykitpmdmupkfnfzimctrhmdnlotdmmwsswkzceebazodwrokgmhrldeoxcshpisjnoenlstbnnsjyftmsesletpjkuykp",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdhggolgrsswgujedtiskprkfltilptkjyjtfrpaluftlbdsesesotrnlaessphsftptmysnsthgvddkhlvstsldvycpvatbleqzhsguloswemsrbwjtwkmotkparpztrohhbytpmybydrztspiefhknwskijlrorfpywmaegsfsmsbkvainfrotwm",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdhgsgdifpbeuehhryvebseevyrpgyemdwoeroldlnimytlntiolcfcxsgqzndpertvdrtatknpfihmtpfaelrotkthyemnyfddrweosrywkvwmofgrdtbrndapdclkgsrasfwmhloknfgjyfpjootpkeepeutcevdpamerdimrputpmlbiabbzssr",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdhgpyswpkiedehsolcyfwstgysaaddpwfjyfntbheksdnpskoaetncwoljsbbhntitneylbpyjnmnndfzkiweksjsjksgkkcntkrkrdtlrpdtcpbzesgrfwpsrkgtlovopycmssyntomesstbosdkfmgeimttgelgrytabecmtphpgekeflemdecs",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdhgvagmlkpmntmundgyhyksutdeluesbzytzejztbdsprwnmnvtwkesdtktoxvaftindaidiaiakbndgtguyacshpinlfpfdkwpjpzeolutmnrptiaomowlenmwonmuhkiofgiywdtkdasfykhfdrgmknhsqzhsimgasrldyadewszokovwentijn",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdhglbstprkorobeveztbbosdrskfrhhtareiemnsrgrvtnbuewplbmopmiovdiernahoxsefwvswmvotpcywzamprqdotfgghdeaxwllohgfmwsttresehsfwwtlemootiyynpdpfsakkfhdlmypkfepynlynsrkpieptioztwfcmhpfnheenidme",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdhgfyhlrssedsgwtbuemdresglkambndkrdwkfymwcxfxbkjsaofwprlrjskbdmmkresfcyisrorkzmsoutkbnsgevycloyjzbdkgkkahfngukkeeesfnpeaazefwjtjygemkhsdpvsgouofskgcxlkutnlzmbecsghveytotfwzmimvemhtafmtp",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdhgcapmyapkimdndlolhgztknaodattlobabyytmtcejssrtkolwfbtsbhdeemoctfhdeaxjsrepaispkenhgfgmucmmonlwzdputtlhecxlrylwtcpnnaawkemtpmssweywtfesrrkdabyhprfayimkgsnkpcflsprhfkebggylnhelessehpmje",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdhghkfgrezceyvwloskmumoemgdfllgjytyaekkididfevadnuoternttjpbykicksabkbkcecwttfmathkjztddleerlcedawfaaoswksevtaxsgaahpesnskedpbybbwnjkdtjtlpmooxgleootcxdwaswzdrhseenbjerlldrnsafhbtfdoerf",
            "https://example.com/validate?provenance=tngdgmgwhflfaohdhgfgnsrysgbgmydplptpaxvscwfmbaftkifnrnlkhdcypdnlgmfxzsrpkiemttfeenwyfsplckjeykcpsodirosftdtehhdrcybwldrlsfwmuycsaylbbajodtwkmkdnvlvamuaocyvwhpsorltivafpaxeehpinctwmflcffesfftlsfysbzewk",
        ];

        run_test(
            ProvenanceMarkResolution::Quartile,
            true,
            &expected_display,
            &expected_debug,
            &expected_bytewords,
            &expected_id_words,
            &expected_bytemoji_ids,
            &expected_urs,
            &expected_urls,
        );
    }

    #[test]
    fn test_high() {
        let expected_display = [
            "ProvenanceMark(8cd8e51f)",
            "ProvenanceMark(c5c043de)",
            "ProvenanceMark(211f5570)",
            "ProvenanceMark(fb67f81a)",
            "ProvenanceMark(33cf4029)",
            "ProvenanceMark(96fe484a)",
            "ProvenanceMark(99356fdd)",
            "ProvenanceMark(a91218f2)",
            "ProvenanceMark(a79faa3f)",
            "ProvenanceMark(71500811)",
        ];
        let expected_debug = [
            r#"ProvenanceMark(key: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, hash: 8cd8e51f2885aeca2c644280b53ee75aa12b5a15f4d84068c8c918f8c0d85878, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 0, date: 2023-06-20T12:00:00Z)"#,
            r#"ProvenanceMark(key: 558dbfc6536b296875bb47d085cf746eca274110de5cbde40f34e1b651372ca2, hash: c5c043de88786aaed762e671a08f6805418fd9179179d325f7b2dc8ac115ca9a, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 1, date: 2023-06-21T12:00:00Z)"#,
            r#"ProvenanceMark(key: abc6aa642861a61a42c751c2012df374e6528cad9d939b515e78dd288b3915f9, hash: 211f55707df73f0c8e7404a2b137d4417080a6bb523ba4e4baac409995be05ba, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 2, date: 2023-06-22T12:00:00Z)"#,
            r#"ProvenanceMark(key: 7fc7b276b810e4fc14a72ac53b5cd9b5445dbfc1264fd6de95b5ca8c060c24ba, hash: fb67f81adba64c5c0015b2608edc913a96fe94718f80fd721490cbafd55b3dcb, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 3, date: 2023-06-23T12:00:00Z)"#,
            r#"ProvenanceMark(key: 1dadf8aa6a2b2fa657fc7a0225d1880e5946b5fd32e588c593923750478d74d4, hash: 33cf40295c4c06ac57eb89ef145779d6d65892741539441d93128f95ca194877, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 4, date: 2023-06-24T12:00:00Z)"#,
            r#"ProvenanceMark(key: 469cbdca128f2d85d803e81b3e0e3a7d64f15911e1854210ef5d1b22614a2006, hash: 96fe484af28c77c66b9d5d88dfc7e6b74950cbe9a01c959f2f1fa0e510a9b8c6, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 5, date: 2023-06-25T12:00:00Z)"#,
            r#"ProvenanceMark(key: 46b5294ba2787ed96dc10f79a3de28885d37a6dc0981dca240e7f1324e94a598, hash: 99356fddf4d51ce78887e24b59f86d3a150f0372e098dc8dc47cc57f09e90f7f, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 6, date: 2023-06-26T12:00:00Z)"#,
            r#"ProvenanceMark(key: 2e557fea3bc15ed4de848fc9929ab9b059fa7d30a1436b1fd9a6bc3dd4c08a06, hash: a91218f2e7addb84d58d6c20d869e4cd684b6e7809d2dc7a49b3b1f3c7c3c9a1, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 7, date: 2023-06-27T12:00:00Z)"#,
            r#"ProvenanceMark(key: 53a5f76321139ef9f174b27b088a66c4803128e09eb4c3d97ca51f0c369dca63, hash: a79faa3fca4d8d01a0206aac4c706d21d74e373b277e75a2eafa83802047a1f0, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 8, date: 2023-06-28T12:00:00Z)"#,
            r#"ProvenanceMark(key: 3e095176523550db5ea446af664feab86dba35dbfd168b78e589999b09a702eb, hash: 7150081136c8ec9364c000661180ce566059bf7d2778ff6e6693aac43d800df7, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 9, date: 2023-06-29T12:00:00Z)"#,
        ];
        let expected_bytewords = [
            "axis bald whiz yoga race help vibe help frog huts purr gear knob news edge barn yurt frog gems hope wall high liar yank lava mild game peck ruin away holy kite open fizz dark data lava brew gyro curl glow eyes body ramp epic tiny high item join navy solo gala away view acid real ruin open keys body dice stub fair inch kick waxy waxy tent item code toil whiz wave kept good twin limp cyan lion easy chef kept axis roof work exit nail yank task very lazy gear oboe oboe junk obey hang bald menu draw curl noon jolt game legs void news echo inky surf",
            "gyro lung runs skew guru jade diet iris keep rock fuel taxi limp task jury jolt song deli flap blue urge high ruby vibe bias edge very ramp gray exam draw oboe huts free huts loud arch good saga news foxy whiz kiln jump foxy tiny belt guru vial zone wall gear lava puma liar veto luau puma pose holy oboe real part twin menu rich puff keep apex fuel toys flew tuna plus cola lazy idle tied help cash mild help acid numb real ramp noon pose ramp lava deli inky draw legs holy safe lava good kite task taxi meow hang next cook taco yoga gray help very",
            "play skew peck idle dice huts oval city flew slot gray saga acid drop wolf jury visa grim luck poem next menu need gray holy keys unit dice luau eyes buzz yurt runs liar news puma play yoga limp echo cusp fuel echo blue dark surf tuna glow jury epic zest easy ramp also half quiz play kiwi epic gyro vast fuel work mint away zoom pool chef knob dark eyes data love jolt webs back loud king wand race cash ramp cyan tent into miss calm sets next task puff acid very dull obey bias sets kick days quad puma waxy omit twin gems time aqua luck kite body",
            "lamb slot purr keno redo blue vibe zest bulb owls door silk fair high tuna race foxy hill runs safe days glow tomb urge mild race song luck atom barn dark road blue webs noon work flap keep holy days eyes exam axis cats part race iris sets nail quiz stub tied main back zest void inky drum race gray when roof taxi many redo scar numb code pool owls keno keep tent redo redo puma zero trip note flew huts iris loud into dice meow guru cook safe miss zaps jazz obey veto time yurt warm idea warm surf stub jazz quad kiwi help race inky acid whiz oboe",
            "cola poem yoga peck item down dull oval hang zest kiln also data tent logo beta hawk frog race zinc easy view logo silk menu memo exam good fuel lung jury tiny zaps gyro yawn game when foxy hang luck skew omit crux data duty very taco dull pose zoom keys keys zero monk cook part knob ramp omit lazy game nail song part cyan gyro work tomb high menu veto echo meow horn visa silk door poem gyro nail swan yurt list iron obey days jump able idea bald zaps draw onyx claw hard zaps memo taco stub jury tied trip vibe when loud many race chef tiny warm",
            "frog news ruby song brag many drop limp trip apex vows claw film beta fact kiwi idle when hawk body very limp flew blue webs hill claw cusp huts game crux atom gear vast lava bald taxi glow kept flew frog girl webs lamb webs what pool road stub trip away dull math visa jump race zinc next bias junk dice lion sets cyan work good toil junk dark inch stub city bulb flew veto girl brag jazz onyx help monk apex purr keys heat rust iron wall skew grim loud owls beta gems yank taco fern huts wall door scar deli kiwi dark body wall kick toil flux hang",
            "frog race diet gear oboe keys knob tuna join safe bias kick omit urge dice logo hill exam oval undo axis lazy undo oboe fizz void when easy girl meow open monk drop vibe game swan taco gear user slot memo item arch brag each junk kiln monk rock good news zero open flux dice song vial kite paid flew chef dark tent gift judo tent yoga user open blue zoom keep noon fish veto iris tent quad purr urge jowl main cats urge join easy lava body girl jazz huts safe gush road wand cola claw guru drum help loud yank taxi many race gift lion flew what slot",
            "drum gyro lamb wand fair safe holy tiny urge liar many solo memo navy rich puff hawk zaps kiwi duty obey flux jade cost tuna oval roof figs tiny rust love atom nail edge bias cola zoom yurt menu iron door gyro judo next memo easy cost kiln data vows zoom belt what jazz into jury fund ramp tent foxy kiln cash purr obey paid luck memo crux noon good obey kiwi inky blue good ramp knob hang urge inch atom next bald vows skew hang flux kick slot play gear obey apex foxy brag down gyro taxi mild grim jugs main holy numb zest holy inch claw kick rich",
            "guru open yell idea curl brew noon yurt when jury purr king away love inky sets lava each dice vast noon quiz scar tuna kite open cost barn even next song idea view mint gush wall hard kiwi help hard navy aqua swan toil draw play song drop miss road rock gush high vows part toys surf eyes ramp exam surf jury many zone dice unit jowl view fact join gush body warm jury aunt also surf time hawk next next oval even purr cash inch guru what lazy wasp brag peck owls arch kept kept help safe loud zone obey webs idea fact waxy peck claw memo jowl high",
            "film axis gray keno grim epic good ugly holy onyx frog pose inky glow wand redo join road epic ugly zinc calm luau keys view loud nail need axis owls also warm gems belt claw lion apex need very acid puma kick eyes menu jolt silk owls able ruby lazy epic dark cook glow oboe judo limp buzz brew deli yell able hard city poem buzz join wand fuel part hill ugly keep toil safe leaf yawn sets note play jazz cost zinc fund frog silk puff drum redo hang atom tent vibe bald rust iris oboe tent drum wave claw jazz dark quad peck body blue solo twin tomb",
        ];
        let expected_id_words = [
            "LUCK TRIP VIEW COST",
            "SILK RUST FLUX URGE",
            "CURL COST GYRO JUDO",
            "ZERO INTO YOGA CITY",
            "ECHO TASK FIZZ DIET",
            "MINT ZONE FUND GAME",
            "NAIL EPIC JOWL UNIT",
            "PART BRAG CATS WHIZ",
            "OWLS NOTE PECK FISH",
            "JUGS GOOD AWAY BODY",
        ];
        let expected_bytemoji_ids = [
            "๐ŸŸฉ ๐Ÿฑ ๐Ÿธ ๐Ÿคฏ",
            "๐Ÿ”ฅ ๐Ÿ€ ๐Ÿ“ ๐Ÿป",
            "๐Ÿ‘น ๐Ÿคฏ ๐Ÿฅš ๐Ÿ’จ",
            "๐Ÿš ๐ŸŒฑ ๐Ÿชผ ๐Ÿฅณ",
            "๐Ÿ‘† ๐Ÿงถ ๐ŸŒ ๐Ÿ˜ฝ",
            "๐Ÿš ๐Ÿฌ ๐Ÿฅ ๐Ÿฅ‘",
            "๐Ÿฐ ๐Ÿ‘„ ๐ŸŒธ ๐ŸฆŠ",
            "๐Ÿงฎ ๐Ÿ˜ณ ๐Ÿค  ๐Ÿข",
            "๐Ÿ“š ๐Ÿ”‘ ๐Ÿ”’ ๐Ÿ‹",
            "๐ŸŒŠ ๐Ÿง„ ๐Ÿ˜˜ ๐Ÿฅถ",
        ];
        let expected_urs = [
            "ur:provenance/lfaxhdimasbdwzyarehpvehpfghsprgrkbnseebnytfggshewlhhlryklamdgepkrnayhykeonfzdkdalabwgoclgwesbyrpectyhhimjnnysogaayvwadrlrnonksbydesbfrihkkwywyttimcetlwzwektgdtnlpcnlneycfktasrfwketnlyktkvylygroeoejkoyhgbdmudwclnnjtgelsvdlgcxdlso",
            "ur:provenance/lfaxhdimgolgrsswgujedtiskprkfltilptkjyjtsgdifpbeuehhryvebseevyrpgyemdwoehsfehsldahgdsansfywzknjpfytybtguvlzewlgrlapalrvolupapehyoerlpttnmurhpfkpaxfltsfwtapscalyietdhpchmdhpadnbrlrpnnperpladiiydwlshyselagdketktimwhgntcktowlfwbgve",
            "ur:provenance/lfaxhdimpyswpkiedehsolcyfwstgysaaddpwfjyvagmlkpmntmundgyhyksutdeluesbzytrslrnspapyyalpeocpfleobedksftagwjyeczteyrpaohfqzpykiecgovtflwkmtayzmplcfkbdkesdalejtwsbkldkgwdrechrpcnttiomscmssnttkpfadvydloybssskkdsqdpawyottngstebzneecbb",
            "ur:provenance/lfaxhdimlbstprkorobeveztbbosdrskfrhhtarefyhlrssedsgwtbuemdresglkambndkrdbewsnnwkfpkphydsesemascsptreisssnlqzsbtdmnbkztvdiydmregywnrftimyrosrnbceploskokpttroropazotpnefwhsisldiodemwgucksemszsjzoyvoteytwmiawmsfsbjzqdkihprektbgrkos",
            "ur:provenance/lfaxhdimcapmyapkimdndlolhgztknaodattlobahkfgrezceyvwloskmumoemgdfllgjytyzsgoyngewnfyhglkswotcxdadyvytodlpezmkskszomkckptkbrpotlygenlsgptcngowktbhhmuvoeomwhnvaskdrpmgonlsnytltinoydsjpaeiabdzsdwoxcwhdzsmotosbjytdtpvewnldmyoxbkntwy",
            "ur:provenance/lfaxhdimfgnsrysgbgmydplptpaxvscwfmbaftkiiewnhkbyvylpfwbewshlcwcphsgecxamgrvtlabdtigwktfwfgglwslbwswtplrdsbtpaydlmhvajprezcntbsjkdelnsscnwkgdtljkdkihsbcybbfwvoglbgjzoxhpmkaxprkshtrtinwlswgmldosbagsyktofnhswldrsrdikidkbywlisswbkgm",
            "ur:provenance/lfaxhdimfgredtgroekskbtajnsebskkotuedelohlemoluoaslyuooefzvdwneyglmwonmkdpvegesntogrurstmoimahbgehjkknmkrkgdnszoonfxdesgvlkepdfwcfdkttgtjottyauronbezmkpnnfhvoisttqdpruejlmncsuejneylabygljzhsseghrdwdcacwgudmhpldyktimyregtmsgyrhsa",
            "ur:provenance/lfaxhdimdmgolbwdfrsehytyuelrmysomonyrhpfhkzskidyoyfxjecttaolrffstyrtleamnleebscazmytmuindrgojontmoeyctkndavszmbtwtjziojyfdrpttfyknchproypdlkmocxnngdoykiiybegdrpkbhgueihamntbdvsswhgfxkkstpygroyaxfybgdngotimdgmjsmnhynbzthyjyaydyrf",
            "ur:provenance/lfaxhdimguonyliaclbwnnytwnjyprkgayleiysslaehdevtnnqzsrtakeonctbnenntsgiavwmtghwlhdkihphdnyaasntldwpysgdpmsrdrkghhhvspttssfesrpemsfjymyzedeutjlvwftjnghbywmjyataosftehkntntolenprchihguwtlywpbgpkosahktkthpseldzeoywsiaftwypkbklydshk",
            "ur:provenance/lfaxhdimfmasgykogmecgduyhyoxfgpeiygwwdrojnrdecuyzccmluksvwldnlndasosaowmgsbtcwlnaxndvyadpakkesmujtskosaerylyecdkckgwoejolpbzbwdiylaehdcypmbzjnwdflpthluykptlselfynssnepyjzctzcfdfgskpfdmrohgamttvebdrtisoettdmwecwjzdkqdpkbyadtnmute",
        ];
        let expected_urls = [
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdimasbdwzyarehpvehpfghsprgrkbnseebnytfggshewlhhlryklamdgepkrnayhykeonfzdkdalabwgoclgwesbyrpectyhhimjnnysogaayvwadrlrnonksbydesbfrihkkwywyttimcetlwzwektgdtnlpcnlneycfktasrfwketnlyktkvylygroeoejkoyhgbdmudwclnnjtgelsvdmelblyht",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdimgolgrsswgujedtiskprkfltilptkjyjtsgdifpbeuehhryvebseevyrpgyemdwoehsfehsldahgdsansfywzknjpfytybtguvlzewlgrlapalrvolupapehyoerlpttnmurhpfkpaxfltsfwtapscalyietdhpchmdhpadnbrlrpnnperpladiiydwlshyselagdketktimwhgntcktoykcarfkt",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdimpyswpkiedehsolcyfwstgysaaddpwfjyvagmlkpmntmundgyhyksutdeluesbzytrslrnspapyyalpeocpfleobedksftagwjyeczteyrpaohfqzpykiecgovtflwkmtayzmplcfkbdkesdalejtwsbkldkgwdrechrpcnttiomscmssnttkpfadvydloybssskkdsqdpawyottngsteasrtndlt",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdimlbstprkorobeveztbbosdrskfrhhtarefyhlrssedsgwtbuemdresglkambndkrdbewsnnwkfpkphydsesemascsptreisssnlqzsbtdmnbkztvdiydmregywnrftimyrosrnbceploskokpttroropazotpnefwhsisldiodemwgucksemszsjzoyvoteytwmiawmsfsbjzqdkihprejegtbzee",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdimcapmyapkimdndlolhgztknaodattlobahkfgrezceyvwloskmumoemgdfllgjytyzsgoyngewnfyhglkswotcxdadyvytodlpezmkskszomkckptkbrpotlygenlsgptcngowktbhhmuvoeomwhnvaskdrpmgonlsnytltinoydsjpaeiabdzsdwoxcwhdzsmotosbjytdtpvewnldmyrogoeoki",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdimfgnsrysgbgmydplptpaxvscwfmbaftkiiewnhkbyvylpfwbewshlcwcphsgecxamgrvtlabdtigwktfwfgglwslbwswtplrdsbtpaydlmhvajprezcntbsjkdelnsscnwkgdtljkdkihsbcybbfwvoglbgjzoxhpmkaxprkshtrtinwlswgmldosbagsyktofnhswldrsrdikidkbywljynloxse",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdimfgredtgroekskbtajnsebskkotuedelohlemoluoaslyuooefzvdwneyglmwonmkdpvegesntogrurstmoimahbgehjkknmkrkgdnszoonfxdesgvlkepdfwcfdkttgtjottyauronbezmkpnnfhvoisttqdpruejlmncsuejneylabygljzhsseghrdwdcacwgudmhpldyktimyregtlubachgy",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdimdmgolbwdfrsehytyuelrmysomonyrhpfhkzskidyoyfxjecttaolrffstyrtleamnleebscazmytmuindrgojontmoeyctkndavszmbtwtjziojyfdrpttfyknchproypdlkmocxnngdoykiiybegdrpkbhgueihamntbdvsswhgfxkkstpygroyaxfybgdngotimdgmjsmnhynbzthyishgnndl",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdimguonyliaclbwnnytwnjyprkgayleiysslaehdevtnnqzsrtakeonctbnenntsgiavwmtghwlhdkihphdnyaasntldwpysgdpmsrdrkghhhvspttssfesrpemsfjymyzedeutjlvwftjnghbywmjyataosftehkntntolenprchihguwtlywpbgpkosahktkthpseldzeoywsiaftwypkcmuelosg",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdimfmasgykogmecgduyhyoxfgpeiygwwdrojnrdecuyzccmluksvwldnlndasosaowmgsbtcwlnaxndvyadpakkesmujtskosaerylyecdkckgwoejolpbzbwdiylaehdcypmbzjnwdflpthluykptlselfynssnepyjzctzcfdfgskpfdmrohgamttvebdrtisoettdmwecwjzdkqdpkbycalpfsfz",
        ];

        run_test(
            ProvenanceMarkResolution::High,
            false,
            &expected_display,
            &expected_debug,
            &expected_bytewords,
            &expected_id_words,
            &expected_bytemoji_ids,
            &expected_urs,
            &expected_urls,
        );
    }

    #[test]
    fn test_high_with_info() {
        let expected_display = [
            "ProvenanceMark(0c6b0c1b)",
            "ProvenanceMark(f172222a)",
            "ProvenanceMark(6da569b9)",
            "ProvenanceMark(10e6c12f)",
            "ProvenanceMark(6e4641df)",
            "ProvenanceMark(d99c321d)",
            "ProvenanceMark(1af31098)",
            "ProvenanceMark(111904ac)",
            "ProvenanceMark(4cfc564c)",
            "ProvenanceMark(1e5bd360)",
        ];
        let expected_debug = [
            r#"ProvenanceMark(key: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, hash: 0c6b0c1b5456dc960c9030f60474b317eade25621cd2fe5c6e70d5dd235c9480, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 0, date: 2023-06-20T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 558dbfc6536b296875bb47d085cf746eca274110de5cbde40f34e1b651372ca2, hash: f172222a21b23fb87eb3a6f50eda0b7e2c2e1a3d9f7ce9ad37d69049742f53bb, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 1, date: 2023-06-21T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: abc6aa642861a61a42c751c2012df374e6528cad9d939b515e78dd288b3915f9, hash: 6da569b9f34ab28134d1417c4167293ec75bd825e773940208be0e378ab3591a, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 2, date: 2023-06-22T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 7fc7b276b810e4fc14a72ac53b5cd9b5445dbfc1264fd6de95b5ca8c060c24ba, hash: 10e6c12f1d64129ad8decf1e568a4ee974a4e8182673253ca8f657b5619cddee, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 3, date: 2023-06-23T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 1dadf8aa6a2b2fa657fc7a0225d1880e5946b5fd32e588c593923750478d74d4, hash: 6e4641df3c26057c5edff653bdfca67bfdc9a9fe74e6e6a5746af48e4fd78ee2, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 4, date: 2023-06-24T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 469cbdca128f2d85d803e81b3e0e3a7d64f15911e1854210ef5d1b22614a2006, hash: d99c321d11167179a24d4a57351c032c134f03df761b83fc74662b9805450367, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 5, date: 2023-06-25T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 46b5294ba2787ed96dc10f79a3de28885d37a6dc0981dca240e7f1324e94a598, hash: 1af31098e6b27a35c492d5fc0b6106108183627a3d8a97d8eeb1271bbcadbfb4, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 6, date: 2023-06-26T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 2e557fea3bc15ed4de848fc9929ab9b059fa7d30a1436b1fd9a6bc3dd4c08a06, hash: 111904ac8f50db2bd1e482b415562aec37fd7f022618a73593973046ae5007b0, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 7, date: 2023-06-27T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 53a5f76321139ef9f174b27b088a66c4803128e09eb4c3d97ca51f0c369dca63, hash: 4cfc564c0d863a843ddb014681a813e98cc7126985f6958bdc14bf01acc38997, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 8, date: 2023-06-28T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
            r#"ProvenanceMark(key: 3e095176523550db5ea446af664feab86dba35dbfd168b78e589999b09a702eb, hash: 1e5bd360d448c43b08941028e5154aae2c29d6d3c3bc08869f298465ba77d77a, chainID: 090bf2f8b55be45b4661b24b7e9c340cf9464c5fe95c84f580954aaabe085e7c, seq: 9, date: 2023-06-29T12:00:00Z, info: "Lorem ipsum sit dolor amet.")"#,
        ];
        let expected_bytewords = [
            "axis bald whiz yoga race help vibe help frog huts purr gear knob news edge barn yurt frog gems hope wall high liar yank lava mild game peck ruin away holy kite open fizz dark data lava brew gyro curl glow eyes body ramp epic tiny high item join navy solo gala away view acid real ruin open keys body dice stub fair inch yurt hill aunt toil calm task owls pool swan legs cusp plus edge iron tied lamb grim leaf keno stub code easy deli safe iron hard gems jolt flap days runs hawk hang bald menu draw curl noon jolt game legs void solo lazy zone unit judo limp yoga luck kick numb undo oboe code edge zone yank time note surf king blue waxy exit item gear holy zest good good pool wasp tomb huts",
            "gyro lung runs skew guru jade diet iris keep rock fuel taxi limp task jury jolt song deli flap blue urge high ruby vibe bias edge very ramp gray exam draw oboe huts free huts loud arch good saga news foxy whiz kiln jump foxy tiny belt guru vial zone wall gear lava puma liar veto luau puma pose holy oboe real part twin owls bald tent lazy peck lung leaf gush judo kiwi hill arch song list exit jazz yoga zaps saga love rich quad onyx deli keno vibe jade open nail rich slot vast lava good kite task taxi meow hang next cook taco guru user unit cook lava quiz mild keys sets high keys drum also item city duty zaps purr navy game poem quiz soap webs race hawk bias holy monk hard city logo ugly",
            "play skew peck idle dice huts oval city flew slot gray saga acid drop wolf jury visa grim luck poem next menu need gray holy keys unit dice luau eyes buzz yurt runs liar news puma play yoga limp echo cusp fuel echo blue dark surf tuna glow jury epic zest easy ramp also half quiz play kiwi epic gyro vast fuel work mint foxy free memo taxi what nail quiz paid duty stub peck tiny kick down cash song numb join hill glow tied user days cusp dull unit zone pose zone cusp zinc pose sets kick days quad puma waxy omit twin gems time need stub real join mild luau cola toil eyes down zone stub view slot oboe fizz acid kite into open lamb ruby hard wall toys obey loud drum main paid gush view next",
            "lamb slot purr keno redo blue vibe zest bulb owls door silk fair high tuna race foxy hill runs safe days glow tomb urge mild race song luck atom barn dark road blue webs noon work flap keep holy days eyes exam axis cats part race iris sets nail quiz stub tied main back zest void inky drum race gray when roof taxi many guru flew nail diet iris inch dice quad axis junk silk task cyan main fizz maze legs easy yank beta lazy into luau good kiwi when inky keno buzz data echo undo warm idea warm surf stub jazz quad kiwi help race chef yurt back item lava acid stub judo surf figs door navy lion gush race deli gems zest very main beta owls cola tent poem into real grim cats gala road fizz inky",
            "cola poem yoga peck item down dull oval hang zest kiln also data tent logo beta hawk frog race zinc easy view logo silk menu memo exam good fuel lung jury tiny zaps gyro yawn game when foxy hang luck skew omit crux data duty very taco dull pose zoom keys keys zero monk cook part knob ramp omit lazy game nail song part knob undo yank crux fern yurt very vial next gush nail kick legs atom love edge visa iris roof vial rust yurt taxi redo liar junk lazy exam curl toil noon jowl memo taco stub jury tied trip vibe when loud many holy puma join peck dull brew barn very dull list curl road deli film fair obey heat toil game fair safe ugly fund vial math aqua kick toil twin cola gear high work",
            "frog news ruby song brag many drop limp trip apex vows claw film beta fact kiwi idle when hawk body very limp flew blue webs hill claw cusp huts game crux atom gear vast lava bald taxi glow kept flew frog girl webs lamb webs what pool road stub trip away dull math visa jump race zinc next bias junk dice lion sets cyan rock easy pose dark slot zoom swan open unit memo yank maze yoga real flap rust saga code kiln girl luck slot lamb love next down also twin claw numb girl jowl fern huts wall door scar deli kiwi dark body wall zinc kiwi hill fact fair dice edge grim cola oboe taxi edge lion flew tuna knob days zoom claw knob flap solo down free when ramp road miss zaps memo jazz diet twin",
            "frog race diet gear oboe keys knob tuna join safe bias kick omit urge dice logo hill exam oval undo axis lazy undo oboe fizz void when easy girl meow open monk drop vibe game swan taco gear user slot memo item arch brag each junk kiln monk rock good news zero open flux dice song vial kite paid flew chef dark tent gift wolf cash list navy real kept nail owls tied door toil user legs door tuna work zero also kick tomb puff crux stub foxy idle obey legs open very zone heat tomb claw guru drum help loud yank taxi many race gift puff hang girl whiz lung skew flap huts fact vial main each city ramp poem fuel grim rock twin calm able cats easy keno sets open aqua peck cost belt cola quad jazz",
            "drum gyro lamb wand fair safe holy tiny urge liar many solo memo navy rich puff hawk zaps kiwi duty obey flux jade cost tuna oval roof figs tiny rust love atom nail edge bias cola zoom yurt menu iron door gyro judo next memo easy cost kiln data vows zoom belt what jazz into jury fund ramp tent foxy kiln cash purr obey blue list main knob yawn poem obey tied iced kick ruin cusp quad iris blue foxy hawk down city memo wall next exit even cola many song bulb item toys undo fact gyro taxi mild grim jugs main holy numb zest holy pool film keys arch inky play zero foxy cyan main lazy diet data good gems huts monk kept kiln void into void buzz rich tiny cola jade exam luck soap jowl cash iris",
            "guru open yell idea curl brew noon yurt when jury purr king away love inky sets lava each dice vast noon quiz scar tuna kite open cost barn even next song idea view mint gush wall hard kiwi help hard navy aqua swan toil draw play song drop miss road rock gush high vows part toys surf eyes ramp exam surf jury many zone scar ruin menu mint zinc oval vial meow keno many jazz vows acid bald deli gyro skew dull brew vast race wave quad tuna real also drum down down lazy hope blue help safe loud zone obey webs idea fact waxy peck fizz yank main legs atom kept data time vast pool fish lung silk jazz vows scar edge obey good math oboe code user draw gear tomb flux main next kick silk main yank",
            "film axis gray keno grim epic good ugly holy onyx frog pose inky glow wand redo join road epic ugly zinc calm luau keys view loud nail need axis owls also warm gems belt claw lion apex need very acid puma kick eyes menu jolt silk owls able ruby lazy epic dark cook glow oboe judo limp buzz brew deli yell able hard city saga cook ramp need open diet keep junk chef lazy tent surf also gray claw guru crux jowl meow visa oboe acid fuel skew flap wave dice judo idea zest city view oboe tent drum wave claw jazz dark quad peck body silk back puff jugs exit down wall user duty gems luck unit pose cost wasp dice swan epic lamb half miss idea chef luck ugly ramp unit soap tent rust taco iced maze",
        ];
        let expected_id_words = [
            "BARN JADE BARN CLAW",
            "WHEN JUMP CUSP DOOR",
            "JOIN OPEN IRON RICH",
            "BLUE VISA SAFE DULL",
            "JOLT FROG FLAP USER",
            "TUNA NEWS EASY COLA",
            "CITY WOLF BLUE MONK",
            "BODY CHEF AQUA PLUS",
            "GEMS ZEST HALF GEMS",
            "COOK HELP TIME HORN",
        ];
        let expected_bytemoji_ids = [
            "๐Ÿคฉ ๐ŸŒน ๐Ÿคฉ ๐Ÿฅบ",
            "๐Ÿž ๐Ÿ’ง ๐Ÿ‘บ ๐Ÿ™€",
            "๐ŸŒผ ๐Ÿ“ซ ๐Ÿ ๐Ÿซ–",
            "๐Ÿฅต ๐Ÿต ๐Ÿˆ ๐Ÿค",
            "๐ŸŒป ๐Ÿ‘ ๐Ÿ‰ ๐Ÿผ",
            "๐Ÿถ ๐ŸŽ  ๐Ÿ‘ˆ ๐Ÿค‘",
            "๐Ÿฅณ ๐Ÿบ ๐Ÿฅต ๐Ÿšฆ",
            "๐Ÿฅถ ๐Ÿคก ๐Ÿ™„ ๐Ÿ“ท",
            "๐Ÿ… ๐Ÿฆญ ๐Ÿ— ๐Ÿ…",
            "๐Ÿ™ƒ ๐ŸŒฎ ๐Ÿ‘Ÿ ๐Ÿš",
        ];
        let expected_urs = [
            "ur:provenance/lfaxhdltasbdwzyarehpvehpfghsprgrkbnseebnytfggshewlhhlryklamdgepkrnayhykeonfzdkdalabwgoclgwesbyrpectyhhimjnnysogaayvwadrlrnonksbydesbfrihythlattlcmtkosplsnlscppseeintdlbgmlfkosbceeydiseinhdgsjtfpdsrshkhgbdmudwclnnjtgelsvdsolyzeutjolpyalkkknbuooeceeezeyktenesfkgbewyetimgrhyztgdgdmsemvdah",
            "ur:provenance/lfaxhdltgolgrsswgujedtiskprkfltilptkjyjtsgdifpbeuehhryvebseevyrpgyemdwoehsfehsldahgdsansfywzknjpfytybtguvlzewlgrlapalrvolupapehyoerlpttnosbdttlypklglfghjokihlahsgltetjzyazssalerhqdoxdikovejeonnlrhstvtlagdketktimwhgntcktoguurutcklaqzmdkssshhksdmaoimcydyzsprnygepmqzspwsrehkbshymkhsserhrs",
            "ur:provenance/lfaxhdltpyswpkiedehsolcyfwstgysaaddpwfjyvagmlkpmntmundgyhyksutdeluesbzytrslrnspapyyalpeocpfleobedksftagwjyeczteyrpaohfqzpykiecgovtflwkmtfyfemotiwtnlqzpddysbpktykkdnchsgnbjnhlgwtdurdscpdlutzepezecpzcpesskkdsqdpawyottngstendsbrljnmdlucatlesdnzesbvwstoefzadkeioonlbryhdwltsoylddmmnmemytyyt",
            "ur:provenance/lfaxhdltlbstprkorobeveztbbosdrskfrhhtarefyhlrssedsgwtbuemdresglkambndkrdbewsnnwkfpkphydsesemascsptreisssnlqzsbtdmnbkztvdiydmregywnrftimygufwnldtisihdeqdasjksktkcnmnfzmelseyykbalyiolugdkiwniykobzdaeouowmiawmsfsbjzqdkihprecfytbkimlaadsbjosffsdrnylnghredigsztvymnbaoscattpmiorlgmcsjohsjsao",
            "ur:provenance/lfaxhdltcapmyapkimdndlolhgztknaodattlobahkfgrezceyvwloskmumoemgdfllgjytyzsgoyngewnfyhglkswotcxdadyvytodlpezmkskszomkckptkbrpotlygenlsgptkbuoykcxfnytvyvlntghnlkklsamleeevaisrfvlrtyttirolrjklyemcltlnnjlmotosbjytdtpvewnldmyhypajnpkdlbwbnvydlltclrddifmfroyhttlgefrseuyfdvlmhaakktltndkmhjnmh",
            "ur:provenance/lfaxhdltfgnsrysgbgmydplptpaxvscwfmbaftkiiewnhkbyvylpfwbewshlcwcphsgecxamgrvtlabdtigwktfwfgglwslbwswtplrdsbtpaydlmhvajprezcntbsjkdelnsscnrkeypedkstzmsnonutmoykmeyarlfprtsacekngllkstlblentdnaotncwnbgljlfnhswldrsrdikidkbywlzckihlftfrdeeegmcaoetieelnfwtakbdszmcwkbfpsodnfewnrprdmszspyrlcsrn",
            "ur:provenance/lfaxhdltfgredtgroekskbtajnsebskkotuedelohlemoluoaslyuooefzvdwneyglmwonmkdpvegesntogrurstmoimahbgehjkknmkrkgdnszoonfxdesgvlkepdfwcfdkttgtwfchltnyrlktnlostddrtlurlsdrtawkzoaokktbpfcxsbfyieoylsonvyzehttbcwgudmhpldyktimyregtpfhgglwzlgswfphsftvlmnehcyrppmflgmrktncmaecseykossonaapkcteeswlfay",
            "ur:provenance/lfaxhdltdmgolbwdfrsehytyuelrmysomonyrhpfhkzskidyoyfxjecttaolrffstyrtleamnleebscazmytmuindrgojontmoeyctkndavszmbtwtjziojyfdrpttfyknchproybeltmnkbynpmoytdidkkrncpqdisbefyhkdncymowlntetencamysgbbimtsuoftgotimdgmjsmnhynbzthyplfmksahiypyzofycnmnlydtdagdgshsmkktknvdiovdbzrhtycajeemlkwnqzdsbn",
            "ur:provenance/lfaxhdltguonyliaclbwnnytwnjyprkgayleiysslaehdevtnnqzsrtakeonctbnenntsgiavwmtghwlhdkihphdnyaasntldwpysgdpmsrdrkghhhvspttssfesrpemsfjymyzesrrnmumtzcolvlmwkomyjzvsadbddigoswdlbwvtreweqdtarlaodmdndnlyhebehpseldzeoywsiaftwypkfzykmnlsamktdatevtplfhlgskjzvssreeoygdmhoeceurdwgrtbfxmnntfzckrsme",
            "ur:provenance/lfaxhdltfmasgykogmecgduyhyoxfgpeiygwwdrojnrdecuyzccmluksvwldnlndasosaowmgsbtcwlnaxndvyadpakkesmujtskosaerylyecdkckgwoejolpbzbwdiylaehdcysackrpndondtkpjkcflyttsfaogycwgucxjlmwvaoeadflswfpwedejoiaztcyvwoettdmwecwjzdkqdpkbyskbkpfjsetdnwlurdygslkutpectwpdesneclbhfmsiacflkuyrputspttytbzguyk",
        ];
        let expected_urls = [
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdltasbdwzyarehpvehpfghsprgrkbnseebnytfggshewlhhlryklamdgepkrnayhykeonfzdkdalabwgoclgwesbyrpectyhhimjnnysogaayvwadrlrnonksbydesbfrihythlattlcmtkosplsnlscppseeintdlbgmlfkosbceeydiseinhdgsjtfpdsrshkhgbdmudwclnnjtgelsvdsolyzeutjolpyalkkknbuooeceeezeyktenesfkgbewyetimgrhyztgdgdlrpdstbg",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdltgolgrsswgujedtiskprkfltilptkjyjtsgdifpbeuehhryvebseevyrpgyemdwoehsfehsldahgdsansfywzknjpfytybtguvlzewlgrlapalrvolupapehyoerlpttnosbdttlypklglfghjokihlahsgltetjzyazssalerhqdoxdikovejeonnlrhstvtlagdketktimwhgntcktoguurutcklaqzmdkssshhksdmaoimcydyzsprnygepmqzspwsrehkbshymkjphynlpd",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdltpyswpkiedehsolcyfwstgysaaddpwfjyvagmlkpmntmundgyhyksutdeluesbzytrslrnspapyyalpeocpfleobedksftagwjyeczteyrpaohfqzpykiecgovtflwkmtfyfemotiwtnlqzpddysbpktykkdnchsgnbjnhlgwtdurdscpdlutzepezecpzcpesskkdsqdpawyottngstendsbrljnmdlucatlesdnzesbvwstoefzadkeioonlbryhdwltsoylddmmnlfbewkwy",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdltlbstprkorobeveztbbosdrskfrhhtarefyhlrssedsgwtbuemdresglkambndkrdbewsnnwkfpkphydsesemascsptreisssnlqzsbtdmnbkztvdiydmregywnrftimygufwnldtisihdeqdasjksktkcnmnfzmelseyykbalyiolugdkiwniykobzdaeouowmiawmsfsbjzqdkihprecfytbkimlaadsbjosffsdrnylnghredigsztvymnbaoscattpmiorlgmcsiazegybz",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdltcapmyapkimdndlolhgztknaodattlobahkfgrezceyvwloskmumoemgdfllgjytyzsgoyngewnfyhglkswotcxdadyvytodlpezmkskszomkckptkbrpotlygenlsgptkbuoykcxfnytvyvlntghnlkklsamleeevaisrfvlrtyttirolrjklyemcltlnnjlmotosbjytdtpvewnldmyhypajnpkdlbwbnvydlltclrddifmfroyhttlgefrseuyfdvlmhaakktltnembsgtlt",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdltfgnsrysgbgmydplptpaxvscwfmbaftkiiewnhkbyvylpfwbewshlcwcphsgecxamgrvtlabdtigwktfwfgglwslbwswtplrdsbtpaydlmhvajprezcntbsjkdelnsscnrkeypedkstzmsnonutmoykmeyarlfprtsacekngllkstlblentdnaotncwnbgljlfnhswldrsrdikidkbywlzckihlftfrdeeegmcaoetieelnfwtakbdszmcwkbfpsodnfewnrprdmszsrodeetpt",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdltfgredtgroekskbtajnsebskkotuedelohlemoluoaslyuooefzvdwneyglmwonmkdpvegesntogrurstmoimahbgehjkknmkrkgdnszoonfxdesgvlkepdfwcfdkttgtwfchltnyrlktnlostddrtlurlsdrtawkzoaokktbpfcxsbfyieoylsonvyzehttbcwgudmhpldyktimyregtpfhgglwzlgswfphsftvlmnehcyrppmflgmrktncmaecseykossonaapkctdihkoect",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdltdmgolbwdfrsehytyuelrmysomonyrhpfhkzskidyoyfxjecttaolrffstyrtleamnleebscazmytmuindrgojontmoeyctkndavszmbtwtjziojyfdrpttfyknchproybeltmnkbynpmoytdidkkrncpqdisbefyhkdncymowlntetencamysgbbimtsuoftgotimdgmjsmnhynbzthyplfmksahiypyzofycnmnlydtdagdgshsmkktknvdiovdbzrhtycajeemlkvodnamcw",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdltguonyliaclbwnnytwnjyprkgayleiysslaehdevtnnqzsrtakeonctbnenntsgiavwmtghwlhdkihphdnyaasntldwpysgdpmsrdrkghhhvspttssfesrpemsfjymyzesrrnmumtzcolvlmwkomyjzvsadbddigoswdlbwvtreweqdtarlaodmdndnlyhebehpseldzeoywsiaftwypkfzykmnlsamktdatevtplfhlgskjzvssreeoygdmhoeceurdwgrtbfxmnntgulyneln",
            "https://example.com/validate?provenance=tngdgmgwhflfaxhdltfmasgykogmecgduyhyoxfgpeiygwwdrojnrdecuyzccmluksvwldnlndasosaowmgsbtcwlnaxndvyadpakkesmujtskosaerylyecdkckgwoejolpbzbwdiylaehdcysackrpndondtkpjkcflyttsfaogycwgucxjlmwvaoeadflswfpwedejoiaztcyvwoettdmwecwjzdkqdpkbyskbkpfjsetdnwlurdygslkutpectwpdesneclbhfmsiacflkuyrputspttwdlejkvo",
        ];

        run_test(
            ProvenanceMarkResolution::High,
            true,
            &expected_display,
            &expected_debug,
            &expected_bytewords,
            &expected_id_words,
            &expected_bytemoji_ids,
            &expected_urs,
            &expected_urls,
        );
    }

    #[test]
    fn test_readme_deps() {
        version_sync::assert_markdown_deps_updated!("README.md");
    }

    #[test]
    fn test_html_root_url() {
        version_sync::assert_html_root_url_updated!("src/lib.rs");
    }
}