From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20096 invoked by alias); 3 Jun 2009 09:39:45 -0000 Received: (qmail 20086 invoked by uid 22791); 3 Jun 2009 09:39:43 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-pz0-f173.google.com (HELO mail-pz0-f173.google.com) (209.85.222.173) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 03 Jun 2009 09:39:37 +0000 Received: by pzk3 with SMTP id 3so6966064pzk.0 for ; Wed, 03 Jun 2009 02:39:35 -0700 (PDT) MIME-Version: 1.0 Received: by 10.142.144.16 with SMTP id r16mr263246wfd.84.1244021974931; Wed, 03 Jun 2009 02:39:34 -0700 (PDT) Date: Wed, 03 Jun 2009 09:39:00 -0000 Message-ID: <31d002d40906030239m3e6708b1xd89105c19105c1ab@mail.gmail.com> Subject: Using a umulhisi3 From: Michael Hope To: gcc@gcc.gnu.org Content-Type: multipart/mixed; boundary=000e0cd32746e89c17046b6e6ff1 X-IsSubscribed: yes Mailing-List: contact gcc-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-owner@gcc.gnu.org X-SW-Source: 2009-06/txt/msg00034.txt.bz2 --000e0cd32746e89c17046b6e6ff1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-length: 3970 Hi there. The architecture I'm working is a 32 bit, word based machine with a 16x16 -> 32 unsigned multiply. For some reason the combine stage is converting the umulhisi3 into a mulsi3 and I'm not sure how to track this down. The test code is part of an alpha blend: void blend(uint8_t* sb, uint8_t* db) { uint16_t ia = 256 - *sb; uint16_t d = *db; *db = ((d * ia) >> 8) + *sb; } I've define the different multiplies in the .md file: (define_insn "umulhisi3" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (zero_extend:SI (match_operand:HI 1 "register_operand" "%r")) (zero_extend:SI (match_operand:HI 2 "register_operand" "r"))))] "" ... (define_insn "mulsi3" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (match_operand:SI 1 "register_operand" "%r") (match_operand:SI 2 "register_operand" "r")))] "" ... Running at -O level optimisations gives the following in umul.157r.outof_cfglayout, just before the combine stage: --- (insn 3 6 4 2 umul.c:16 (set (reg/v/f:SI 28 [ sb ]) (reg:SI 0 R10 [ sb ])) 8 {movsi} (expr_list:REG_DEAD (reg:SI 0 R10 [ sb ]) (nil))) (insn 4 3 5 2 umul.c:16 (set (reg/v/f:SI 29 [ db ]) (reg:SI 1 R11 [ db ])) 8 {movsi} (expr_list:REG_DEAD (reg:SI 1 R11 [ db ]) (nil))) (note 5 4 8 2 NOTE_INSN_FUNCTION_BEG) (insn 8 5 9 2 umul.c:17 (set (reg:SI 26 [ D.1217 ]) (zero_extend:SI (mem:QI (reg/v/f:SI 28 [ sb ]) [0 S1 A8]))) 27 {zero_extendqisi2} (expr_list:REG_DEAD (reg/v/f:SI 28 [ sb ]) (nil))) (insn 9 8 10 2 umul.c:20 (set (reg:HI 30) (const_int 256 [0x100])) 1 {movhi_insn} (nil)) (insn 10 9 11 2 umul.c:20 (set (reg:SI 31) (minus:SI (subreg:SI (reg:HI 30) 0) (reg:SI 26 [ D.1217 ]))) 12 {subsi3} (expr_list:REG_DEAD (reg:HI 30) (nil))) (insn 11 10 12 2 umul.c:20 (set (reg:SI 33) (zero_extend:SI (mem:QI (reg/v/f:SI 29 [ db ]) [0 S1 A8]))) 27 {zero_extendqisi2} (nil)) (insn 12 11 13 2 umul.c:20 (set (reg:HI 32) (subreg:HI (reg:SI 33) 0)) 1 {movhi_insn} (expr_list:REG_DEAD (reg:SI 33) (nil))) (insn 13 12 14 2 umul.c:20 (set (reg:SI 34) (mult:SI (zero_extend:SI (reg:HI 32)) (zero_extend:SI (subreg:HI (reg:SI 31) 0)))) 14 {umulhisi3} (expr_list:REG_DEAD (reg:HI 32) (expr_list:REG_DEAD (reg:SI 31) (nil)))) (insn 14 13 15 2 umul.c:20 (set (reg:SI 35) (ashiftrt:SI (reg:SI 34) (const_int 8 [0x8]))) 21 {ashrsi3_const} (expr_list:REG_DEAD (reg:SI 34) (nil))) (insn 15 14 16 2 umul.c:20 (set (reg:QI 36) (subreg:QI (reg:SI 35) 0)) 0 {movqi_insn} (expr_list:REG_DEAD (reg:SI 35) (nil))) (insn 16 15 17 2 umul.c:20 (set (reg:SI 37) (plus:SI (reg:SI 26 [ D.1217 ]) (subreg:SI (reg:QI 36) 0))) 11 {addsi3} (expr_list:REG_DEAD (reg:QI 36) (expr_list:REG_DEAD (reg:SI 26 [ D.1217 ]) (nil)))) (insn 17 16 0 2 umul.c:20 (set (mem:QI (reg/v/f:SI 29 [ db ]) [0 S1 A8]) (subreg:QI (reg:SI 37) 0)) 0 {movqi_insn} (expr_list:REG_DEAD (reg:SI 37) (expr_list:REG_DEAD (reg/v/f:SI 29 [ db ]) (nil)))) --- The umulhisi3 has been correctly found and used at this stage. In the following combine stage however, it gets converted into a mulsi3. The .combine dump is attached. The xtensa port is the closest match I can find as it is 32 bit, word based, and has the umulhisi3. It correctly keeps the 16 bit multiply. Some other test cases like: uint32_t mul(uint16_t a, uint16_t b) { return a*b; } come through fine. It might be something to do with the memory access. How does the combine stage work? It looks like it could get multiple potential matches for a set of RTLs. Does it use some type of costing function to pick between them? Can I tell combine that a umulhisi3 is cheaper than a mulsi3? Thanks for the earlier help on the post reload split to use the accumulator - it's working well. -- Michael --000e0cd32746e89c17046b6e6ff1 Content-Type: application/octet-stream; name="umul.i.159r.combine" Content-Disposition: attachment; filename="umul.i.159r.combine" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fvhugh0y0 Content-length: 24311 Cjs7IEZ1bmN0aW9uIGJsZW5kIChibGVuZCkKCnN0YXJ0aW5nIHRoZSBwcm9j ZXNzaW5nIG9mIGRlZmVycmVkIGluc25zCmVuZGluZyB0aGUgcHJvY2Vzc2lu ZyBvZiBkZWZlcnJlZCBpbnNucwpkZl9hbmFseXplIGNhbGxlZAppbnNuX2Nv c3QgMzogNAppbnNuX2Nvc3QgNDogNAppbnNuX2Nvc3QgODogOAppbnNuX2Nv c3QgOTogMTIKaW5zbl9jb3N0IDEwOiAxMgppbnNuX2Nvc3QgMTE6IDgKaW5z bl9jb3N0IDEyOiA0Cmluc25fY29zdCAxMzogNDAKaW5zbl9jb3N0IDE0OiAy MAppbnNuX2Nvc3QgMTU6IDQKaW5zbl9jb3N0IDE2OiA0Cmluc25fY29zdCAx NzogNApTdWNjZXNzZnVsbHkgbWF0Y2hlZCB0aGlzIGluc3RydWN0aW9uOgoo c2V0IChyZWc6U0kgMjYgWyBELjEyMTcgXSkKICAgICh6ZXJvX2V4dGVuZDpT SSAobWVtOlFJIChyZWc6U0kgMCBSMTAgWyBzYiBdKSBbMCBTMSBBOF0pKSkK ZGVmZXJyaW5nIGRlbGV0aW9uIG9mIGluc24gd2l0aCB1aWQgPSAzLgptb2Rp ZnlpbmcgaW5zbiBpMyAgICAgOCByMjY6U0k9emVyb19leHRlbmQoW1IxMDpT SV0pCiAgICAgIFJFR19ERUFEOiBSMTA6U0kKZGVmZXJyaW5nIHJlc2NhbiBp bnNuIHdpdGggdWlkID0gOC4KRmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5zdHJ1 Y3Rpb246CihwYXJhbGxlbCBbCiAgICAgICAgKHNldCAocmVnOlNJIDMxKQog ICAgICAgICAgICAobWludXM6U0kgKHN1YnJlZzpTSSAocmVnOkhJIDMwKSAw KQogICAgICAgICAgICAgICAgKHN1YnJlZzpTSSAobWVtOlFJIChyZWc6U0kg MCBSMTAgWyBzYiBdKSBbMCBTMSBBOF0pIDApKSkKICAgICAgICAoc2V0IChy ZWc6U0kgMjYgWyBELjEyMTcgXSkKICAgICAgICAgICAgKHplcm9fZXh0ZW5k OlNJIChtZW06UUkgKHJlZzpTSSAwIFIxMCBbIHNiIF0pIFswIFMxIEE4XSkp KQogICAgXSkKRmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5zdHJ1Y3Rpb246Cihw YXJhbGxlbCBbCiAgICAgICAgKHNldCAocmVnOlNJIDMxKQogICAgICAgICAg ICAobWludXM6U0kgKHN1YnJlZzpTSSAocmVnOkhJIDMwKSAwKQogICAgICAg ICAgICAgICAgKHN1YnJlZzpTSSAobWVtOlFJIChyZWc6U0kgMCBSMTAgWyBz YiBdKSBbMCBTMSBBOF0pIDApKSkKICAgICAgICAoc2V0IChyZWc6U0kgMjYg WyBELjEyMTcgXSkKICAgICAgICAgICAgKHplcm9fZXh0ZW5kOlNJIChtZW06 UUkgKHJlZzpTSSAwIFIxMCBbIHNiIF0pIFswIFMxIEE4XSkpKQogICAgXSkK RmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5zdHJ1Y3Rpb246CihzZXQgKHJlZzpT SSAzMSkKICAgIChtaW51czpTSSAoY29uc3RfaW50IDI1NiBbMHgxMDBdKQog ICAgICAgIChyZWc6U0kgMjYgWyBELjEyMTcgXSkpKQpGYWlsZWQgdG8gbWF0 Y2ggdGhpcyBpbnN0cnVjdGlvbjoKKHBhcmFsbGVsIFsKICAgICAgICAoc2V0 IChyZWc6U0kgMzEpCiAgICAgICAgICAgIChtaW51czpTSSAoY29uc3RfaW50 IDI1NiBbMHgxMDBdKQogICAgICAgICAgICAgICAgKHN1YnJlZzpTSSAobWVt OlFJIChyZWc6U0kgMCBSMTAgWyBzYiBdKSBbMCBTMSBBOF0pIDApKSkKICAg ICAgICAoc2V0IChyZWc6U0kgMjYgWyBELjEyMTcgXSkKICAgICAgICAgICAg KHplcm9fZXh0ZW5kOlNJIChtZW06UUkgKHJlZzpTSSAwIFIxMCBbIHNiIF0p IFswIFMxIEE4XSkpKQogICAgXSkKRmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5z dHJ1Y3Rpb246CihwYXJhbGxlbCBbCiAgICAgICAgKHNldCAocmVnOlNJIDMx KQogICAgICAgICAgICAobWludXM6U0kgKGNvbnN0X2ludCAyNTYgWzB4MTAw XSkKICAgICAgICAgICAgICAgIChzdWJyZWc6U0kgKG1lbTpRSSAocmVnOlNJ IDAgUjEwIFsgc2IgXSkgWzAgUzEgQThdKSAwKSkpCiAgICAgICAgKHNldCAo cmVnOlNJIDI2IFsgRC4xMjE3IF0pCiAgICAgICAgICAgICh6ZXJvX2V4dGVu ZDpTSSAobWVtOlFJIChyZWc6U0kgMCBSMTAgWyBzYiBdKSBbMCBTMSBBOF0p KSkKICAgIF0pClN1Y2Nlc3NmdWxseSBtYXRjaGVkIHRoaXMgaW5zdHJ1Y3Rp b246CihzZXQgKHJlZzpTSSAyNiBbIEQuMTIxNyBdKQogICAgKHplcm9fZXh0 ZW5kOlNJIChtZW06UUkgKHJlZzpTSSAwIFIxMCBbIHNiIF0pIFswIFMxIEE4 XSkpKQpGYWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlvbjoKKHNldCAo cmVnOlNJIDMxKQogICAgKG1pbnVzOlNJIChjb25zdF9pbnQgMjU2IFsweDEw MF0pCiAgICAgICAgKHN1YnJlZzpTSSAobWVtOlFJIChyZWc6U0kgMCBSMTAg WyBzYiBdKSBbMCBTMSBBOF0pIDApKSkKRmFpbGVkIHRvIG1hdGNoIHRoaXMg aW5zdHJ1Y3Rpb246CihwYXJhbGxlbCBbCiAgICAgICAgKHNldCAocmVnOlNJ IDMzKQogICAgICAgICAgICAoemVyb19leHRlbmQ6U0kgKG1lbTpRSSAocmVn OlNJIDEgUjExIFsgZGIgXSkgWzAgUzEgQThdKSkpCiAgICAgICAgKHNldCAo cmVnL3YvZjpTSSAyOSBbIGRiIF0pCiAgICAgICAgICAgIChyZWc6U0kgMSBS MTEgWyBkYiBdKSkKICAgIF0pCkZhaWxlZCB0byBtYXRjaCB0aGlzIGluc3Ry dWN0aW9uOgoocGFyYWxsZWwgWwogICAgICAgIChzZXQgKHJlZzpTSSAzMykK ICAgICAgICAgICAgKHplcm9fZXh0ZW5kOlNJIChtZW06UUkgKHJlZzpTSSAx IFIxMSBbIGRiIF0pIFswIFMxIEE4XSkpKQogICAgICAgIChzZXQgKHJlZy92 L2Y6U0kgMjkgWyBkYiBdKQogICAgICAgICAgICAocmVnOlNJIDEgUjExIFsg ZGIgXSkpCiAgICBdKQpGYWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlv bjoKKHNldCAocmVnOkhJIDMyKQogICAgKHplcm9fZXh0ZW5kOkhJIChtZW06 UUkgKHJlZy92L2Y6U0kgMjkgWyBkYiBdKSBbMCBTMSBBOF0pKSkKRmFpbGVk IHRvIG1hdGNoIHRoaXMgaW5zdHJ1Y3Rpb246CihwYXJhbGxlbCBbCiAgICAg ICAgKHNldCAocmVnOkhJIDMyKQogICAgICAgICAgICAoemVyb19leHRlbmQ6 SEkgKG1lbTpRSSAocmVnOlNJIDEgUjExIFsgZGIgXSkgWzAgUzEgQThdKSkp CiAgICAgICAgKHNldCAocmVnL3YvZjpTSSAyOSBbIGRiIF0pCiAgICAgICAg ICAgIChyZWc6U0kgMSBSMTEgWyBkYiBdKSkKICAgIF0pCkZhaWxlZCB0byBt YXRjaCB0aGlzIGluc3RydWN0aW9uOgoocGFyYWxsZWwgWwogICAgICAgIChz ZXQgKHJlZzpISSAzMikKICAgICAgICAgICAgKHplcm9fZXh0ZW5kOkhJICht ZW06UUkgKHJlZzpTSSAxIFIxMSBbIGRiIF0pIFswIFMxIEE4XSkpKQogICAg ICAgIChzZXQgKHJlZy92L2Y6U0kgMjkgWyBkYiBdKQogICAgICAgICAgICAo cmVnOlNJIDEgUjExIFsgZGIgXSkpCiAgICBdKQpTdWNjZXNzZnVsbHkgbWF0 Y2hlZCB0aGlzIGluc3RydWN0aW9uOgooc2V0IChyZWcvdi9mOlNJIDI5IFsg ZGIgXSkKICAgIChyZWc6U0kgMSBSMTEgWyBkYiBdKSkKRmFpbGVkIHRvIG1h dGNoIHRoaXMgaW5zdHJ1Y3Rpb246CihzZXQgKHJlZzpISSAzMikKICAgICh6 ZXJvX2V4dGVuZDpISSAobWVtOlFJIChyZWc6U0kgMSBSMTEgWyBkYiBdKSBb MCBTMSBBOF0pKSkKRmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5zdHJ1Y3Rpb246 CihzZXQgKHJlZzpTSSAzNCkKICAgIChtdWx0OlNJICh6ZXJvX2V4dGVuZDpT SSAoc3VicmVnOlFJIChyZWc6SEkgMzIpIDApKQogICAgICAgICh6ZXJvX2V4 dGVuZDpTSSAoc3VicmVnOkhJIChtaW51czpTSSAoc3VicmVnOlNJIChyZWc6 SEkgMzApIDApCiAgICAgICAgICAgICAgICAgICAgKHJlZzpTSSAyNiBbIEQu MTIxNyBdKSkgMCkpKSkKRmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5zdHJ1Y3Rp b246CihzZXQgKHJlZzpTSSAzNCkKICAgIChtdWx0OlNJICh6ZXJvX2V4dGVu ZDpTSSAoc3VicmVnOkhJIChyZWc6U0kgMzEpIDApKQogICAgICAgIChyZWc6 U0kgMzMpKSkKRmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5zdHJ1Y3Rpb246Cihw YXJhbGxlbCBbCiAgICAgICAgKHNldCAocmVnOlNJIDM0KQogICAgICAgICAg ICAobXVsdDpTSSAoemVyb19leHRlbmQ6U0kgKHN1YnJlZzpRSSAocmVnOkhJ IDMyKSAwKSkKICAgICAgICAgICAgICAgICh6ZXJvX2V4dGVuZDpTSSAoc3Vi cmVnOkhJIChtaW51czpTSSAoc3VicmVnOlNJIChyZWc6SEkgMzApIDApCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VicmVnOlNJIChtZW06UUkg KHJlZzpTSSAwIFIxMCBbIHNiIF0pIFswIFMxIEE4XSkgMCkpIDApKSkpCiAg ICAgICAgKHNldCAocmVnOlNJIDI2IFsgRC4xMjE3IF0pCiAgICAgICAgICAg ICh6ZXJvX2V4dGVuZDpTSSAobWVtOlFJIChyZWc6U0kgMCBSMTAgWyBzYiBd KSBbMCBTMSBBOF0pKSkKICAgIF0pCkZhaWxlZCB0byBtYXRjaCB0aGlzIGlu c3RydWN0aW9uOgoocGFyYWxsZWwgWwogICAgICAgIChzZXQgKHJlZzpTSSAz NCkKICAgICAgICAgICAgKG11bHQ6U0kgKHplcm9fZXh0ZW5kOlNJIChzdWJy ZWc6UUkgKHJlZzpISSAzMikgMCkpCiAgICAgICAgICAgICAgICAoemVyb19l eHRlbmQ6U0kgKHN1YnJlZzpISSAobWludXM6U0kgKHN1YnJlZzpTSSAocmVn OkhJIDMwKSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1YnJl ZzpTSSAobWVtOlFJIChyZWc6U0kgMCBSMTAgWyBzYiBdKSBbMCBTMSBBOF0p IDApKSAwKSkpKQogICAgICAgIChzZXQgKHJlZzpTSSAyNiBbIEQuMTIxNyBd KQogICAgICAgICAgICAoemVyb19leHRlbmQ6U0kgKG1lbTpRSSAocmVnOlNJ IDAgUjEwIFsgc2IgXSkgWzAgUzEgQThdKSkpCiAgICBdKQpTdWNjZXNzZnVs bHkgbWF0Y2hlZCB0aGlzIGluc3RydWN0aW9uOgooc2V0IChyZWc6U0kgMjYg WyBELjEyMTcgXSkKICAgICh6ZXJvX2V4dGVuZDpTSSAobWVtOlFJIChyZWc6 U0kgMCBSMTAgWyBzYiBdKSBbMCBTMSBBOF0pKSkKRmFpbGVkIHRvIG1hdGNo IHRoaXMgaW5zdHJ1Y3Rpb246CihzZXQgKHJlZzpTSSAzNCkKICAgIChtdWx0 OlNJICh6ZXJvX2V4dGVuZDpTSSAoc3VicmVnOlFJIChyZWc6SEkgMzIpIDAp KQogICAgICAgICh6ZXJvX2V4dGVuZDpTSSAoc3VicmVnOkhJIChtaW51czpT SSAoc3VicmVnOlNJIChyZWc6SEkgMzApIDApCiAgICAgICAgICAgICAgICAg ICAgKHN1YnJlZzpTSSAobWVtOlFJIChyZWc6U0kgMCBSMTAgWyBzYiBdKSBb MCBTMSBBOF0pIDApKSAwKSkpKQpGYWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0 cnVjdGlvbjoKKHNldCAocmVnOlNJIDM0KQogICAgKG11bHQ6U0kgKHplcm9f ZXh0ZW5kOlNJIChzdWJyZWc6UUkgKHJlZzpISSAzMikgMCkpCiAgICAgICAg KHplcm9fZXh0ZW5kOlNJIChzdWJyZWc6SEkgKG1pbnVzOlNJIChjb25zdF9p bnQgMjU2IFsweDEwMF0pCiAgICAgICAgICAgICAgICAgICAgKHJlZzpTSSAy NiBbIEQuMTIxNyBdKSkgMCkpKSkKRmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5z dHJ1Y3Rpb246CihzZXQgKHJlZzpTSSAzMSkKICAgIChtaW51czpTSSAoY29u c3RfaW50IDI1NiBbMHgxMDBdKQogICAgICAgIChyZWc6U0kgMjYgWyBELjEy MTcgXSkpKQpGYWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlvbjoKKHNl dCAocmVnOlNJIDM0KQogICAgKG11bHQ6U0kgKHplcm9fZXh0ZW5kOlNJIChz dWJyZWc6SEkgKHJlZzpTSSAzMSkgMCkpCiAgICAgICAgKHN1YnJlZzpTSSAo bWVtOlFJIChyZWcvdi9mOlNJIDI5IFsgZGIgXSkgWzAgUzEgQThdKSAwKSkp ClN1Y2Nlc3NmdWxseSBtYXRjaGVkIHRoaXMgaW5zdHJ1Y3Rpb246CihzZXQg KHJlZzpTSSAzMikKICAgICh6ZXJvX2V4dGVuZDpTSSAoc3VicmVnOkhJIChy ZWc6U0kgMzEpIDApKSkKU3VjY2Vzc2Z1bGx5IG1hdGNoZWQgdGhpcyBpbnN0 cnVjdGlvbjoKKHNldCAocmVnOlNJIDM0KQogICAgKG11bHQ6U0kgKHJlZzpT SSAzMikKICAgICAgICAoc3VicmVnOlNJIChtZW06UUkgKHJlZy92L2Y6U0kg MjkgWyBkYiBdKSBbMCBTMSBBOF0pIDApKSkKZGVmZXJyaW5nIGRlbGV0aW9u IG9mIGluc24gd2l0aCB1aWQgPSAxMS4KbW9kaWZ5aW5nIGluc24gaTIgICAg MTIgcjMyOlNJPXplcm9fZXh0ZW5kKHIzMTpTSSMwKQogICAgICBSRUdfREVB RDogcjMxOlNJCmRlZmVycmluZyByZXNjYW4gaW5zbiB3aXRoIHVpZCA9IDEy Lgptb2RpZnlpbmcgaW5zbiBpMyAgICAxMyByMzQ6U0k9cjMyOlNJKltyMjk6 U0ldIzAKICAgICAgUkVHX0RFQUQ6IHIzMjpTSQpkZWZlcnJpbmcgcmVzY2Fu IGluc24gd2l0aCB1aWQgPSAxMy4KRmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5z dHJ1Y3Rpb246CihzZXQgKHJlZzpTSSAzMikKICAgICh6ZXJvX2V4dGVuZDpT SSAoc3VicmVnOkhJIChtaW51czpTSSAoc3VicmVnOlNJIChyZWc6SEkgMzAp IDApCiAgICAgICAgICAgICAgICAocmVnOlNJIDI2IFsgRC4xMjE3IF0pKSAw KSkpCkZhaWxlZCB0byBtYXRjaCB0aGlzIGluc3RydWN0aW9uOgoocGFyYWxs ZWwgWwogICAgICAgIChzZXQgKHJlZzpTSSAzMikKICAgICAgICAgICAgKHpl cm9fZXh0ZW5kOlNJIChzdWJyZWc6SEkgKG1pbnVzOlNJIChzdWJyZWc6U0kg KHJlZzpISSAzMCkgMCkKICAgICAgICAgICAgICAgICAgICAgICAgKHN1YnJl ZzpTSSAobWVtOlFJIChyZWc6U0kgMCBSMTAgWyBzYiBdKSBbMCBTMSBBOF0p IDApKSAwKSkpCiAgICAgICAgKHNldCAocmVnOlNJIDI2IFsgRC4xMjE3IF0p CiAgICAgICAgICAgICh6ZXJvX2V4dGVuZDpTSSAobWVtOlFJIChyZWc6U0kg MCBSMTAgWyBzYiBdKSBbMCBTMSBBOF0pKSkKICAgIF0pCkZhaWxlZCB0byBt YXRjaCB0aGlzIGluc3RydWN0aW9uOgoocGFyYWxsZWwgWwogICAgICAgIChz ZXQgKHJlZzpTSSAzMikKICAgICAgICAgICAgKHplcm9fZXh0ZW5kOlNJIChz dWJyZWc6SEkgKG1pbnVzOlNJIChzdWJyZWc6U0kgKHJlZzpISSAzMCkgMCkK ICAgICAgICAgICAgICAgICAgICAgICAgKHN1YnJlZzpTSSAobWVtOlFJIChy ZWc6U0kgMCBSMTAgWyBzYiBdKSBbMCBTMSBBOF0pIDApKSAwKSkpCiAgICAg ICAgKHNldCAocmVnOlNJIDI2IFsgRC4xMjE3IF0pCiAgICAgICAgICAgICh6 ZXJvX2V4dGVuZDpTSSAobWVtOlFJIChyZWc6U0kgMCBSMTAgWyBzYiBdKSBb MCBTMSBBOF0pKSkKICAgIF0pClN1Y2Nlc3NmdWxseSBtYXRjaGVkIHRoaXMg aW5zdHJ1Y3Rpb246CihzZXQgKHJlZzpTSSAyNiBbIEQuMTIxNyBdKQogICAg KHplcm9fZXh0ZW5kOlNJIChtZW06UUkgKHJlZzpTSSAwIFIxMCBbIHNiIF0p IFswIFMxIEE4XSkpKQpGYWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlv bjoKKHNldCAocmVnOlNJIDMyKQogICAgKHplcm9fZXh0ZW5kOlNJIChzdWJy ZWc6SEkgKG1pbnVzOlNJIChzdWJyZWc6U0kgKHJlZzpISSAzMCkgMCkKICAg ICAgICAgICAgICAgIChzdWJyZWc6U0kgKG1lbTpRSSAocmVnOlNJIDAgUjEw IFsgc2IgXSkgWzAgUzEgQThdKSAwKSkgMCkpKQpGYWlsZWQgdG8gbWF0Y2gg dGhpcyBpbnN0cnVjdGlvbjoKKHNldCAocmVnOlNJIDMyKQogICAgKHplcm9f ZXh0ZW5kOlNJIChzdWJyZWc6SEkgKG1pbnVzOlNJIChjb25zdF9pbnQgMjU2 IFsweDEwMF0pCiAgICAgICAgICAgICAgICAocmVnOlNJIDI2IFsgRC4xMjE3 IF0pKSAwKSkpCkZhaWxlZCB0byBtYXRjaCB0aGlzIGluc3RydWN0aW9uOgoo c2V0IChyZWc6U0kgMzEpCiAgICAobWludXM6U0kgKGNvbnN0X2ludCAyNTYg WzB4MTAwXSkKICAgICAgICAocmVnOlNJIDI2IFsgRC4xMjE3IF0pKSkKRmFp bGVkIHRvIG1hdGNoIHRoaXMgaW5zdHJ1Y3Rpb246CihwYXJhbGxlbCBbCiAg ICAgICAgKHNldCAocmVnOlNJIDM0KQogICAgICAgICAgICAobXVsdDpTSSAo cmVnOlNJIDMyKQogICAgICAgICAgICAgICAgKHN1YnJlZzpTSSAobWVtOlFJ IChyZWc6U0kgMSBSMTEgWyBkYiBdKSBbMCBTMSBBOF0pIDApKSkKICAgICAg ICAoc2V0IChyZWcvdi9mOlNJIDI5IFsgZGIgXSkKICAgICAgICAgICAgKHJl ZzpTSSAxIFIxMSBbIGRiIF0pKQogICAgXSkKRmFpbGVkIHRvIG1hdGNoIHRo aXMgaW5zdHJ1Y3Rpb246CihwYXJhbGxlbCBbCiAgICAgICAgKHNldCAocmVn OlNJIDM0KQogICAgICAgICAgICAobXVsdDpTSSAocmVnOlNJIDMyKQogICAg ICAgICAgICAgICAgKHN1YnJlZzpTSSAobWVtOlFJIChyZWc6U0kgMSBSMTEg WyBkYiBdKSBbMCBTMSBBOF0pIDApKSkKICAgICAgICAoc2V0IChyZWcvdi9m OlNJIDI5IFsgZGIgXSkKICAgICAgICAgICAgKHJlZzpTSSAxIFIxMSBbIGRi IF0pKQogICAgXSkKRmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5zdHJ1Y3Rpb246 CihzZXQgKHJlZzpTSSAzNCkKICAgIChtdWx0OlNJICh6ZXJvX2V4dGVuZDpT SSAoc3VicmVnOkhJIChyZWc6U0kgMzEpIDApKQogICAgICAgIChzdWJyZWc6 U0kgKG1lbTpRSSAocmVnL3YvZjpTSSAyOSBbIGRiIF0pIFswIFMxIEE4XSkg MCkpKQpGYWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlvbjoKKHNldCAo cmVnOlNJIDM0KQogICAgKG11bHQ6U0kgKHplcm9fZXh0ZW5kOlNJIChzdWJy ZWc6SEkgKG1pbnVzOlNJIChzdWJyZWc6U0kgKHJlZzpISSAzMCkgMCkKICAg ICAgICAgICAgICAgICAgICAocmVnOlNJIDI2IFsgRC4xMjE3IF0pKSAwKSkK ICAgICAgICAoc3VicmVnOlNJIChtZW06UUkgKHJlZy92L2Y6U0kgMjkgWyBk YiBdKSBbMCBTMSBBOF0pIDApKSkKU3VjY2Vzc2Z1bGx5IG1hdGNoZWQgdGhp cyBpbnN0cnVjdGlvbjoKKHNldCAocmVnOlNJIDMyKQogICAgKG1pbnVzOlNJ IChzdWJyZWc6U0kgKHJlZzpISSAzMCkgMCkKICAgICAgICAocmVnOlNJIDI2 IFsgRC4xMjE3IF0pKSkKRmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5zdHJ1Y3Rp b246CihzZXQgKHJlZzpTSSAzNCkKICAgIChtdWx0OlNJICh6ZXJvX2V4dGVu ZDpTSSAoc3VicmVnOkhJIChyZWc6U0kgMzIpIDApKQogICAgICAgIChzdWJy ZWc6U0kgKG1lbTpRSSAocmVnL3YvZjpTSSAyOSBbIGRiIF0pIFswIFMxIEE4 XSkgMCkpKQpGYWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlvbjoKKHBh cmFsbGVsIFsKICAgICAgICAoc2V0IChyZWc6U0kgMzQpCiAgICAgICAgICAg IChtdWx0OlNJICh6ZXJvX2V4dGVuZDpTSSAoc3VicmVnOkhJIChyZWc6U0kg MzEpIDApKQogICAgICAgICAgICAgICAgKHN1YnJlZzpTSSAobWVtOlFJIChy ZWc6U0kgMSBSMTEgWyBkYiBdKSBbMCBTMSBBOF0pIDApKSkKICAgICAgICAo c2V0IChyZWcvdi9mOlNJIDI5IFsgZGIgXSkKICAgICAgICAgICAgKHJlZzpT SSAxIFIxMSBbIGRiIF0pKQogICAgXSkKRmFpbGVkIHRvIG1hdGNoIHRoaXMg aW5zdHJ1Y3Rpb246CihwYXJhbGxlbCBbCiAgICAgICAgKHNldCAocmVnOlNJ IDM0KQogICAgICAgICAgICAobXVsdDpTSSAoemVyb19leHRlbmQ6U0kgKHN1 YnJlZzpISSAocmVnOlNJIDMxKSAwKSkKICAgICAgICAgICAgICAgIChzdWJy ZWc6U0kgKG1lbTpRSSAocmVnOlNJIDEgUjExIFsgZGIgXSkgWzAgUzEgQThd KSAwKSkpCiAgICAgICAgKHNldCAocmVnL3YvZjpTSSAyOSBbIGRiIF0pCiAg ICAgICAgICAgIChyZWc6U0kgMSBSMTEgWyBkYiBdKSkKICAgIF0pClN1Y2Nl c3NmdWxseSBtYXRjaGVkIHRoaXMgaW5zdHJ1Y3Rpb246CihzZXQgKHJlZy92 L2Y6U0kgMjkgWyBkYiBdKQogICAgKHJlZzpTSSAxIFIxMSBbIGRiIF0pKQpG YWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlvbjoKKHNldCAocmVnOlNJ IDM0KQogICAgKG11bHQ6U0kgKHplcm9fZXh0ZW5kOlNJIChzdWJyZWc6SEkg KHJlZzpTSSAzMSkgMCkpCiAgICAgICAgKHN1YnJlZzpTSSAobWVtOlFJIChy ZWc6U0kgMSBSMTEgWyBkYiBdKSBbMCBTMSBBOF0pIDApKSkKRmFpbGVkIHRv IG1hdGNoIHRoaXMgaW5zdHJ1Y3Rpb246CihzZXQgKHJlZzpTSSAzNSkKICAg IChsc2hpZnRydDpTSSAobXVsdDpTSSAocmVnOlNJIDMyKQogICAgICAgICAg ICAoc3VicmVnOlNJIChtZW06UUkgKHJlZy92L2Y6U0kgMjkgWyBkYiBdKSBb MCBTMSBBOF0pIDApKQogICAgICAgIChjb25zdF9pbnQgOCBbMHg4XSkpKQpG YWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlvbjoKKHBhcmFsbGVsIFsK ICAgICAgICAoc2V0IChyZWc6U0kgMzUpCiAgICAgICAgICAgIChsc2hpZnRy dDpTSSAobXVsdDpTSSAocmVnOlNJIDMyKQogICAgICAgICAgICAgICAgICAg IChzdWJyZWc6U0kgKG1lbTpRSSAocmVnOlNJIDEgUjExIFsgZGIgXSkgWzAg UzEgQThdKSAwKSkKICAgICAgICAgICAgICAgIChjb25zdF9pbnQgOCBbMHg4 XSkpKQogICAgICAgIChzZXQgKHJlZy92L2Y6U0kgMjkgWyBkYiBdKQogICAg ICAgICAgICAocmVnOlNJIDEgUjExIFsgZGIgXSkpCiAgICBdKQpGYWlsZWQg dG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlvbjoKKHBhcmFsbGVsIFsKICAgICAg ICAoc2V0IChyZWc6U0kgMzUpCiAgICAgICAgICAgIChsc2hpZnRydDpTSSAo bXVsdDpTSSAocmVnOlNJIDMyKQogICAgICAgICAgICAgICAgICAgIChzdWJy ZWc6U0kgKG1lbTpRSSAocmVnOlNJIDEgUjExIFsgZGIgXSkgWzAgUzEgQThd KSAwKSkKICAgICAgICAgICAgICAgIChjb25zdF9pbnQgOCBbMHg4XSkpKQog ICAgICAgIChzZXQgKHJlZy92L2Y6U0kgMjkgWyBkYiBdKQogICAgICAgICAg ICAocmVnOlNJIDEgUjExIFsgZGIgXSkpCiAgICBdKQpTdWNjZXNzZnVsbHkg bWF0Y2hlZCB0aGlzIGluc3RydWN0aW9uOgooc2V0IChyZWcvdi9mOlNJIDI5 IFsgZGIgXSkKICAgIChyZWc6U0kgMSBSMTEgWyBkYiBdKSkKRmFpbGVkIHRv IG1hdGNoIHRoaXMgaW5zdHJ1Y3Rpb246CihzZXQgKHJlZzpTSSAzNSkKICAg IChsc2hpZnRydDpTSSAobXVsdDpTSSAocmVnOlNJIDMyKQogICAgICAgICAg ICAoc3VicmVnOlNJIChtZW06UUkgKHJlZzpTSSAxIFIxMSBbIGRiIF0pIFsw IFMxIEE4XSkgMCkpCiAgICAgICAgKGNvbnN0X2ludCA4IFsweDhdKSkpCkZh aWxlZCB0byBtYXRjaCB0aGlzIGluc3RydWN0aW9uOgooc2V0IChyZWc6U0kg MzUpCiAgICAobHNoaWZ0cnQ6U0kgKG11bHQ6U0kgKHplcm9fZXh0ZW5kOlNJ IChzdWJyZWc6SEkgKHJlZzpTSSAzMSkgMCkpCiAgICAgICAgICAgIChzdWJy ZWc6U0kgKG1lbTpRSSAocmVnL3YvZjpTSSAyOSBbIGRiIF0pIFswIFMxIEE4 XSkgMCkpCiAgICAgICAgKGNvbnN0X2ludCA4IFsweDhdKSkpClN1Y2Nlc3Nm dWxseSBtYXRjaGVkIHRoaXMgaW5zdHJ1Y3Rpb246CihzZXQgKHJlZzpTSSAz NCkKICAgICh6ZXJvX2V4dGVuZDpTSSAoc3VicmVnOkhJIChyZWc6U0kgMzEp IDApKSkKRmFpbGVkIHRvIG1hdGNoIHRoaXMgaW5zdHJ1Y3Rpb246CihzZXQg KHJlZzpTSSAzNSkKICAgIChsc2hpZnRydDpTSSAobXVsdDpTSSAocmVnOlNJ IDM0KQogICAgICAgICAgICAoc3VicmVnOlNJIChtZW06UUkgKHJlZy92L2Y6 U0kgMjkgWyBkYiBdKSBbMCBTMSBBOF0pIDApKQogICAgICAgIChjb25zdF9p bnQgOCBbMHg4XSkpKQpTdWNjZXNzZnVsbHkgbWF0Y2hlZCB0aGlzIGluc3Ry dWN0aW9uOgooc2V0IChzdWJyZWc6U0kgKHJlZzpRSSAzNikgMCkKICAgIChs c2hpZnRydDpTSSAocmVnOlNJIDM0KQogICAgICAgIChjb25zdF9pbnQgOCBb MHg4XSkpKQpkZWZlcnJpbmcgZGVsZXRpb24gb2YgaW5zbiB3aXRoIHVpZCA9 IDE0Lgptb2RpZnlpbmcgaW5zbiBpMyAgICAxNSByMzY6UUkjMD1yMzQ6U0kg MD4+MHg4CiAgICAgIFJFR19ERUFEOiByMzQ6U0kKZGVmZXJyaW5nIHJlc2Nh biBpbnNuIHdpdGggdWlkID0gMTUuCkZhaWxlZCB0byBtYXRjaCB0aGlzIGlu c3RydWN0aW9uOgooc2V0IChzdWJyZWc6U0kgKHJlZzpRSSAzNikgMCkKICAg IChsc2hpZnRydDpTSSAobXVsdDpTSSAocmVnOlNJIDMyKQogICAgICAgICAg ICAoc3VicmVnOlNJIChtZW06UUkgKHJlZy92L2Y6U0kgMjkgWyBkYiBdKSBb MCBTMSBBOF0pIDApKQogICAgICAgIChjb25zdF9pbnQgOCBbMHg4XSkpKQpG YWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlvbjoKKHBhcmFsbGVsIFsK ICAgICAgICAoc2V0IChzdWJyZWc6U0kgKHJlZzpRSSAzNikgMCkKICAgICAg ICAgICAgKGxzaGlmdHJ0OlNJIChtdWx0OlNJIChyZWc6U0kgMzIpCiAgICAg ICAgICAgICAgICAgICAgKHN1YnJlZzpTSSAobWVtOlFJIChyZWc6U0kgMSBS MTEgWyBkYiBdKSBbMCBTMSBBOF0pIDApKQogICAgICAgICAgICAgICAgKGNv bnN0X2ludCA4IFsweDhdKSkpCiAgICAgICAgKHNldCAocmVnL3YvZjpTSSAy OSBbIGRiIF0pCiAgICAgICAgICAgIChyZWc6U0kgMSBSMTEgWyBkYiBdKSkK ICAgIF0pCkZhaWxlZCB0byBtYXRjaCB0aGlzIGluc3RydWN0aW9uOgoocGFy YWxsZWwgWwogICAgICAgIChzZXQgKHN1YnJlZzpTSSAocmVnOlFJIDM2KSAw KQogICAgICAgICAgICAobHNoaWZ0cnQ6U0kgKG11bHQ6U0kgKHJlZzpTSSAz MikKICAgICAgICAgICAgICAgICAgICAoc3VicmVnOlNJIChtZW06UUkgKHJl ZzpTSSAxIFIxMSBbIGRiIF0pIFswIFMxIEE4XSkgMCkpCiAgICAgICAgICAg ICAgICAoY29uc3RfaW50IDggWzB4OF0pKSkKICAgICAgICAoc2V0IChyZWcv di9mOlNJIDI5IFsgZGIgXSkKICAgICAgICAgICAgKHJlZzpTSSAxIFIxMSBb IGRiIF0pKQogICAgXSkKU3VjY2Vzc2Z1bGx5IG1hdGNoZWQgdGhpcyBpbnN0 cnVjdGlvbjoKKHNldCAocmVnL3YvZjpTSSAyOSBbIGRiIF0pCiAgICAocmVn OlNJIDEgUjExIFsgZGIgXSkpCkZhaWxlZCB0byBtYXRjaCB0aGlzIGluc3Ry dWN0aW9uOgooc2V0IChzdWJyZWc6U0kgKHJlZzpRSSAzNikgMCkKICAgIChs c2hpZnRydDpTSSAobXVsdDpTSSAocmVnOlNJIDMyKQogICAgICAgICAgICAo c3VicmVnOlNJIChtZW06UUkgKHJlZzpTSSAxIFIxMSBbIGRiIF0pIFswIFMx IEE4XSkgMCkpCiAgICAgICAgKGNvbnN0X2ludCA4IFsweDhdKSkpCkZhaWxl ZCB0byBtYXRjaCB0aGlzIGluc3RydWN0aW9uOgooc2V0IChzdWJyZWc6U0kg KHJlZzpRSSAzNikgMCkKICAgIChsc2hpZnRydDpTSSAobXVsdDpTSSAoemVy b19leHRlbmQ6U0kgKHN1YnJlZzpISSAocmVnOlNJIDMxKSAwKSkKICAgICAg ICAgICAgKHN1YnJlZzpTSSAobWVtOlFJIChyZWcvdi9mOlNJIDI5IFsgZGIg XSkgWzAgUzEgQThdKSAwKSkKICAgICAgICAoY29uc3RfaW50IDggWzB4OF0p KSkKU3VjY2Vzc2Z1bGx5IG1hdGNoZWQgdGhpcyBpbnN0cnVjdGlvbjoKKHNl dCAocmVnOlNJIDM0KQogICAgKHplcm9fZXh0ZW5kOlNJIChzdWJyZWc6SEkg KHJlZzpTSSAzMSkgMCkpKQpGYWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVj dGlvbjoKKHNldCAoc3VicmVnOlNJIChyZWc6UUkgMzYpIDApCiAgICAobHNo aWZ0cnQ6U0kgKG11bHQ6U0kgKHJlZzpTSSAzNCkKICAgICAgICAgICAgKHN1 YnJlZzpTSSAobWVtOlFJIChyZWcvdi9mOlNJIDI5IFsgZGIgXSkgWzAgUzEg QThdKSAwKSkKICAgICAgICAoY29uc3RfaW50IDggWzB4OF0pKSkKRmFpbGVk IHRvIG1hdGNoIHRoaXMgaW5zdHJ1Y3Rpb246CihzZXQgKHJlZzpTSSAzNykK ICAgIChwbHVzOlNJIChsc2hpZnRydDpTSSAocmVnOlNJIDM0KQogICAgICAg ICAgICAoY29uc3RfaW50IDggWzB4OF0pKQogICAgICAgIChyZWc6U0kgMjYg WyBELjEyMTcgXSkpKQpGYWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlv bjoKKHNldCAocmVnOlNJIDM3KQogICAgKHBsdXM6U0kgKGxzaGlmdHJ0OlNJ IChtdWx0OlNJIChyZWc6U0kgMzIpCiAgICAgICAgICAgICAgICAoc3VicmVn OlNJIChtZW06UUkgKHJlZy92L2Y6U0kgMjkgWyBkYiBdKSBbMCBTMSBBOF0p IDApKQogICAgICAgICAgICAoY29uc3RfaW50IDggWzB4OF0pKQogICAgICAg IChyZWc6U0kgMjYgWyBELjEyMTcgXSkpKQpTdWNjZXNzZnVsbHkgbWF0Y2hl ZCB0aGlzIGluc3RydWN0aW9uOgooc2V0IChyZWc6U0kgMzYpCiAgICAobXVs dDpTSSAocmVnOlNJIDMyKQogICAgICAgIChzdWJyZWc6U0kgKG1lbTpRSSAo cmVnL3YvZjpTSSAyOSBbIGRiIF0pIFswIFMxIEE4XSkgMCkpKQpGYWlsZWQg dG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlvbjoKKHNldCAocmVnOlNJIDM3KQog ICAgKHBsdXM6U0kgKGxzaGlmdHJ0OlNJIChyZWc6U0kgMzYpCiAgICAgICAg ICAgIChjb25zdF9pbnQgOCBbMHg4XSkpCiAgICAgICAgKHJlZzpTSSAyNiBb IEQuMTIxNyBdKSkpCkZhaWxlZCB0byBtYXRjaCB0aGlzIGluc3RydWN0aW9u Ogooc2V0IChtZW06UUkgKHJlZy92L2Y6U0kgMjkgWyBkYiBdKSBbMCBTMSBB OF0pCiAgICAoc3VicmVnOlFJIChwbHVzOlNJIChyZWc6U0kgMjYgWyBELjEy MTcgXSkKICAgICAgICAgICAgKHN1YnJlZzpTSSAocmVnOlFJIDM2KSAwKSkg MCkpCkZhaWxlZCB0byBtYXRjaCB0aGlzIGluc3RydWN0aW9uOgooc2V0ICht ZW06UUkgKHJlZy92L2Y6U0kgMjkgWyBkYiBdKSBbMCBTMSBBOF0pCiAgICAo c3VicmVnOlFJIChwbHVzOlNJIChsc2hpZnRydDpTSSAocmVnOlNJIDM0KQog ICAgICAgICAgICAgICAgKGNvbnN0X2ludCA4IFsweDhdKSkKICAgICAgICAg ICAgKHJlZzpTSSAyNiBbIEQuMTIxNyBdKSkgMCkpClN1Y2Nlc3NmdWxseSBt YXRjaGVkIHRoaXMgaW5zdHJ1Y3Rpb246CihzZXQgKHJlZzpTSSAzNykKICAg IChsc2hpZnRydDpTSSAocmVnOlNJIDM0KQogICAgICAgIChjb25zdF9pbnQg OCBbMHg4XSkpKQpGYWlsZWQgdG8gbWF0Y2ggdGhpcyBpbnN0cnVjdGlvbjoK KHNldCAobWVtOlFJIChyZWcvdi9mOlNJIDI5IFsgZGIgXSkgWzAgUzEgQThd KQogICAgKHN1YnJlZzpRSSAocGx1czpTSSAocmVnOlNJIDM3KQogICAgICAg ICAgICAocmVnOlNJIDI2IFsgRC4xMjE3IF0pKSAwKSkKCgpibGVuZAoKRGF0 YWZsb3cgc3VtbWFyeToKOzsgIGludmFsaWRhdGVkIGJ5IGNhbGwgCSAwIFtS MTBdIDEgW1IxMV0gMiBbUjEyXSAzIFtSMTNdIDE1IFtBQ0NdIDE2IFtDXSAx NyBbU10gMTggW1hdIDE5IFtZXQo7OyAgaGFyZHdhcmUgcmVncyB1c2VkIAkg MTMgW1IxRF0gMTQgW1IxRV0KOzsgIHJlZ3VsYXIgYmxvY2sgYXJ0aWZpY2lh bCB1c2VzIAkgMTMgW1IxRF0gMTQgW1IxRV0KOzsgIGVoIGJsb2NrIGFydGlm aWNpYWwgdXNlcyAJIDEzIFtSMURdIDE0IFtSMUVdCjs7ICBlbnRyeSBibG9j ayBkZWZzIAkgMCBbUjEwXSAxIFtSMTFdIDEzIFtSMURdIDE0IFtSMUVdCjs7 ICBleGl0IGJsb2NrIHVzZXMgCSAxMyBbUjFEXSAxNCBbUjFFXQo7OyAgcmVn cyBldmVyIGxpdmUgCSAwW1IxMF0gMVtSMTFdCjs7ICByZWYgdXNhZ2UgCXIw PXsxZCwxdX0gcjE9ezFkLDF1fSByMTM9ezFkLDJ1fSByMTQ9ezFkLDJ1fSBy MjY9ezFkLDJ1fSByMjg9ezFkLDF1fSByMjk9ezFkLDJ1fSByMzA9ezFkLDF1 fSByMzE9ezFkLDF1fSByMzI9ezFkLDF1fSByMzM9ezFkLDF1fSByMzQ9ezFk LDF1fSByMzU9ezFkLDF1fSByMzY9ezFkLDF1fSByMzc9ezFkLDF1fSAKOzsg ICAgdG90YWwgcmVmIHVzYWdlIDM0ezE1ZCwxOXUsMGV9IGluIDl7OSByZWd1 bGFyICsgMCBjYWxsfSBpbnNucy4KKG5vdGUgMSAwIDYgTk9URV9JTlNOX0RF TEVURUQpCgo7OyBTdGFydCBvZiBiYXNpYyBibG9jayAoIDApIC0+IDIKOzsg YmIgMiBhcnRpZmljaWFsX2RlZnM6IHsgfQo7OyBiYiAyIGFydGlmaWNpYWxf dXNlczogeyB1LTEoMTMpeyB9dS0xKDE0KXsgfX0KOzsgbHIgIGluICAJIDAg W1IxMF0gMSBbUjExXSAxMyBbUjFEXSAxNCBbUjFFXQo7OyBsciAgdXNlIAkg MCBbUjEwXSAxIFtSMTFdIDEzIFtSMURdIDE0IFtSMUVdCjs7IGxyICBkZWYg CSAyNiAyOCAyOSAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNwoKOzsgUHJlZCBl ZGdlICBFTlRSWSBbMTAwLjAlXSAgKGZhbGx0aHJ1KQoobm90ZSA2IDEgMyAy IFtiYiAyXSBOT1RFX0lOU05fQkFTSUNfQkxPQ0spCgoobm90ZSAzIDYgNCAy IE5PVEVfSU5TTl9ERUxFVEVEKQoKKGluc24gNCAzIDUgMiB1bXVsLmM6MTYg KHNldCAocmVnL3YvZjpTSSAyOSBbIGRiIF0pCiAgICAgICAgKHJlZzpTSSAx IFIxMSBbIGRiIF0pKSA4IHttb3ZzaX0gKGV4cHJfbGlzdDpSRUdfREVBRCAo cmVnOlNJIDEgUjExIFsgZGIgXSkKICAgICAgICAobmlsKSkpCgoobm90ZSA1 IDQgOCAyIE5PVEVfSU5TTl9GVU5DVElPTl9CRUcpCgooaW5zbiA4IDUgOSAy IHVtdWwuYzoxNyAoc2V0IChyZWc6U0kgMjYgWyBELjEyMTcgXSkKICAgICAg ICAoemVyb19leHRlbmQ6U0kgKG1lbTpRSSAocmVnOlNJIDAgUjEwIFsgc2Ig XSkgWzAgUzEgQThdKSkpIDI3IHt6ZXJvX2V4dGVuZHFpc2kyfSAoZXhwcl9s aXN0OlJFR19ERUFEIChyZWc6U0kgMCBSMTAgWyBzYiBdKQogICAgICAgIChu aWwpKSkKCihpbnNuIDkgOCAxMCAyIHVtdWwuYzoyMCAoc2V0IChyZWc6SEkg MzApCiAgICAgICAgKGNvbnN0X2ludCAyNTYgWzB4MTAwXSkpIDEge21vdmhp X2luc259IChuaWwpKQoKKGluc24gMTAgOSAxMSAyIHVtdWwuYzoyMCAoc2V0 IChyZWc6U0kgMzEpCiAgICAgICAgKG1pbnVzOlNJIChzdWJyZWc6U0kgKHJl ZzpISSAzMCkgMCkKICAgICAgICAgICAgKHJlZzpTSSAyNiBbIEQuMTIxNyBd KSkpIDEyIHtzdWJzaTN9IChleHByX2xpc3Q6UkVHX0RFQUQgKHJlZzpISSAz MCkKICAgICAgICAobmlsKSkpCgoobm90ZSAxMSAxMCAxMiAyIE5PVEVfSU5T Tl9ERUxFVEVEKQoKKGluc24gMTIgMTEgMTMgMiB1bXVsLmM6MjAgKHNldCAo cmVnOlNJIDMyKQogICAgICAgICh6ZXJvX2V4dGVuZDpTSSAoc3VicmVnOkhJ IChyZWc6U0kgMzEpIDApKSkgMjgge3plcm9fZXh0ZW5kaGlzaTJ9IChleHBy X2xpc3Q6UkVHX0RFQUQgKHJlZzpTSSAzMSkKICAgICAgICAobmlsKSkpCgoo aW5zbiAxMyAxMiAxNCAyIHVtdWwuYzoyMCAoc2V0IChyZWc6U0kgMzQpCiAg ICAgICAgKG11bHQ6U0kgKHJlZzpTSSAzMikKICAgICAgICAgICAgKHN1YnJl ZzpTSSAobWVtOlFJIChyZWcvdi9mOlNJIDI5IFsgZGIgXSkgWzAgUzEgQThd KSAwKSkpIDEzIHttdWxzaTN9IChleHByX2xpc3Q6UkVHX0RFQUQgKHJlZzpT SSAzMikKICAgICAgICAobmlsKSkpCgoobm90ZSAxNCAxMyAxNSAyIE5PVEVf SU5TTl9ERUxFVEVEKQoKKGluc24gMTUgMTQgMTYgMiB1bXVsLmM6MjAgKHNl dCAoc3VicmVnOlNJIChyZWc6UUkgMzYpIDApCiAgICAgICAgKGxzaGlmdHJ0 OlNJIChyZWc6U0kgMzQpCiAgICAgICAgICAgIChjb25zdF9pbnQgOCBbMHg4 XSkpKSAyMyB7bHNocnNpM19jb25zdDJ9IChleHByX2xpc3Q6UkVHX0RFQUQg KHJlZzpTSSAzNCkKICAgICAgICAobmlsKSkpCgooaW5zbiAxNiAxNSAxNyAy IHVtdWwuYzoyMCAoc2V0IChyZWc6U0kgMzcpCiAgICAgICAgKHBsdXM6U0kg KHJlZzpTSSAyNiBbIEQuMTIxNyBdKQogICAgICAgICAgICAoc3VicmVnOlNJ IChyZWc6UUkgMzYpIDApKSkgMTEge2FkZHNpM30gKGV4cHJfbGlzdDpSRUdf REVBRCAocmVnOlFJIDM2KQogICAgICAgIChleHByX2xpc3Q6UkVHX0RFQUQg KHJlZzpTSSAyNiBbIEQuMTIxNyBdKQogICAgICAgICAgICAobmlsKSkpKQoK KGluc24gMTcgMTYgMCAyIHVtdWwuYzoyMCAoc2V0IChtZW06UUkgKHJlZy92 L2Y6U0kgMjkgWyBkYiBdKSBbMCBTMSBBOF0pCiAgICAgICAgKHN1YnJlZzpR SSAocmVnOlNJIDM3KSAwKSkgMCB7bW92cWlfaW5zbn0gKGV4cHJfbGlzdDpS RUdfREVBRCAocmVnOlNJIDM3KQogICAgICAgIChleHByX2xpc3Q6UkVHX0RF QUQgKHJlZy92L2Y6U0kgMjkgWyBkYiBdKQogICAgICAgICAgICAobmlsKSkp KQo7OyBFbmQgb2YgYmFzaWMgYmxvY2sgMiAtPiAoIDEpCjs7IGxyICBvdXQg CSAxMyBbUjFEXSAxNCBbUjFFXQoKCjs7IFN1Y2MgZWRnZSAgRVhJVCBbMTAw LjAlXSAgKGZhbGx0aHJ1KQoKc3RhcnRpbmcgdGhlIHByb2Nlc3Npbmcgb2Yg ZGVmZXJyZWQgaW5zbnMKZGVsZXRpbmcgaW5zbiB3aXRoIHVpZCA9IDMuCmRl bGV0aW5nIGluc24gd2l0aCB1aWQgPSAxMS4KZGVsZXRpbmcgaW5zbiB3aXRo IHVpZCA9IDE0LgpyZXNjYW5uaW5nIGluc24gd2l0aCB1aWQgPSA4LgpkZWxl dGluZyBpbnNuIHdpdGggdWlkID0gOC4KcmVzY2FubmluZyBpbnNuIHdpdGgg dWlkID0gMTIuCmRlbGV0aW5nIGluc24gd2l0aCB1aWQgPSAxMi4KcmVzY2Fu bmluZyBpbnNuIHdpdGggdWlkID0gMTMuCmRlbGV0aW5nIGluc24gd2l0aCB1 aWQgPSAxMy4KcmVzY2FubmluZyBpbnNuIHdpdGggdWlkID0gMTUuCmRlbGV0 aW5nIGluc24gd2l0aCB1aWQgPSAxNS4KZW5kaW5nIHRoZSBwcm9jZXNzaW5n IG9mIGRlZmVycmVkIGluc25zCgo7OyBDb21iaW5lciB0b3RhbHM6IDMwIGF0 dGVtcHRzLCAzMCBzdWJzdGl0dXRpb25zICgxMCByZXF1aXJpbmcgbmV3IHNw YWNlKSwKOzsgMyBzdWNjZXNzZXMuCg== --000e0cd32746e89c17046b6e6ff1--