#include "../../emit.h" #include #include char uxn_temp_strbuf[256]; #define UXN_OP_2 (1 << 5) #define UXN_OP_R (1 << 6) #define UXN_OP_K (1 << 7) enum uxn_opcode { BRK = 0x00, EQU = 0x08, LDZ = 0x10, ADD = 0x18, INC = 0x01, NEQ = 0x09, STZ = 0x11, SUB = 0x19, POP = 0x02, GTH = 0x0A, LDR = 0x12, MUL = 0x1A, NIP = 0x03, LTH = 0x0B, STR = 0x13, DIV = 0x1B, SWP = 0x04, JMP = 0x0C, LDA = 0x14, AND = 0x1C, ROT = 0x05, JCN = 0x0D, STA = 0x15, ORA = 0x1D, DUP = 0x06, JSR = 0x0E, DEI = 0x16, EOR = 0x1E, OVR = 0x07, STH = 0x0F, DEO = 0x17, SFT = 0x1F, LIT = 0x80, JCI = 0x20, JMI = 0x40, JSI = 0x60, }; char emit_uxn_lib_undar_tal[] = { 0x40, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x23, 0x38, 0x30, 0x20, 0x41, 0x4e, 0x44, 0x6b, 0x20, 0x45, 0x51, 0x55, 0x20, 0x23, 0x66, 0x66, 0x20, 0x4d, 0x55, 0x4c, 0x20, 0x53, 0x57, 0x50, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x40, 0x73, 0x64, 0x69, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x20, 0x23, 0x38, 0x30, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x3f, 0x26, 0x62, 0x5f, 0x6e, 0x65, 0x67, 0x20, 0x20, 0x26, 0x62, 0x5f, 0x70, 0x6f, 0x73, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x23, 0x38, 0x30, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x3f, 0x26, 0x61, 0x5f, 0x6e, 0x65, 0x67, 0x5f, 0x62, 0x5f, 0x70, 0x6f, 0x73, 0x20, 0x20, 0x20, 0x20, 0x44, 0x49, 0x56, 0x32, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x20, 0x20, 0x26, 0x61, 0x5f, 0x6e, 0x65, 0x67, 0x5f, 0x62, 0x5f, 0x70, 0x6f, 0x73, 0x20, 0x20, 0x20, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x44, 0x49, 0x56, 0x32, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x5f, 0x6e, 0x65, 0x67, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x23, 0x38, 0x30, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x3f, 0x26, 0x61, 0x5f, 0x6e, 0x65, 0x67, 0x5f, 0x62, 0x5f, 0x6e, 0x65, 0x67, 0x20, 0x20, 0x20, 0x20, 0x44, 0x49, 0x56, 0x32, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x20, 0x20, 0x26, 0x61, 0x5f, 0x6e, 0x65, 0x67, 0x5f, 0x62, 0x5f, 0x6e, 0x65, 0x67, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x52, 0x4f, 0x54, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x44, 0x49, 0x56, 0x32, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x61, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x5f, 0x20, 0x28, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x34, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x6d, 0x65, 0x6d, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x6d, 0x65, 0x6d, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x6d, 0x65, 0x6d, 0x5f, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x61, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x20, 0x28, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2a, 0x20, 0x73, 0x72, 0x63, 0x2a, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x61, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x6d, 0x65, 0x6d, 0x5f, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x4e, 0x45, 0x51, 0x32, 0x20, 0x3f, 0x26, 0x65, 0x6e, 0x64, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x65, 0x6e, 0x64, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x45, 0x51, 0x55, 0x20, 0x3f, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x20, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x2e, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x6b, 0x20, 0x52, 0x4f, 0x54, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x20, 0x21, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x3b, 0x6d, 0x65, 0x6d, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x3b, 0x6d, 0x65, 0x6d, 0x5f, 0x20, 0x3b, 0x6d, 0x65, 0x6d, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x61, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x20, 0x28, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x3b, 0x6d, 0x65, 0x6d, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x61, 0x6d, 0x63, 0x70, 0x79, 0x5f, 0x20, 0x28, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2a, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x38, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x61, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x45, 0x51, 0x55, 0x20, 0x3f, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x20, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x6b, 0x20, 0x52, 0x4f, 0x54, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x20, 0x21, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x6e, 0x61, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x72, 0x5f, 0x20, 0x28, 0x20, 0x6e, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x61, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x35, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x20, 0x44, 0x49, 0x56, 0x32, 0x20, 0x4d, 0x55, 0x4c, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x23, 0x30, 0x30, 0x33, 0x30, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, 0x30, 0x30, 0x30, 0x31, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x44, 0x49, 0x56, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x3f, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x35, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x61, 0x6d, 0x63, 0x70, 0x79, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x72, 0x5f, 0x20, 0x28, 0x20, 0x6e, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x63, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x45, 0x4f, 0x52, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x4e, 0x45, 0x51, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x4c, 0x44, 0x41, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x48, 0x72, 0x20, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x45, 0x51, 0x55, 0x32, 0x20, 0x3f, 0x26, 0x65, 0x6e, 0x64, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x65, 0x6e, 0x64, 0x2e, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x20, 0x73, 0x64, 0x69, 0x76, 0x2f, 0x62, 0x5f, 0x70, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4d, 0x55, 0x4c, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x23, 0x30, 0x30, 0x33, 0x30, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, 0x30, 0x30, 0x30, 0x31, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x73, 0x64, 0x69, 0x76, 0x2f, 0x62, 0x5f, 0x70, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x2e, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x45, 0x4f, 0x52, 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x3f, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x44, 0x41, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x48, 0x72, 0x20, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x45, 0x51, 0x55, 0x32, 0x20, 0x3f, 0x26, 0x65, 0x6e, 0x64, 0x2e, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x32, 0x64, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, 0x30, 0x30, 0x30, 0x31, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x65, 0x6e, 0x64, 0x2e, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x61, 0x6d, 0x63, 0x70, 0x79, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x6e, 0x61, 0x74, 0x5f, 0x20, 0x28, 0x20, 0x6e, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x6e, 0x61, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x20, 0x28, 0x20, 0x6e, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x5f, 0x20, 0x28, 0x20, 0x62, 0x2a, 0x20, 0x61, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x34, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x5f, 0x20, 0x28, 0x20, 0x62, 0x2a, 0x20, 0x61, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x34, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x5f, 0x20, 0x28, 0x20, 0x62, 0x2a, 0x20, 0x61, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x34, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x4d, 0x55, 0x4c, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x76, 0x5f, 0x20, 0x28, 0x20, 0x62, 0x2a, 0x20, 0x61, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x34, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x73, 0x64, 0x69, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x65, 0x71, 0x5f, 0x20, 0x28, 0x20, 0x62, 0x2a, 0x20, 0x61, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x34, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x45, 0x51, 0x55, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x65, 0x5f, 0x20, 0x28, 0x20, 0x62, 0x2a, 0x20, 0x61, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x34, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x4e, 0x45, 0x51, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x6c, 0x74, 0x5f, 0x20, 0x28, 0x20, 0x62, 0x2a, 0x20, 0x61, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x34, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x45, 0x4f, 0x52, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x45, 0x4f, 0x52, 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x5f, 0x20, 0x28, 0x20, 0x62, 0x2a, 0x20, 0x61, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x34, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x45, 0x4f, 0x52, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x45, 0x4f, 0x52, 0x32, 0x20, 0x47, 0x54, 0x48, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x20, 0x23, 0x30, 0x31, 0x20, 0x45, 0x4f, 0x52, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x67, 0x74, 0x5f, 0x20, 0x28, 0x20, 0x62, 0x2a, 0x20, 0x61, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x34, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x45, 0x4f, 0x52, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x45, 0x4f, 0x52, 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x5f, 0x20, 0x28, 0x20, 0x62, 0x2a, 0x20, 0x61, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x34, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x45, 0x4f, 0x52, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x45, 0x4f, 0x52, 0x32, 0x20, 0x47, 0x54, 0x48, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x53, 0x57, 0x50, 0x20, 0x23, 0x30, 0x31, 0x20, 0x45, 0x4f, 0x52, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x65, 0x67, 0x5f, 0x20, 0x28, 0x20, 0x66, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x62, 0x73, 0x5f, 0x20, 0x28, 0x20, 0x66, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x45, 0x4f, 0x52, 0x32, 0x20, 0x23, 0x38, 0x30, 0x30, 0x30, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x3f, 0x26, 0x74, 0x68, 0x65, 0x6e, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x21, 0x26, 0x65, 0x6e, 0x64, 0x2e, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x74, 0x68, 0x65, 0x6e, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x65, 0x6e, 0x64, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x40, 0x73, 0x74, 0x72, 0x2f, 0x3c, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x3e, 0x20, 0x28, 0x20, 0x73, 0x74, 0x72, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x44, 0x41, 0x6b, 0x20, 0x44, 0x55, 0x50, 0x20, 0x3f, 0x7b, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x31, 0x38, 0x20, 0x44, 0x45, 0x4f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x21, 0x2f, 0x3c, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x3e, 0x0a, 0x0a, 0x40, 0x6d, 0x65, 0x6d, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x40, 0x6d, 0x65, 0x6d, 0x5f, 0x20, 0x20, 0x20, 0x20}; unsigned int emit_uxn_lib_undar_tal_len = 6212; void uxn_emit_error(const char *str, i32 length, i32 line) { fprintf(stderr, "\n===\nError at line: %d '%.*s'\n===\n", line, length, str); exit(1); } void uxn_mem(u32 a) { USED(a); } void uxn_prolog(Arena *a, List *out) { /*StrBuf_append(a, out, "|100\n\tLIT2r 0000 main_ POP2r BRK\n\n");*/ StrBuf_append(a, out, "|100\n\tLIT2r 0000\n\n"); } void uxn_epilogue(Arena *a, List *out) { StrBuf_append_exactly(a, out, emit_uxn_lib_undar_tal, emit_uxn_lib_undar_tal_len); } void uxn_emit_add(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "ADD2 "); else StrBuf_append(a, out, "ADD "); } void uxn_emit_sub(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "SUB2 "); else StrBuf_append(a, out, "SUB "); } void uxn_emit_mul(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "MUL2 "); else StrBuf_append(a, out, "MUL "); } void uxn_emit_div(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "DIV2 "); else StrBuf_append(a, out, "DIV "); } void uxn_emit_lt(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "LTH2 "); else StrBuf_append(a, out, "LTH "); } void uxn_emit_le(Arena *a, List *out, u32 size) { USED(size); StrBuf_append(a, out, "ROT SWP LTH ?{ LTH #00 EQU JMPr } GTH JMPr "); } void uxn_emit_gt(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "GTH2 "); else StrBuf_append(a, out, "GTH "); } void uxn_emit_ge(Arena *a, List *out, u32 size) { USED(size); StrBuf_append(a, out, "ROT SWP GTH ?{ GTH #00 EQU JMPr } LTH JMPr "); } void uxn_emit_ne(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "NEQ2 "); else StrBuf_append(a, out, "NEQ "); } void uxn_emit_eq(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "EQU2 "); else StrBuf_append(a, out, "EQU "); } void uxn_emit_false(Arena *a, List *out) { StrBuf_append(a, out, "#0000 "); } void uxn_emit_true(Arena *a, List *out) { StrBuf_append(a, out, "#0001 "); } void uxn_emit_nil(Arena *a, List *out) { StrBuf_append(a, out, "#0000 "); } void uxn_emit_neg(Arena *a, List *out) { StrBuf_append(a, out, "#0000 SUB2 "); } void uxn_emit_not(Arena *a, List *out) { StrBuf_append(a, out, "#0000 EQU2 "); } void uxn_emit_void(Arena *a, List *out) { USED(a); USED(out); } u32 uxn_get_size(SymbolType t) { switch(t) { case SYMBOL_BOOL: return 1; case SYMBOL_BYTE: return 1; case SYMBOL_INT: return 2; case SYMBOL_NAT: return 2; case SYMBOL_REAL: return 2; case SYMBOL_STR: return 2; case SYMBOL_U8: return 1; case SYMBOL_I8: return 1; case SYMBOL_I16: return 2; case SYMBOL_U16: return 2; case SYMBOL_I32: return 4; case SYMBOL_U32: return 4; case SYMBOL_F32: return 4; default: break; } return 0; } void uxn_emit_type(Arena *a, List *out, Symbol *sym, bool local) { if(local) { if(sym->ref) { sprintf(uxn_temp_strbuf, "\tSTH2kr #%04x ADD2 LDA2\n", sym->ref); StrBuf_append(a, out, uxn_temp_strbuf); } else { sprintf(uxn_temp_strbuf, "\tSTH2kr LDA2\n"); StrBuf_append(a, out, uxn_temp_strbuf); } } else { sprintf(uxn_temp_strbuf, "!{ @%.*s $%d } ", sym->name_length, sym->name, uxn_get_size(sym->type)); StrBuf_append(a, out, uxn_temp_strbuf); } } void uxn_emit_int(Arena *a, List *out, const char *str, i32 length) { i32 i = (i32)strtol(str, nil, 10); sprintf(uxn_temp_strbuf, "#%04x ", i); StrBuf_append(a, out, uxn_temp_strbuf); USED(length); } void uxn_emit_nat(Arena *a, List *out, const char *str, i32 length) { u32 i = (u32)strtol(str, nil, 10); sprintf(uxn_temp_strbuf, "#%04x ", i); StrBuf_append(a, out, uxn_temp_strbuf); USED(length); } void uxn_emit_real(Arena *a, List *out, const char *str, i32 length) { USED(a); USED(out); USED(str); USED(length); /// TODO: implement this } void uxn_emit_byte(Arena *a, List *out, const char *str, i32 length) { u8 i = (u8)strtol(str, nil, 10); sprintf(uxn_temp_strbuf, "#%02x ", i); StrBuf_append(a, out, uxn_temp_strbuf); USED(length); } void uxn_emit_char(Arena *a, List *out, const char *str, i32 length) { sprintf(uxn_temp_strbuf, "#%02x ", (char)str[1]); StrBuf_append(a, out, uxn_temp_strbuf); USED(length); } void uxn_emit_constant(Arena *a, List *out, Symbol *sym, bool local) { if(local) { if(sym->ref) { sprintf(uxn_temp_strbuf, "\tSTH2kr #%04x ADD2 STA2\n", sym->ref); StrBuf_append(a, out, uxn_temp_strbuf); } else { sprintf(uxn_temp_strbuf, "\tSTH2kr STA2\n"); StrBuf_append(a, out, uxn_temp_strbuf); } } else { sprintf(uxn_temp_strbuf, ";%.*s STA2 ", sym->name_length, sym->name); StrBuf_append(a, out, uxn_temp_strbuf); } } void uxn_emit_array(Arena *a, List *out, Symbol *sym, List *in) { Node *curr; SymbolType t = sym->secondary_type; sprintf(uxn_temp_strbuf, "@%.*s ", sym->name_length, sym->name); StrBuf_append(a, out, uxn_temp_strbuf); if (!in) return; sprintf(uxn_temp_strbuf, "%04x ", in->count); StrBuf_append(a, out, uxn_temp_strbuf); switch(t) { case SYMBOL_BOOL: { curr = in->head; while (curr) { char* tmp_str = node_value(curr); if (sleq(tmp_str, "true", 4)) { StrBuf_append(a, out, "0001 "); } else { StrBuf_append(a, out, "0000 "); } curr = curr->next; } break; } case SYMBOL_U8: case SYMBOL_BYTE: { curr = in->head; while (curr) { char* tmp_str = node_value(curr); u8 i = (u8)strtol(tmp_str, nil, 10); sprintf(uxn_temp_strbuf, "%04x ", i); StrBuf_append(a, out, uxn_temp_strbuf); curr = curr->next; } break; } case SYMBOL_I16: case SYMBOL_INT: { curr = in->head; while (curr) { char* tmp_str = node_value(curr); i16 i = (i16)strtol(tmp_str, nil, 10); sprintf(uxn_temp_strbuf, "%04x ", i); StrBuf_append(a, out, uxn_temp_strbuf); curr = curr->next; } break; } case SYMBOL_U16: case SYMBOL_ARRAY: case SYMBOL_PLEX: case SYMBOL_STR: case SYMBOL_NAT: { curr = in->head; while (curr) { char* tmp_str = node_value(curr); u16 i = (u16)strtol(tmp_str, nil, 10); sprintf(uxn_temp_strbuf, "%04x ", i); StrBuf_append(a, out, uxn_temp_strbuf); curr = curr->next; } break; } case SYMBOL_I8: { curr = in->head; while (curr) { char* tmp_str = node_value(curr); i8 i = (i8)strtol(tmp_str, nil, 10); sprintf(uxn_temp_strbuf, "%04x ", i); StrBuf_append(a, out, uxn_temp_strbuf); curr = curr->next; } break; } case SYMBOL_U32:{ curr = in->head; while (curr) { char* tmp_str = node_value(curr); u32 i = (u32)strtol(tmp_str, nil, 10); sprintf(uxn_temp_strbuf, "%08x ", i); StrBuf_append(a, out, uxn_temp_strbuf); curr = curr->next; } break; } case SYMBOL_I32: { curr = in->head; while (curr) { char* tmp_str = node_value(curr); i32 i = (i32)strtol(tmp_str, nil, 10); sprintf(uxn_temp_strbuf, "%08x ", i); StrBuf_append(a, out, uxn_temp_strbuf); curr = curr->next; } break; } case SYMBOL_F32: case SYMBOL_REAL: { break; } default: { break; } } StrBuf_append(a, out, "\n\n"); } void uxn_emit_inline_str(Arena *a, List *out, const char *str, i32 length) { /* set a pointer to the string literal and then jump over it */ StrBuf_append(a, out, ";{ #0002 ADD2 } !{ "); i32 i = 1; while(i < length - 1) { char c = str[i++]; if(c == '\\' && i < length - 1) { switch(str[i++]) { case 'n': c = '\n'; break; case 't': c = '\t'; break; case 'r': c = '\r'; break; case '\\': case '"': case '\'': break; default: i--; /* Rewind for unknown escapes */ } } sprintf(uxn_temp_strbuf, "%02x ", c); StrBuf_append(a, out, uxn_temp_strbuf); } StrBuf_append(a, out, "00 } "); } void uxn_emit_str(Arena *a, List *out, Symbol *sym, const char *str, u32 length) { sprintf(uxn_temp_strbuf, "@%.*s %04x ", sym->name_length, sym->name, length - 2); StrBuf_append(a, out, uxn_temp_strbuf); u32 i = 1; while(i < length - 1) { char c = str[i++]; if(c == '\\' && i < length - 1) { switch(str[i++]) { case 'n': c = '\n'; break; case 't': c = '\t'; break; case 'r': c = '\r'; break; case '\\': case '"': case '\'': break; default: i--; /* Rewind for unknown escapes */ } } sprintf(uxn_temp_strbuf, "%02x ", c); StrBuf_append(a, out, uxn_temp_strbuf); } StrBuf_append(a, out, "00 "); } bool fn_loop_emit_args(Arena *a, List *out, void *data) { Symbol *sym = ((Symbol *)data); if(sym->ref) { sprintf(uxn_temp_strbuf, "\tSTH2kr #%04x ADD2 STA2\n", sym->ref); StrBuf_append(a, out, uxn_temp_strbuf); } else { sprintf(uxn_temp_strbuf, "\tSTH2kr STA2\n"); StrBuf_append(a, out, uxn_temp_strbuf); } return true; } bool fn_loop_emit_args_comment(Arena *a, List *out, void *data) { Symbol *sym = ((Symbol *)data); sprintf(uxn_temp_strbuf, "%.*s ", sym->name_length, sym->name); StrBuf_append(a, out, uxn_temp_strbuf); return true; } void uxn_emit_function(Arena *a, List *out, Symbol *sym) { sprintf(uxn_temp_strbuf, "@%.*s_ ( ", sym->name_length, sym->name); StrBuf_append(a, out, uxn_temp_strbuf); List_map_out(a, out, sym->args, fn_loop_emit_args_comment); sprintf(uxn_temp_strbuf, " -- "); StrBuf_append(a, out, uxn_temp_strbuf); if(sym->secondary_type != SYMBOL_UNDEFINED && sym->secondary_type != SYMBOL_VOID) { sprintf(uxn_temp_strbuf, " res "); StrBuf_append(a, out, uxn_temp_strbuf); } sprintf(uxn_temp_strbuf, ")\n"); StrBuf_append(a, out, uxn_temp_strbuf); if(sym->size > 0) { sprintf(uxn_temp_strbuf, "\tOVR2r LIT2r %04x SUB2r\n", sym->size); StrBuf_append(a, out, uxn_temp_strbuf); } List_map_out(a, out, sym->args, fn_loop_emit_args); StrBuf_append(a, out, "\n"); } void uxn_emit_arena_fn_return(Arena *a, List *out) { StrBuf_append(a, out, "\t&return\n\t\tPOP2r JMP2r\n\n"); } void uxn_emit_arena_fn_call(Arena *a, List *out, Symbol *sym) { sprintf(uxn_temp_strbuf, "%.*s_ ", sym->name_length, sym->name); StrBuf_append(a, out, uxn_temp_strbuf); } void uxn_emit_plex(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_method(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_trait(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_const(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_open_paren(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_close_paren(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_variable(Arena *a, List *out, Symbol *sym, bool local) { if(local) { if(sym->ref) { sprintf(uxn_temp_strbuf, "\tSTH2kr #%04x ADD2 LDA2 ", sym->ref); StrBuf_append(a, out, uxn_temp_strbuf); } else { sprintf(uxn_temp_strbuf, "\tSTH2kr LDA2 "); StrBuf_append(a, out, uxn_temp_strbuf); } } else { sprintf(uxn_temp_strbuf, ";%.*s LDA2 ", sym->name_length, sym->name); StrBuf_append(a, out, uxn_temp_strbuf); } } void uxn_emit_set_variable(Arena *a, List *out, Symbol *sym, bool local) { if(local) { if(sym->ref) { sprintf(uxn_temp_strbuf, "\tSTH2kr #%04x ADD2 STA2 ", sym->ref); StrBuf_append(a, out, uxn_temp_strbuf); } else { sprintf(uxn_temp_strbuf, "\tSTH2kr STA2 "); StrBuf_append(a, out, uxn_temp_strbuf); } } else { sprintf(uxn_temp_strbuf, ";%.*s STA2 ", sym->name_length, sym->name); StrBuf_append(a, out, uxn_temp_strbuf); } } void uxn_emit_write(Arena *a, List *out) { StrBuf_append(a, out, "#18 DEO "); } void uxn_emit_read(Arena *a, List *out) { StrBuf_append(a, out, "#12 DEI "); } void uxn_emit_open(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_close(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_stat(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_end_statement(Arena *a, List *out) { StrBuf_append(a, out, "\n"); } void uxn_emit_set_value(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_plex_def(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_cast_int_to_nat(Arena *a, List *out) { StrBuf_append(a, out, "int_to_nat_ "); } void uxn_emit_cast_int_to_real(Arena *a, List *out) { StrBuf_append(a, out, "int_to_real_ "); } void uxn_emit_cast_int_to_str(Arena *a, List *out) { StrBuf_append(a, out, "int_to_str_ "); } void uxn_emit_cast_nat_to_int(Arena *a, List *out) { StrBuf_append(a, out, "nat_to_int_ "); } void uxn_emit_cast_nat_to_real(Arena *a, List *out) { StrBuf_append(a, out, "nat_to_real_ "); } void uxn_emit_cast_nat_to_str(Arena *a, List *out) { StrBuf_append(a, out, "nat_to_str_ "); } void uxn_emit_cast_real_to_int(Arena *a, List *out) { StrBuf_append(a, out, "real_to_int_ "); } void uxn_emit_cast_real_to_nat(Arena *a, List *out) { StrBuf_append(a, out, "real_to_nat_ "); } void uxn_emit_cast_real_to_str(Arena *a, List *out) { StrBuf_append(a, out, "real_to_str_ "); } void uxn_emit_strbuf_init(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_strbuf_append(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_strbuf_to_str(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_arena_fn_return_plex(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_arena_fn_return_array(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_arena_fn_return_strbuf(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_cast_str_to_int(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_cast_str_to_nat(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_cast_str_to_real(Arena *a, List *out) { USED(a); USED(out); } void uxn_emit_sll(Arena *a, List *out) { StrBuf_append(a, out, "#40 SFT SFT "); } void uxn_emit_srl(Arena *a, List *out) { StrBuf_append(a, out, "SFT "); } void uxn_emit_xor(Arena *a, List *out) { StrBuf_append(a, out, "EOR2 "); } void uxn_emit_mod(Arena *a, List *out) { StrBuf_append(a, out, "DIV2k MUL2 SUB2 "); } void uxn_emit_or(Arena *a, List *out) { StrBuf_append(a, out, "ORA2 "); } void uxn_emit_and(Arena *a, List *out) { StrBuf_append(a, out, "AND2 "); } void uxn_emit_print(Arena *a, List *out) { StrBuf_append(a, out, "str/ "); } void uxn_emit_if(Arena *a, List *out) { StrBuf_append(a, out, "#03 JCN !{ \n"); } void uxn_emit_patch_if(Arena *a, List *out, i32 local_ifs) { sprintf(uxn_temp_strbuf, "!&if_end.%d } ", local_ifs); StrBuf_append(a, out, uxn_temp_strbuf); } void uxn_emit_patch_if_done(Arena *a, List *out, i32 local_ifs) { sprintf(uxn_temp_strbuf, "&if_end.%d \n", local_ifs); StrBuf_append(a, out, uxn_temp_strbuf); } void uxn_emit_while(Arena *a, List *out, i32 local_whiles) { sprintf(uxn_temp_strbuf, "&while.%d ", local_whiles); StrBuf_append(a, out, uxn_temp_strbuf); } void uxn_emit_while_postfix(Arena *a, List *out) { StrBuf_append(a, out, "#03 JCN !{ \n"); } void uxn_emit_patch_while(Arena *a, List *out, i32 local_whiles) { sprintf(uxn_temp_strbuf, "!&while.%d } \n", local_whiles); StrBuf_append(a, out, uxn_temp_strbuf); } void uxn_emit_early_return(Arena *a, List *out) { StrBuf_append(a, out, "!&return "); } void uxn_emit_halt(Arena *a, List *out) { StrBuf_append(a, out, "POP2r BRK "); } void uxn_emit_deref_prolog(Arena *a, List *out, Symbol *sym) { sprintf(uxn_temp_strbuf, ";%.*s ", sym->name_length, sym->name); StrBuf_append(a, out, uxn_temp_strbuf); } void uxn_emit_deref(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "LDA2 "); else StrBuf_append(a, out, "LDA "); } void uxn_emit_ref_store(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "STA2 "); else StrBuf_append(a, out, "STA "); } void uxn_emit_address(Arena *a, List *out, u32 ptr) { sprintf(uxn_temp_strbuf, "#%04x ", ptr); StrBuf_append(a, out, uxn_temp_strbuf); } void uxn_emit_zero_block(Arena *a, List *out, u32 ptr) { sprintf(uxn_temp_strbuf, "%04x ", ptr); StrBuf_append(a, out, uxn_temp_strbuf); sprintf(uxn_temp_strbuf, "$%d ", ptr); StrBuf_append(a, out, uxn_temp_strbuf); } void uxn_emit_stack_swap(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "SWP2 "); else StrBuf_append(a, out, "SWP "); } void uxn_emit_stack_rot(Arena *a, List *out, u32 size) { if (size > 1) StrBuf_append(a, out, "ROT2 "); else StrBuf_append(a, out, "ROT "); } Emitter uxn_emitter() { return (Emitter){ 0, 0, 0, 0, uxn_emit_error, uxn_get_size, uxn_prolog, uxn_epilogue, uxn_emit_add, uxn_emit_sub, uxn_emit_mul, uxn_emit_div, uxn_emit_lt, uxn_emit_le, uxn_emit_gt, uxn_emit_ge, uxn_emit_ne, uxn_emit_eq, uxn_emit_false, uxn_emit_true, uxn_emit_nil, uxn_emit_void, uxn_emit_int, uxn_emit_nat, uxn_emit_real, uxn_emit_byte, uxn_emit_str, uxn_emit_type, uxn_emit_array, uxn_emit_function, uxn_emit_plex, uxn_emit_method, uxn_emit_trait, uxn_emit_const, uxn_emit_print, uxn_emit_neg, uxn_emit_not, uxn_emit_open_paren, uxn_emit_close_paren, uxn_emit_constant, uxn_emit_variable, uxn_emit_set_variable, uxn_emit_write, uxn_emit_read, uxn_emit_open, uxn_emit_close, uxn_emit_stat, uxn_emit_end_statement, uxn_emit_set_value, uxn_emit_plex_def, uxn_emit_cast_int_to_nat, uxn_emit_cast_int_to_real, uxn_emit_cast_int_to_str, uxn_emit_cast_nat_to_int, uxn_emit_cast_nat_to_real, uxn_emit_cast_nat_to_str, uxn_emit_cast_real_to_int, uxn_emit_cast_real_to_nat, uxn_emit_cast_real_to_str, uxn_emit_strbuf_init, uxn_emit_strbuf_append, uxn_emit_strbuf_to_str, uxn_emit_arena_fn_call, uxn_emit_arena_fn_return, uxn_emit_arena_fn_return_plex, uxn_emit_arena_fn_return_array, uxn_emit_arena_fn_return_strbuf, uxn_emit_cast_str_to_int, uxn_emit_cast_str_to_nat, uxn_emit_cast_str_to_real, uxn_emit_sll, uxn_emit_srl, uxn_emit_xor, uxn_emit_mod, uxn_emit_and, uxn_emit_or, uxn_emit_if, uxn_emit_patch_if, uxn_emit_patch_if_done, uxn_emit_while, uxn_emit_while_postfix, uxn_emit_patch_while, uxn_emit_early_return, uxn_emit_halt, uxn_emit_deref_prolog, uxn_emit_deref, uxn_emit_address, uxn_emit_zero_block, uxn_emit_char, uxn_emit_inline_str, uxn_emit_ref_store, uxn_emit_stack_swap, uxn_emit_stack_rot, }; }