IyMjIHVWaXNpb24yIFByb2plY3QsIChDKSBLZWlsIFNvZnR3YXJlDQojIyMgRG8gbm90IG1vZGlmeSAhDQoNClRhcmdldCAoRnJlZVJUT1NfRGVtbyksIDB4MDAwNCAvLyBUb29sczogJ0FSTS1BRFMnDQoNCkdyb3VwIChEZW1vX1NvdXJjZSkNCkdyb3VwIChMaWJyYXJpZXMpDQpHcm91cCAoUlRPU19Tb3VyY2UpDQpHcm91cCAoRG9jdW1lbnRhdGlvbikNCg0KRmlsZSAxLDIsPC5cc3RhcnR1cF9ydm1kay5TPjxzdGFydHVwX3J2bWRrLlM+DQpGaWxlIDEsMSw8LlxMdW1pbmFyeUNvZGVcb3NyYW05NngxNi5jPjxvc3JhbTk2eDE2LmM+DQpGaWxlIDEsMSw8LlxtYWluLmM+PG1haW4uYz4NCkZpbGUgMSwxLDwuLlxDb21tb25cTWluaW1hbFxzZW10ZXN0LmM+PHNlbXRlc3QuYz4NCkZpbGUgMSwxLDwuLlxDb21tb25cTWluaW1hbFxpbnRlZ2VyLmM+PGludGVnZXIuYz4NCkZpbGUgMSwxLDwuLlxDb21tb25cTWluaW1hbFxQb2xsUS5jPjxQb2xsUS5jPg0KRmlsZSAxLDEsPC4uXENvbW1vblxNaW5pbWFsXEJsb2NrUS5jPjxCbG9ja1EuYz4NCkZpbGUgMSwxLDwuXGhlYXBcaGVhcF8xLmM+PGhlYXBfMS5jPg0KRmlsZSAyLDQsPEM6XERldnRvb2xzXEtlaWxcQVJNXFJWMzBcTElCXEx1bWluYXJ5XGRyaXZlcmxpYi5saWI+PGRyaXZlcmxpYi5saWI+DQpGaWxlIDMsMSw8Li5cLi5cU291cmNlXHRhc2tzLmM+PHRhc2tzLmM+DQpGaWxlIDMsMSw8Li5cLi5cU291cmNlXGxpc3QuYz48bGlzdC5jPg0KRmlsZSAzLDEsPC4uXC4uXFNvdXJjZVxxdWV1ZS5jPjxxdWV1ZS5jPg0KRmlsZSAzLDEsPC4uXC4uXFNvdXJjZVxwb3J0YWJsZVxSVkRTXEFSTV9DTTNccG9ydC5jPjxwb3J0LmM+DQpGaWxlIDQsNSw8LlxyZWFkbWUudHh0PjxyZWFkbWUudHh0Pg0KDQoNCk9wdGlvbnMgMSwwLDAgIC8vIFRhcmdldCAnRnJlZVJUT1NfRGVtbycNCiBEZXZpY2UgKExNM1M4MTEpDQogVmVuZG9yIChMdW1pbmFyeSBNaWNybykNCiBDcHUgKElSQU0oMHgyMDAwMDAwMC0weDIwMDAxZmZmKSBJUk9NKDAtMHhmZmZmKSBDTE9DSyg1MDAwMDAwMCkgQ1BVVFlQRSgiQ29ydGV4LU0zIikpDQogRmxhc2hVdCAoKQ0KIFN0dXBGICgiU1RBUlRVUFxMdW1pbmFyeVxTdGFydHVwLnMiICgiTHVtaW5hcnkgU3RhcnR1cCBDb2RlIikpDQogRmxhc2hEUiAoTE1JREstQUdESSgtVTQwMjk2NDIwIC1PNyAtUzAgLUMwIC1GTzcgLUZEMjAwMDAwMDAgLUZDODAwIC1GTjEgLUZGMExNM1NfOCAtRlMwMCAtRkwwMjAwMCkpDQogRGV2SUQgKDQwNzkpDQogUmdmIChMTTNTeHh4LkgpDQogTWVtICgpDQogQyAoKQ0KIEEgKCkNCiBSTCAoKQ0KIE9IICgpDQogREJDX0lGWCAoKQ0KIERCQ19DTVMgKCkNCiBEQkNfQU1TICgpDQogREJDX0xNUyAoKQ0KIFVzZUVudj0wDQogRW52QmluICgpDQogRW52SW5jICgpDQogRW52TGliICgpDQogRW52UmVnICj/THVtaW5hcnlcKQ0KIE9yZ1JlZyAo/0x1bWluYXJ5XCkNCiBUZ1N0YXQ9MTYNCiBPdXREaXIgKC5ccnZtZGtcKQ0KIE91dE5hbWUgKFJUT1NEZW1vKQ0KIEdlbkFwcD0xDQogR2VuTGliPTANCiBHZW5IZXg9MA0KIERlYnVnPTENCiBCcm93c2U9MQ0KIExzdERpciAoLlxydm1ka1wpDQogSGV4U2VsPTENCiBNRzMySz0wDQogVEdNT1JFPTANCiBSdW5Vc3IgMCAwIDw+DQogUnVuVXNyIDEgMCA8Pg0KIEJydW5Vc3IgMCAwIDw+DQogQnJ1blVzciAxIDAgPD4NCiBDcnVuVXNyIDAgMCA8Pg0KIENydW5Vc3IgMSAwIDw+DQogU1ZDU0lEIDw+DQogR0xGTEFHUz0xNzkwDQogQURTRkxHQSB7IDE3NiwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH0NCiBBQ1BVVFlQICgiQ29ydGV4LU0zIikNCiBSVkRFViAoKQ0KIEFEU1RGTEdBIHsgMCwxMiwwLDIsOTksMCwwLDY2LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH0NCiBPQ01BRFNPQ00geyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9DQogT0NNQURTSVJBTSB7IDAsMCwwLDAsMzIsMCwzMiwwLDAgfQ0KIE9DTUFEU0lST00geyAxLDAsMCwwLDAsMCwwLDEsMCB9DQogT0NNQURTWFJBTSB7IDAsMCwwLDAsMCwwLDAsMCwwIH0NCiBPQ1JfUlZDVCB7IDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzIsMCwzMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfQ0KIFJWX1NUQVZFQyAoKQ0KIEFEU0NDRkxHIHsgOSwzMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9DQogQURTQ01JU0MgKCkNCiBBRFNDREVGTiAoUlZEU19BUk1DTTNfTE0zUzEwMikNCiBBRFNDVURFRiAoKQ0KIEFEU0NJTkNEICguOy4vTHVtaW5hcnlDb2RlOy4uXC4uXFNvdXJjZVxwb3J0YWJsZVxSVkRTXEFSTV9DTTM7Li5cLi5cU291cmNlXGluY2x1ZGU7Li5cQ29tbW9uXGluY2x1ZGUpDQogQURTQVNGTEcgeyAxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfQ0KIEFEU0FNSVNDICgpDQogQURTQURFRk4gKCkNCiBBRFNBVURFRiAoKQ0KIEFEU0FJTkNEICgpDQogUHJvcEZsZCB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9DQogSW5jQmxkPTENCiBBbHdheXNCdWlsZD0wDQogR2VuQXNtPTANCiBBc21Bc209MA0KIFB1YmxpY3NPbmx5PTANCiBTdG9wQ29kZT0zDQogQ3VzdEFyZ3MgKCkNCiBMaWJNb2RzICgpDQogQURTTERGRyB7IDE3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfQ0KIEFEU0xEVEEgKDB4MDAwMDAwMDApDQogQURTTEREQSAoMHgyMDAwMDAwMCkNCiBBRFNMRFNDICgpDQogQURTTERJQiAoKQ0KIEFEU0xESUMgKCkNCiBBRFNMRE1DICgtLWVudHJ5IFJlc2V0X0hhbmRsZXIgLS1sYXN0IHhIZWFwKQ0KIEFEU0xESUYgKCkNCiBBRFNMRERXICgpDQogIE9QVERMIChTQVJNQ00zLkRMTCkoKShETE0uRExMKSgtcExNM1M4MTEpKFNBUk1DTTMuRExMKSgpKFRMTS5ETEwpKC1wTE0zUzgxMSkNCiAgT1BUREJHIDQ4MTI2LDQsKCkoKSgpKCkoKSgpKCkoKSgpKCkgKEJJTlxsbWlkay1hZ2RpLmRsbCkoKSgpKCkNCiBGTEFTSDEgeyAxLDAsMCwwLDEsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfQ0KIEZMQVNIMiAoQklOXExNSURLLUFHREkuRExMKQ0KIEZMQVNIMyAoIiIgKCkpDQogRkxBU0g0ICgpDQpFbmRPcHQNCg0K