LyoKICogIFRFU1QgU1VJVEUgRk9SIE1CL1dDIEZVTkNUSU9OUyBJTiBDIExJQlJBUlkKICoKICoJIEZJTEU6CWRhdF93Y3N0b21icy5jCiAqCiAqCSBXQ1NUT01CUzogIHNpemVfdCB3Y3N0b21icyAoY2hhciAqcywgY29uc3Qgd2NoYXJfdCAqd3MsIHNpemVfdCBuKQogKi8KCgovKgogKiAgQ0FVVElPTjoKICoJICAgICBEbyBub3QgdXNlIGEgdmFsdWUgMHgwMSBmb3Igc3RyaW5nIGRhdGEuIFRoZSB0ZXN0IHByb2dyYW0KICoJICAgICB1c2VzIGl0LgogKgogKi8KCgpUU1RfV0NTVE9NQlMgdHN0X3djc3RvbWJzX2xvYyBbXSA9IHsKICB7CiAgICB7IFR3Y3N0b21icywgVFNUX0xPQ19kZSB9LAogICAgewogICAgICAvKiAjMDEgOiBBbnkgY2hhcnMgaW5jbHVkaW5nIGEgbnVsbCBjaGFyIHNob3VsZCBub3QgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCSAgICAgICB7IDB4MDBDNCwweDAwRDYsMHgwMERDLDB4MDAwMCB9LCAwIH0sCgkvKmV4cGVjdCovIHsgMCwxLDAsCSAiIgkJCQkJICB9LAogICAgICB9LAogICAgICAvKiAjMDIgOiBPbmx5IG9uZSBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuIE5vIG51bGwgdGVybWluYXRpb24uICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCSAgICAgICB7IDB4MDBDNCwweDAwRDYsMHgwMERDLDB4MDAwMCB9LAkxIH0sCgkvKmV4cGVjdCovIHsgMCwxLDEsCSAixCIJCQkJCSAgfSwKICAgICAgfSwKICAgICAgLyogIzAzIDogT25seSB0d28gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiBObyBudWxsIHRlcm1pbmF0aW9uLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAkgICAgICAgeyAweDAwQzQsMHgwMEQ2LDB4MDBEQywweDAwMDAgfSwJMiB9LAoJLypleHBlY3QqLyB7IDAsMSwyLAkgIsTWIgkJCQkJICB9LAogICAgICB9LAogICAgICAvKiAjMDQgOiBPbmx5IHRocmVlIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gTm8gbnVsbAoJICAgICAgIHRlcm1pbmF0aW9uLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAkgICAgICAgeyAweDAwQzQsMHgwMEQ2LDB4MDBEQywweDAwMDAgfSwJMyB9LAoJLypleHBlY3QqLyB7IDAsMSwzLAkgIsTW3CIJCQkJCSAgfSwKICAgICAgfSwKICAgICAgLyogIzA1IDogT25seSB0aHJlZSBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMgd2l0aCBhIG51bGwKCSAgICAgICB0ZXJtaW5hdGlvbi4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJICAgICAgIHsgMHgwMEM0LDB4MDBENiwweDAwREMsMHgwMDAwIH0sCTQgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMywJICLE1twiCQkJCQkgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwNiA6IE9ubHkgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzIHdpdGggYSBudWxsCgkgICAgICAgdGVybWluYXRpb24uICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCSAgICAgICB7IDB4MDBDNCwweDAwRDYsMHgwMERDLDB4MDAwMCB9LAk1IH0sCgkvKmV4cGVjdCovIHsgMCwxLDMsCSAixNbcIgkJCQkJICB9LAogICAgICB9LAogICAgICAvKiAjMDcgOiBJbnZhbGlkIG1iIHNlcXVlbmNlLiBObyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJICAgICAgIHsgMHgwMjAxLDB4MDIyMSwweDAwMDAsMHgwMDAwIH0sCTIgfSwKCS8qZXhwZWN0Ki8geyBFSUxTRVEsMSwoc2l6ZV90KS0xLAkgIiIJCQkgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwOCA6IHMgaXMgYSBudWxsIHBvaW50ZXIsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJICAgICAgIHsgMHgwMEM0LDB4MDBENiwweDAwREMsMHgwMDAwIH0sIDAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMywJICIiCQkJCQkgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwOSA6IHMgaXMgYSBudWxsIHBvaW50ZXIsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJICAgICAgIHsgMHgwMEM0LDB4MDBENiwweDAwREMsMHgwMDAwIH0sIDEgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMywJICIiCQkJCQkgIH0sCiAgICAgIH0sCiAgICAgIC8qICMxMCA6IHMgaXMgYSBudWxsIHBvaW50ZXIsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJICAgICAgIHsgMHgwMEM0LDB4MDBENiwweDAwREMsMHgwMDAwIH0sIDUgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMywJICIiCQkJCQkgIH0sCiAgICAgIH0sCiAgICAgIC8qICMxMSA6IHMgaXMgYSBudWxsIHBvaW50ZXIuIE5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJICAgICAgIHsgMHgwMjAxLDB4MDIyMSwweDAwMDAsMHgwMDAwIH0sIDUgfSwKCS8qZXhwZWN0Ki8geyBFSUxTRVEsMSwoc2l6ZV90KS0xLAkgIiIJCQkgIH0sCiAgICAgIH0sCiAgICAgIC8qICMxMiA6IHdzIGlzIGEgbnVsbCB3YyBzdHJpbmcsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJICAgICAgIHsgMHgwMDAwIH0sCQkJNSB9LAoJLypleHBlY3QqLyB7IDAsMSwwLAkgIiIJCQkJCSAgfSwKICAgICAgfSwKICAgICAgLyogIzEzIDogcyBpcyBhIG51bGwgcG9pbnRlciwgbm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMCwxLAkgICAgICAgeyAweDAwMDAgfSwJCQk1IH0sCgkvKmV4cGVjdCovIHsgMCwxLDAsCSAiIgkJCQkJICB9LAogICAgICB9LAogICAgICB7IC5pc19sYXN0ID0gMSB9CiAgICB9CiAgfSwKICB7CiAgICB7IFR3Y3N0b21icywgVFNUX0xPQ19lblVTIH0sCiAgICB7CiAgICAgIC8qICMwMSA6IEFueSBjaGFycyBpbmNsdWRpbmcgYSBudWxsIGNoYXIgc2hvdWxkIG5vdCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJICAgICAgIHsgMHgwMEM0LDB4MDA0MiwweDAwNDMsMHgwMDAwIH0sCTAgIH0sCgkvKmV4cGVjdCovIHsgMCwxLDAsCSAiIgkJCQkJICAgfSwKICAgICAgfSwKICAgICAgLyogIzAyIDogT25seSBvbmUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiBObyBudWxsIHRlcm1pbmF0aW9uLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAkgICAgICAgeyAweDAwNDEsMHgwMDQyLDB4MDA0MywweDAwMDAgfSwgMSAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMSwJICJBIgkJCQkJICAgfSwKICAgICAgfSwKICAgICAgLyogIzAzIDogT25seSB0d28gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiBObyBudWxsIHRlcm1pbmF0aW9uLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAkgICAgICAgeyAweDAwNDEsMHgwMDQyLDB4MDA0MywweDAwMDAgfSwgMiAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMiwJICJBQiIJCQkJCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwNCA6IE9ubHkgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiBObyBudWxsCgkgICAgICAgdGVybWluYXRpb24uICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCSAgICAgICB7IDB4MDA0MSwweDAwNDIsMHgwMDQzLDB4MDAwMCB9LCAzICB9LAoJLypleHBlY3QqLyB7IDAsMSwzLAkgIkFCQyIJCQkJCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwNSA6IE9ubHkgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzIHdpdGggYSBudWxsCgkgICAgICAgdGVybWluYXRpb24uICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCSAgICAgICB7IDB4MDA0MSwweDAwNDIsMHgwMDQzLDB4MDAwMCB9LCA0ICB9LAoJLypleHBlY3QqLyB7IDAsMSwzLAkgIkFCQyIJCQkJCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwNiA6IE9ubHkgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzIHdpdGggYSBudWxsCgkgICAgICAgdGVybWluYXRpb24uICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCSAgICAgICB7IDB4MDA0MSwweDAwNDIsMHgwMDQzLDB4MDAwMCB9LCA1ICB9LAoJLypleHBlY3QqLyB7IDAsMSwzLAkgIkFCQyIJCQkJCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwNyA6IEludmFsaWQgbWIgc2VxdWVuY2UuIE5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJICAgICAgIHsgMHgwMjAxLDB4MDIyMSwweDAwMDAsMHgwMDAwIH0sIDIgIH0sCgkvKmV4cGVjdCovIHsgRUlMU0VRLDEsKHNpemVfdCktMSwJICIiCQkJICAgfSwKICAgICAgfSwKICAgICAgLyogIzA4IDogcyBpcyBhIG51bGwgcG9pbnRlciwgbm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMCwxLAkgICAgICAgeyAweDAwNDEsMHgwMDQyLDB4MDA0MywweDAwMDAgfSwgMCAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMywJICIiCQkJCQkgICB9LAogICAgICB9LAogICAgICAvKiAjMDkgOiBzIGlzIGEgbnVsbCBwb2ludGVyLCBubyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLDEsCSAgICAgICB7IDB4MDA0MSwweDAwNDIsMHgwMDQzLDB4MDAwMCB9LCAxICB9LAoJLypleHBlY3QqLyB7IDAsMSwzLAkgIiIJCQkJCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMxMCA6IHMgaXMgYSBudWxsIHBvaW50ZXIsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJICAgICAgIHsgMHgwMDQxLDB4MDA0MiwweDAwNDMsMHgwMDAwIH0sIDUgIH0sCgkvKmV4cGVjdCovIHsgMCwxLDMsCSAiIgkJCQkJICAgfSwKICAgICAgfSwKICAgICAgLyogIzExIDogcyBpcyBhIG51bGwgcG9pbnRlci4gTm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMCwxLAkgICAgICAgeyAweDAyMDEsMHgwMjIxLDB4MDAwMCwweDAwMDAgfSwgNSAgfSwKCS8qZXhwZWN0Ki8geyBFSUxTRVEsMSwoc2l6ZV90KS0xLAkgIiIJCQkgICB9LAogICAgICB9LAogICAgICAvKiAjMTIgOiB3cyBpcyBhIG51bGwgd2Mgc3RyaW5nLCBubyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCSAgICAgICB7IDB4MDAwMCB9LAkJCTUsIH0sCgkvKmV4cGVjdCovIHsgMCwxLDAsCSAiIgkJCSAgICAgICAgICAgICAgICAgICB9LAogICAgICB9LAogICAgICAvKiAjMTMgOiBzIGlzIGEgbnVsbCBwb2ludGVyLCBubyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLDEsCSAgICAgICB7IDB4MDAwMCB9LAkJCTUgIH0sCgkvKmV4cGVjdCovIHsgMCwxLDAsCSAiIgkJCQkJICAgfSwKICAgICAgfSwKICAgICAgeyAuaXNfbGFzdCA9IDEgfQogICAgfQogIH0sCiAgewogICAgeyBUd2NzdG9tYnMsIFRTVF9MT0NfZXVjSlAgfSwKICAgIHsKCiAgICAgIC8qICMwMSA6IEFueSBjaGFycyBpbmNsdWRpbmcgYSBudWxsIGNoYXIgc2hvdWxkIG5vdCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJICAgICAgIHsgMHgzMDQyLDB4MzA0NCwweEZGNzMsMHgwMDAwIH0sIDAgIH0sCgkvKmV4cGVjdCovIHsgMCwxLDAsCSAiIgkJCQkJICAgfSwKICAgICAgfSwKICAgICAgLyogIzAyIDogT25seSBvbmUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiBObyBudWxsIHRlcm1pbmF0aW9uLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAkgICAgICAgeyAweDMwNDIsMHgzMDQ0LDB4RkY3MywweDAwMDAgfSwgMiAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMiwJICAgICAiXDI0NFwyNDIiCQkJCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwMyA6IE9ubHkgdHdvIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gTm8gbnVsbCB0ZXJtaW5hdGlvbi4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJICAgICAgIHsgMHgzMDQyLDB4MzA0NCwweEZGNzMsMHgwMDAwIH0sIDQgIH0sCgkvKmV4cGVjdCovIHsgMCwxLDQsCSAgICAgIlwyNDRcMjQyXDI0NFwyNDQiCQkJICAgfSwKICAgICAgfSwKICAgICAgLyogIzA0IDogT25seSB0aHJlZSBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuIE5vIG51bGwKCSAgICAgICB0ZXJtaW5hdGlvbi4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJICAgICAgIHsgMHgzMDQyLDB4MzA0NCwweEZGNzMsMHgwMDAwIH0sIDYgIH0sCgkvKmV4cGVjdCovIHsgMCwxLDYsCSAgICAgIlwyNDRcMjQyXDI0NFwyNDRcMjE2XDI2MyIJCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwNSA6IE9ubHkgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzIHdpdGggYSBudWxsCgkgICAgICAgdGVybWluYXRpb24uICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCSAgICAgICB7IDB4MzA0MiwweDMwNDQsMHhGRjczLDB4MDAwMCB9LCA3ICB9LAoJLypleHBlY3QqLyB7IDAsMSw2LAkgICAgICJcMjQ0XDI0MlwyNDRcMjQ0XDIxNlwyNjMiCQkgICB9LAogICAgICB9LAogICAgICAvKiAjMDYgOiBPbmx5IHRocmVlIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcyB3aXRoIGEgbnVsbAoJICAgICAgIHRlcm1pbmF0aW9uLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAkgICAgICAgeyAweDMwNDIsMHgzMDQ0LDB4RkY3MywweDAwMDAgfSwgOCAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsNiwJICAgICAiXDI0NFwyNDJcMjQ0XDI0NFwyMTZcMjYzIgkJICAgfSwKICAgICAgfSwKICAgICAgLyogIzA3IDogSW52YWxpZCBtYiBzZXF1ZW5jZS4gTm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAkgICAgICAgeyAweDAyMDEsMHgwMjIxLDB4MDAwMCwweDAwMDAgfSwgMiAgfSwKCS8qZXhwZWN0Ki8geyBFSUxTRVEsMSwtMSwJICIiCQkJCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwOCA6IHMgaXMgYSBudWxsIHBvaW50ZXIsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJICAgICAgIHsgMHgzMDQyLDB4MzA0NCwweEZGNzMsMHgwMDAwIH0sIDAgIH0sCgkvKmV4cGVjdCovIHsgMCwxLDYsCSAiIgkJCQkJICAgfSwKICAgICAgfSwKICAgICAgLyogIzA5IDogcyBpcyBhIG51bGwgcG9pbnRlciwgbm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMCwxLAkgICAgICAgeyAweDMwNDIsMHgzMDQ0LDB4RkY3MywweDAwMDAgfSwgMSAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsNiwJICIiCQkJCQkgICB9LAogICAgICB9LAogICAgICAvKiAjMTAgOiBzIGlzIGEgbnVsbCBwb2ludGVyLCBubyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLDEsCSAgICAgICB7IDB4MzA0MiwweDMwNDQsMHhGRjczLDB4MDAwMCB9LCA4ICB9LAoJLypleHBlY3QqLyB7IDAsMSw2LAkgIiIJCQkJCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMxMSA6IHMgaXMgYSBudWxsIHBvaW50ZXIuIE5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJICAgICAgIHsgMHgwMjAxLDB4MDIyMSwweDAwMDAsMHgwMDAwIH0sIDUgIH0sCgkvKmV4cGVjdCovIHsgRUlMU0VRLDEsKHNpemVfdCktMSwJICIiCQkJICAgfSwKICAgICAgfSwKICAgICAgLyogIzEyIDogd3MgaXMgYSBudWxsIHdjIHN0cmluZywgbm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAkgICAgICAgeyAweDAwMDAgfSwJCQk1ICB9LAoJLypleHBlY3QqLyB7IDAsMSwwLAkgIiIJCQkJCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMxMyA6IHMgaXMgYSBudWxsIHBvaW50ZXIsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJICAgICAgIHsgMHgwMDAwIH0sCQkJNSAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMCwJICIiCQkJCQkgICB9LAogICAgICB9LAogICAgICB7IC5pc19sYXN0ID0gMSB9CiAgICB9CiAgfSwKICB7CiAgICB7IFR3Y3N0b21icywgVFNUX0xPQ19lbmQgfQogIH0KfTsK