diff --git a/tests/tx_data/expected_output/alt-missing-glif.pfb b/tests/tx_data/expected_output/alt-missing-glif.pfb
new file mode 100644
index 000000000..3263a7bba
--- /dev/null
+++ b/tests/tx_data/expected_output/alt-missing-glif.pfb
@@ -0,0 +1,295 @@
+%!FontType1-1.1: Exercise1-Regular 1.0
+%ADOt1write: (1.0.35)
+%%Copyright: Copyright 2023 Adobe System Incorporated. All rights reserved.
+%%BeginResource: font Exercise1-Regular
+12 dict dup begin
+/FontType 1 def
+/FontName /Exercise1-Regular def
+/FontInfo 9 dict dup begin
+/version (1.0) def
+/Notice ( ) def
+/Copyright ( ) def
+/FamilyName (Exercise 1) def
+/Weight (Regular) def
+/UnderlineThickness 51 def
+end def
+/PaintType 0 def
+/FontMatrix [0.001 0 0 0.001 0 0] def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+def
+/FontBBox {-40 -224 762 724} def
+end
+currentfile eexec BAB431EA06BB0A1031E1AA11919E714AC69FC4EA3B6672
+ABF3FDE103443FF5321890FEA3C9361761AC3B607C4C960F4D385045AB5EBCA8
+90FBA7C10718659A90ABF027E30B88E7D14F8D16AC4F74C85733B7705F6CF5C8
+EBAB2E0E40F736110B62422F3D642359FA764B81D9A72049DBFF40187C41455E
+5378378702658031C363F2CD4F37345F8FA78044A0491D8AE5B00254A201ADC9
+30CA211B7CAA4782B90547B9664E61F24869CF78DB4E8687FFFE91F16C9E5FF1
+186F31A78B27F54E1C146EDF26271FB25D6AD6FEF7C6577CD58340BEADDE6FFC
+AA900264B944E40145476E80CCD21E6143836F5909D71062CC93959AE79B8E83
+83907879DE05209C61D11D1D1785E02D8C1058AABFCAC8168F88781BDA5D53EE
+1A9E47538BDECC5F9E9C0BE3EB4984F2443410366CB19996BEE111F75A01176B
+D88C2D837FE4CEF9D975979689B0A2EF2C49DCD58D5976FB515B35271F1CC790
+C21EB2C14367F8EB1A6B04391D6FA68100DE355E822D6B23C49797AB1AFA5C11
+087BE3575970B0936307A5BEB9F9E0996EBA2BC5CB207987CCBA04EED028A558
+F7675006910FD4C6B7483022BC4354B3481D2A0C5DB9746E5B016E4737F8BE12
+E9D5C80A8692DE1032D013BEA1DD49D4D2EAF8C37B1E8F51D4C6FF0E2F881276
+B8A5BE4B05A3A8A1568F069AE38DDC00B1B8EAC0D6DCBBBCF0272277DDA841B5
+43B2E46FDBB0DEA43726686773871BAA09238555C20A57A02085B5D0B31E1A1D
+008CF3FB1B59C845C9C254E1FDE6997A559107683413FA8F91D3B585754A8BA4
+7B02F668897315AF214CDAD5E0202733012D76FD83F1ED2516B6045F03A761D8
+EE8669984676CA519EC66ACE781B0A2400C62901112B5379E479EF1616B1462E
+04F659FE7AAFE4AD91AEFE55C1066CFCBDE1A7ECDBEC8F5F0ED25FBB96FA134A
+EF156878335451984C83E012C17299B2B64A63C2553F8D12679E20CE60ADFA53
+95EDD6DC9FD6FE52AEBA66664E5EC7C0B24A637C15C6C4B173A023560550E805
+DE4C9E0A28EB36D751983E52DAB14D19DB52D458E97DBB77CF0F1CF1B9A90C97
+281DED2555D7538635B9FC132E7F13D60FD5A8463D0532E59B0AC44C860DC33C
+0098608E44831E773FC0EAB303D83FC191211AAB1ACB252FFF216392F4B6BE25
+E3DF5605DEF54018D54081EDEC435192C4CA7548964AD5B8E0C2E8607AA271A0
+C38F877DDE7AEB1D08BFC70FBBF575E7E88E09D4E1EB8F900C2D233772BD12D4
+9FCDC12836CD7092FEDE63B3FE7F64618831256B54FFFA4D3E04DF9CFA9C9AA1
+523112125ED2D7DD10C1148318CB2F6BF45414FE246F48A1F9408970F6C71082
+C6E9394A4952BB1CC9FA5674E5AE9DE9BAAD9E3A515FC983DD0F8CF06FA98B78
+8CB2489D55B2E07389ADC24FBFF6C1A895B3979878ECA652DD7A6DA55C2408D3
+D7A4B5AD0C3B700161332777101C9954C53AE0508D11A1EA10B262624CEFB70A
+F9992422824E9D2314429F16BF817E566C3A83858A5012B22D4D0F39955C2D62
+2A7B3ABE59421E55983C271664E264A371D4A1C4B369DB93E4B38E59AB812C12
+604E47A589F95AD2AF62ED79600B1FB9744BF48EC7A4EF842C54A5D631B07878
+9ADDFC9227945DD94DD205ABE789E9171FBDE43B8F2CD1234245F0AC09C4D02F
+A0536A985BE1A1CF14FEEF07CD53236B001AAB8AB12813FFD585B6775EBEAF3F
+195C99C856D4DECD1A91470E0841642829D1CCDD441F816E846784E0A31DFF18
+82705A39582716309790B30D7FE3549E171198DDC8F53C119895D2B335F48F77
+745F828E0C1F338B71D341DBF1E04B5753D317EEED5CAC2B120E3FDE703BACC8
+2133F38D3E1D6CEEB5EC717AFCFE3EB0942F1CDEEDA2A95A48B5623E6F727E16
+B9ABA0E20D35056AB614FCAE8774CCDA7BFC9933A490EFA6C37E4A5C0BA485AF
+E300D2BCA848E2D84932C21A217F8E768CB46405B227E4AD0BC3BA2BDB9093F6
+785EAE5A7C26C695281317D3BC620982A77EB275DECF73DC2E4EE5AFA0285EA1
+C758C8CE23A1875AC7278404D61A150F23413FA9453E5BACEB2E5FD14AD6521C
+5FD101D3704BA79B91AF78315FC0B060AAEF6A87AC6AA424073767195A3D7829
+5C16BBFCD67C99DF9A5FDDF181077271161E2457E4C9FC03F8D5E53A9D76E961
+569893020693934239957736445B9F2F2112D3E411C6ABC8A4DE3F8CEB544D24
+C7D464C19A1BAF4E84E52CFE9DDCCD4920F5970010533BC616DE726612B273E1
+D0C5C1AE2C3F02359679831472DBF71530F7173F9C6C0FD7E2B321265B073B76
+0F878D7E5AA0F714BB1AE7B32D0C066EBEEAB692C7D19B5363DCE804B3B51AE6
+030A6BAC8C72BD85D6460020459AA83C641DF87703CD402413B1DAD26EB1B930
+88E0052DF2C6CFEC8255DD42FA90198F98664A204CB78D876135D9C81B0F5D4C
+2932997CC3AEA1B7D5BD04781467E1A04FB8F2BB275935928DC305D4E110EF42
+F82EA848A4FA3F064EB47A9BA78A939DA93F1B2C888EDFEF1759754008AC4B93
+8B62BF43E90005864FDEDB7CD75E9B9317F33A29954647831515432B4E9DF333
+6E02C25E1427F7A03AD55C17780D281912C5B218C61DAC3721748FB4927EC083
+0830DB2947EEFF2B8A31CBE718C48140262D74C5CEB4003533CDDBE137C7B0BB
+462FAF4EEEDE5FF4AB5C713FA842A7789EF7BC36DD40027173A2FFC1872F31A6
+33F25D2597417CA9B6B3E5123E51EB234FAA86C9747B98054C2512D2C0E09B15
+ECD9F9433BE98C53F12D216F100557F110733630450013BED1C661A967B94FBE
+910EB2C873194D429BE295491BF79B3E79711B21BE62E28D47BF17B96459CA83
+60500C7EFA2D7C2A6AC7DCC85DFA38E007301352F2018CC004830C16D120E612
+BD4D91BB4D7FCA65CB9C96D94B535434C667767A40790BA5BCC69087BC2867BC
+DEB0DA04620545F55C1A1CF1CE3E684C9A4EB8E05E438BDAF39A6EF0395665AF
+C20901E307513E0BE6F4FAC41A50017E06CF138AEA615A5A1FACCA83C7B0AC3E
+29DE5541843126DDC0D323B329B1E2FB51C34E9151EDD343AD1973B002B8EBC6
+0A6805108BB135B7E3A6AA4824F874AC6A34A4C056A137FE0208A8C860064EBF
+212BC5DCD9DD24FC35D7F21C2923365770EDE46C7C4C3BC53A150CB4A1E3989B
+6AB6638AD15F526B27A921B25976FA119887812983BEA5E5F9AC3C82BEAF5626
+F3488FBBC245BF780A85652D4EC910F78B7C8422A75FDB62BFC264B821E470B3
+D295948F6D36446A3B2E411A338C916F57C9E8DE8905C62CE864B07B48477F6B
+0EBFC32E7966CB00184BE9B74A06B4030657E19CC427F4B6FB2B5F8BA04AABBC
+2EFEA8CFE3444B9AB7EFCEADB88E0AAF963DF8A9A6502643716DFB73169D1F1E
+464CD11F31EA015B61251B1DCDFEB485EAC137EFB9030FA6C07558697D9FB430
+43253DE4852C7DDDD24787C2E866035BE3C3D748AB5CF5BE5667E0FE96BED0D8
+95E7CCDF178B66E394E204A5F2805EDC0170CD3AD16AAB6EDB8C422C00A5C602
+5986612A97A5B98CDE0D74EE0A3059715F536B1DDC07153CCE5D5693D61EB7E3
+FDBF9B39B37E083C47F2CD61DC821A1C3755DA0F147FE31FF0A35916268FC5EF
+797F6DA16F3DFA6ED8D93BBE4ACB2D6260C98FBCF237D652E183DDFF3D90496A
+000D4059D901F31C6CE3FE029D4B49238AC7B3FA500A88E1876B8F468F84D143
+28A5183CE7194C713AE6FD5166555F8348840B642515C3D6EEE294A39A38FB7B
+08FF22D0EDD2CF007BACBE85A32BF66B079E516EEF44DB5FE9DF2EF4F2349EB2
+44CDDB2E0C634439C9164E9D06C5447ABBD73721674442640174FF0498933DAE
+BD8CE9E609F4655D27AB375F6ADA610E1D9403D0F1AA2B003C1DC191C23148FF
+74545D22C8005229C707DD8977C296ECE4544F88CD38217E83D820E310698A88
+4DEA40777BEB4DE4034185CEF101B6771BAC98B3BD57B660E358603362B64CFA
+B92286609D8D577EA88F09E7BDDCEE866B60AF8DD59D8851A9B1ECDBC6583960
+A001D35BCCD9AC194707430F93D0D79512768FC84BE3964EE61DBA337B5DFE48
+23FB3CFA29FFBD0261B8AD1B2F7806BFC674FDED4798E0D0048D502BB9DAB882
+1ACCC2D17620E4F868D3F95FA4B1B585A704AC59A82690407DF3D0DF2B6555C5
+31B56FCE876CCD09F1E822BCFAEEE3C193BF078BF027AF005884AEBE9613FEC2
+867F81E5BC7DD263DD2D6EB95B83703A5F507142D420F07287B0EEBEEFD7A63E
+1136797888F7610726DF88A420FED1A215F6CA3842AA9933259DD9F3D41A52C7
+7B6EF6389B1FB643E57AF2C99666ED9A3A488FF7299E8817FB89566A2ECCA039
+DC93D1D759E623294A2039F5ECC7B4511CBF282531738AD4455F01FA3595CC39
+E191D7031418151084A895E46915B3D32A3F427E14DBD59748F0B59337809CC7
+8E329B5E14E2DA8136EE74854437ED0A0E6C75223037A24A99FB3DB916F5B9A0
+F88B820A52446D8A14F5617A9DC50610BF4CCDE0F621367C72B87E93D306849D
+CEABCAC039B65CE7050BE5F430B3FC7F214217060A53899AFE9524DEA3D61BDC
+0240C93458AF3FE4312C971A05C10AD5E26FA92A0D9CFBE677349436F76736F6
+68B89285C1A4DB1E8E100BCD2BE2826309FBAF718B7C73AFBEA2149FBF72A07A
+258311654651CD69F604BC8F1EED083ECF6229C4C6C5EB49173C27FEB3729D80
+FBB90EB579748210E144783ACFAA0F1F48A36A3ADFF1D9043CCD6F7C01E8A721
+CF8D36D834AEC1EC45D8778070B887964DC5025A1FE86E8F1ADFE84850B57286
+F29DD1577B140B7BF3BFC4FF784D26E9D0B4C01C8FD47110C8953DF60A79C3F5
+92F82B888FDB030843E9BA6E69773F135D02CF6567DEB7807C153D9669BB66FC
+E0AEC5009C29A2A77AB50CFC2C022406E5BF64684F699E969EE9691D4FDA613E
+BB3593B125ADF496700F3865B9685A2A5D6E8159593362D5D07EDD9233906D48
+817635A7E938E12F9115ADD20AA41FCBB2B0310544D71A5CCA8EF118A260EC53
+8AECC32A1524F7D87DDC30EC2B71A466253488573FD70B16D9C25FD071BC35C1
+4251035D2936E6538AA9709D598E52C85B656AB54F48EAD94835829797CDCA37
+85BECD6BB7D8B69EE13DC7761E19DFAC0475B8545076C7930E1CB128D422DF99
+C90BA715C44D74EFEB4B33CC0DA1E1AEDFC4040BE41AF28BD7FE2BA4057BD9CD
+F909C4BEB49767F16A0CF7046D4F813F7543BB6C1F14CA8843873935EDCB3200
+9E9D6EC668A1CC4F7E7AC49F6AFD1AF188F7B57502758B59D99E63CA018B576F
+0CA837E331F90157F91E1692762B8A1A0608DDB1999984B341DE9C0CC57F203E
+FA85113DD3EE958D7119A2F73F4178B41FB787AA6D1835870D27725360E2BC1D
+F56D33064B21725A46A7F04C5CAEC35961054141C662333E4AA0DD48B0BAFB8F
+D1169F7C773E61D871907B8384C5B426A22C953E6BC2C21D8B5C184EFC6F7E57
+1DB3E415CF1969283206DC81765FD04F271736196F9342C80E102607B1F9811E
+4FF78FAA238FC69D412DD1D0343F3A59A4B866AFE0C221A7BCF298CE2357B87B
+F46B48E8681F5E479B904F67AF3CC598A5EEF7B96463F056F8A46B5427A2B3AC
+A9E43852D81CCEEB728955047DC1C7416CA806D6882BEC98D44AACE89F8B252F
+4D40599591A9B72EE796A1CA1A29C75BE4834FC61B7D86C7EB25B00D58AA7F8A
+497D9C12D575FB3817FBBBF1AF59634902FAAEADEC27AEE81AED1A72B5AE324B
+9E7AFEA8BD3D13F865FBC4F015A69D468534C1D58DA65C5A7892AB881DE10060
+9060BF60695F61CD09D4A94275E6B2C4F597251411268237A876B83BABBEF51A
+B7D10E67A07A3AF0613839F96A5BCC18D043C4A364EAE7EA1EC75AC04F5EE4FF
+955315F5005CEE8CCF13026AB7400533AEF69ABA34D5C0E53A9AA1472469CDD1
+947BC6DF51C0F803CF2CE8B80BB149C02680C9C8E177328F53CB599CBA25CCCC
+6FD19AADCE26553480C59C01C0D45D0C4D066C55E616259C6E287FE8F795973A
+096D40B16DCC9AED7B2ED90BE65E84F4048B327F91C199575D2DF06AB76D25C0
+2D3C24361D65478CF5E33A7A1BA85CB173B448745F589B5992D3D6F9947FA106
+86FDC37DCE3ACE226E2E5C645C0914D99584BD81684A3390698BE5A33470707B
+1DB7396823BDBE13798066291D6D1342EAEC5E9BF53A8D25C4637A4A56879D7B
+7259260968251200EC8B168FB9B8A40053BFF584ACE9350BEC18D585FEB84FA3
+0D07CEF109FC408458EEB3B2222290EE4BE3C3BAE0B107DF4AA009A3E6AFC797
+B0EF20C001EDC3FD0D34A89A0DC1C57D67F6C2669A646E7135E329448936AC6D
+A31CC82C5899B417F0FE33978D96681A92C1A9D51323E8CB7D982531A6101B79
+5716A9EF0B4DB578B9D1BDA2533BB07707636EA5F457E01450C3A8B895AFF4EB
+F0D1B3F351A829B06B3273A615F468AC87975FD9913E3FA6BC0653163A25406E
+75CFA41682C7F9BC4C8BF3DD7FF94CE0F85E8512452223480E900F14ABA70F0A
+33BC306CB00A12586DAB0F3A2509897EDC95DB50DC6E429CCCE2D5AA67FD5B88
+56FC7CA8441735FFE87A348EBCE74621D079B846C4A0A4DCEDCE2C0F03558F7C
+1BDA9CD903D3E0806B4146765855FB2559BF8B134376935C4384D308154CB5CE
+693B6E80F155D3F63EAA897889029BF4C62A503DEBBC8742487C587DD1DA6A4B
+A7420193F6C60FBD8E0AC231C8DB7047792A679E016C48C0159DF98FFDEBBB48
+A230A557547B4C37FC1A8D87FBB995E2864BC9B18E09D721CEB40462C4ABEF37
+22C03255F66025875135A32D3CECC8D42A408EC45B14F23015E0601F3A8FF48B
+98A12C4A147A0DF61D02F034324BEF6D0EDD2BE6B99BB74351832E3300CF61D2
+F3D773F18997AEC233DA349F5DDA45922098CD658210DBB153FCAEB485B35845
+C1962C45FF6528E005E5D818547A1C93ABB326EC5479E350393E8B65A39AFFEF
+526D6767CD58D1545A251D3D9357F7EF05F63A9A249D121C76F0FC2428AAD222
+0AC3EB3AFC8B4FF56297E0AB343457A863C54432AAA291285AC523DD794E8B20
+411D7346E91DC14FC1C0FFEADCAF7F4CEBF659BC17624780E76FF00691840F3B
+97AB99CE4AE994674DB690E4E7888F12BE96AA6D11B08BFD2F3150047F48C9A8
+E000B00D56EE8D850C76E27A93B79795547CAA690E21EC10A3F9F1498498E49A
+856DCEBADAA483ED1FBE10AD349AF5CC29378E6C99630EB4CE2284DB2F25424F
+F727A39A1D89D526C9D2FEBC3F019C8E6CD83CDCEA92C2C35226B32EC59BAC26
+AD30CD7C2AA2A1DBAE9CBCDF24C206F77DCEF69FEA9149D8DCE97E56FFB031A2
+F0EA846E215E0778D9E73468823331B030444FA3F947357F0C02B1AA88B72616
+94A3AA6CEA128B4FBC51C50E661715BE6AA730781F469B6C66F27F007ACF0E82
+4CE61AF979C200181357A8A57090B37837A099A752D4A53F2FBB841B1C1AA658
+D9EA4137DBC75BFD68F9D18FCD2E9B69554A2472894D82749BC21FDBD6CA4E4D
+84F402940DF56DA221C649F6858FE69609268BA5422140DABC2AC4CF0A82241E
+3CAFAC169708E74A25FEE25887695CB4B800D91E351F05620E1709DB2DE3072F
+0E97BBF4EBB9FF1BF0E014ADF23E7152BE5821C01437BC0E621041A57435EA94
+81BBEE1A42722CF7E0D0478E8549A2675DFCE58F6B1EF7632BFE091DA8F716B1
+7489BEE2E326C2E12529B3689FD69B0AAC71539BB55AFF899A544E145CE3520B
+A6A750E969413674CCE35E88EF38EE52FCEA97FC4298B3E588C8C9BA822F8A01
+FB68793D304C9522153B4E6DADD4B3307BEBA70CB740AA01CC0E7E8CE24FC6FF
+1506458D78F4D1E9A8464DB4A7549C35A644B92BEBBC87D038C01F83B4BFADCC
+C09678BFD4F6BCB5ABCB871C0D4B8E043C68F0E66163DD2614CA1858528C829B
+18C31F18438BBE94BF38F762632794AE4909815468D6C905596E8248041E8320
+D18D7990B24D07564C0F375B33E253C57284C956D6B5B6D12874DEA14B414262
+3E6376E5EA4C2526BAAF78A422860344DBBDDB999F54A22C9E2A0C2896F34FCB
+FCA795A1FF130D270D7D61B5DE7F9A7A022F1FDD5217746CD2C1FC67F32D6828
+83B1144D22386CCB78082BAC50D119C8356D6656F0FDA4A5C1A57762571EC97C
+F90B93BF85CD7A73568D14ABFA5CE69F370CD852FB593558A37607B23CA6C246
+8F75E0A07B822BE851A1850CFF6A76F866D18197CF898E1A9BFF301B2727B7E8
+F0E2A709D421E039B417CC357F5C92D853C84CF9A3C17526A0C04D669A3D638F
+AF30A344402916344E053013ABC99B36E3FA074F75A9864F8D194E756DA6F087
+946CB15DB7C4DF94D138925939DB7A1362AEA5395068EC1FED5D115B018B6428
+6ACB0D489D078B20E4BEFF2564DAA9FEAB9DE60C8E331CF755F94AF4C7C0E501
+10EE3DA914B9774930D474F0FA046C6C068B78D5F8924EF4792BCDC248CBCEA0
+0487CA27CDF14954B061C81E4F9DE79860BB7704444159878159A42ABBC0EE1E
+00591657BBD5CB935A7F3289AEF3EA28F2B5AC3C7F5FF3DB0B251006ECA18077
+95CA950B60CB08EAF17FAFC73859A332E7D3113D4993672DDDA68AC4307A4AC2
+ECA8EB528CBD366793F5941E6446C5C2BD473AB988C70F42F7ED2A479B4D7FCA
+8A95A35A8DC5A48DEB765495BFD7D6C4FF4191A48580CA492C9879C2A411FA80
+09A46BDC4AE0ED8205F5FF8499DD9E06B553AAD57A5E715CDFFE274119181EBE
+2E0276954621755C7EDCEBB4082995857D1C16DD4C959D125F59EFD3E314E0D4
+B3ECE45A3F9CDB909E3D521E55A16602662E6C5E166B853CBA07D8172B601E5B
+DFC8433C9E4B53DEBF5EE86EAF9560D92253B846A7E9D8E54D2248C7722D222D
+E9FD65270259B97768DFA10D433D290E93081744F8B9CF8F391D0F53E41F5244
+4D1382C867E2306888E6651FEEA87A7258D1E1212CBA8B3FCCBA0D37600B43AA
+39E4B44E2BE8351202F587DC27ABA755943F64A95EF4854E697AE0FBC3B434CF
+324A9164AABF308166F7746D7AFD4D57CEBC4CEB6FA72C03C01942299B1875A1
+B987EDEFD1647695EA71307C3C0AB5440AF56BE32BB6E73CC5B0A9F30198C91C
+A66B34C7F2FF81FB612D7000FEB586B405D1E8D9903CFD8B122D865582FB6CF7
+B7684065A1ACCDE3C3EFBD54018CF377940599DF3CDDD5EBEEE7ED76C3D33D86
+56663CAE3FD0958E4E5B498D5FB478EF09664C511A74F95C025723A62C685E10
+CAF5AEEB115A7B1FFFBBE08575CD48F0588FC384DECC1A909C18626C34ACF750
+27A21E7DCE66BE307F2F7BD34556022AE6A8D513105E44D1E7215B5AF08B5954
+D610D524F2CC9D3F641C5E74DEA097FAD8FFD226AD1508280AC82726C3C2FEF5
+D175C7212207C1736B0133661FF373A96E77E8B2A22C398CDDA2D52555A7B7DA
+EF0842E31F0DFF54EDE7A14C2C3AAA4B4134A708A6A8E46D6C79FEBB5A106E85
+D148270A55065F4ECA0C4745E964E6CE4C4AE9880B13ECDAD1F2BD3EAB17E601
+DB9AF2E21C6980F80EB20E57B5736E67052D5662A31B75DD9F7716BC5CEAA5C2
+24FF9B6074463D069C17C2105CB748D3E70AA1E2C1DA01DA80F1EFAE278DABF8
+8CF692A1FC37731EA1FA3EB10D918923D746B751DAAC71B665C637C315B0DE15
+0817BD0EAA4EC832F5C2379D4A23080271ED0613001C67EA1A7F58E6A3FD919A
+3D489D0E043E80F9CDB80DD0CF32C6A32D985EA6DE19AEAF876E5B84708E433B
+1FCA4FAA8DE4B8CAA8F570B833BBE753400C6CDDEF4E06B464B79C7A43917AD7
+0FF897BE417198107E9E4546FDE5716CD51A358318AF19FC360850AF9DF1B7F5
+71F3C13819DE60728A3AE2C36310B5603EE3CA956B26A002D5A6E5FC8BFE7FAB
+6FD9BED62B1D982B140BB1D366E1B3EF3E110EC17F4DEC5CDF3C932ACD571AF9
+4F55C9C7349CA59100A77126247DF851AEAF48A920B0D688A3CA595C4458A5B2
+171DA85EC53CCA4796C43BE2B04727CA9D0F372E8D9E2C9FC9A347DE79217F0C
+3F7A7C37C6F85F062600F0602B0E31CC19EA34CB5B4A9BF4651CBE39508E3EA4
+1D2F01FC2C90F73EB97CE86516CAAC9C9D82E179F40854838B0095C2DC078811
+3332712CAB06B9E250F12B4455D78784CC339F73A5E9BCDFF37FE0D70856CBB7
+4C70DDF49F0B1A0E21F44E98A9F66F05A8764FCE881B31EB96DE73D38DE762AB
+DEFD8336C41194104942BD3AF148A40620AFEB0DC945CE31F501947ED9A09DB7
+4EE8B123886F1123EB4219DB313F8A707F762ABE99A5F5E5561CD3B52822BBDD
+28B1E6EB2EDE89A2EF2444DC871CCCAFD0D7AA74B161F9740FCC747CB28982F7
+AE1AFF0DFAED8090DF63CC6E9BC8451D17D2D33486B9A6CD8073237635315B9D
+66F1084B3993F95B6E5776118AED947C98903402FFCB07E3D34AD7C31D69A009
+8FB115DECBCC16AF3CC8FE53BEFA655D54608E1220C853ABFE33CA1407FABD45
+25AD80F8DBB40F594A10B905DA01CCC8A5EF6924977C68FEE8837B2E1D1ED9F1
+E49F73D02ACCFDE5B59417C232929BC8332443261A311D1B258C498C8029AB83
+DB011036823D375C658667539CB9B11123B1B88AEE1255B0DA1EDFEE915E0390
+A0D437C163389089AAE489EE16B3E0133BE49F62344FCD6E4CF7A084C21DBD7D
+B5531901E247BE76789F7EED364DAB2361E577D9BBF8ECBE04F5B9571E2E1097
+DE8E76CC4551CE5E18246C4F597CDE46E3BFE2D50D56904745D8DF6A8E52357A
+D6415FF1C13A7146C298CE01B8C45EF4BB1B418D218B7E24D6941125B3DA2964
+468A90A5F4B43B619A1DFA417DA7C49EDEE03BBA2C10C372165D22C53E454F99
+AF5F4A99A5D2AD636C73B2A1FD5808CFCEE3D8A79CA26B227F0E70400958AD2B
+0D3A371EACE0F8EC5BDA8D5E5BC1D40AD05DAFE60C5E4F06D5DC6790DCF53958
+2959D8F458EA40E727D3389E5FD1AF696432823E0AE4BB593E9388B67EB55EFF
+76112C875A1C84E6F1606B7F8BD16EBE9D65E9FEEB8D77ADB1D2788E8C45CF7B
+C1C56AACDE708EA7612695AFECECA3F76CDA1AC7839ABCAFE4B0C607D1BE9B62
+E2A1A8C7A91ADFB7DD160E479707ACB064362582D0AB4683B6C85D556438C206
+15FA88D398C4CC50CF35F4574512B54174EC4A2BE042562B3B9B08E50CFCDC4B
+B3F1EB7212D96DF988C550088985B00022B52C708900C7B5242026C74CE1600D
+41222024B641FA74E2B69F55393AB46185AF52484166224B97334421CB520F2C
+3629FB92043D4F2F40C9EC825162E36C7D628D32F920A8905AD9C88E47F7EF18
+FDEED9AF7956D77452D9CBCAD6823AA544922FBB419113EE5F3D411102E7667B
+E64730B781925D855F66F465789BE1A10F90D1C8B2B6C5A7CDD866CE8D79BFC3
+37CC82F64787A4E49F8F36BC44D00BD383EE8C551D39591E696CDC36FAECA8C1
+A8D0E2A5E095C5F18246DB8B4C19A4CA923BF496BE7ACA18076C8E3C1BCD335A
+D8B083ABC98BC53FA82E04D4B59B617C8A8E5D72CE63A0FEDED86974FD91495F
+C9EB6DB84191A7624172F9A6F5727BEAE174EBF017B4487FAEFFCA29DB490AF1
+74A74CD2353E0C9AEA26D360DA7921901C804BA5621559BA1D39B8BE29E2AE17
+0AD6F4301C56116E5E8EB60D40B8D695B37B24E6C63637CC2DC092F2641D779C
+926EE0E86A41DE2D70E306EA63627B122ED75607C23BA52F73C219FB7590CC29
+7E22D8C250D47413C02DE5A8C1DEAD381C9233AA15E8A3AA34F92D65458A3A77
+30083B44A9C632072292F5AD9F9886A68DF815B87F2EDD4976C0C84ABAE2C2A1
+1CFA863320E2C3F8866F94D9CD7E713FF418021DA068A68EB87885CBFDEA32AE
+A81380D1DC020DBBAB029A0363912E85B84778C74FDC558B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+%%EOF
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/data/com.adobe.type.processedHashMap b/tests/tx_data/input/alt-missing-glif.ufo/data/com.adobe.type.processedHashMap
new file mode 100644
index 000000000..7d415a1d5
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/data/com.adobe.type.processedHashMap
@@ -0,0 +1,67 @@
+{
+'.notdef': ['283ca2a4dcb237acdee4cb2bb677cbc5a9c9cc2fbaaede3cf9c07cc9dfbab8ad054b2308d5fcb76e7a42189d347a9fdff18e3d90ac096ed25e2a01975e3cd11d', ['checkOutlines', 'autohint']],
+'A': ['w544l4520l5410l319656l225656l30l880l151200l390200l203367227440248512c268588l272588293512314440c338367l369267l172267', ['checkOutlines', 'autohint']],
+'B': ['bd4977f3195ae5d9ee51128baf4232b4cbce2663b0de63a8cf877e31de29998421209050b1a3608b12c296e09ace8d5b7116d5ba4774b14880a4471dd1a4db07', ['checkOutlines', 'autohint']],
+'C': ['c6d34c50586b4c9def26d533a6683065251060c70cac59e410bdbad68c4fa14b819ebb4e5b304a9b2c50d944f85ef9e0a5faa8475c1404ba626cbec4ae6fafbe', ['checkOutlines', 'autohint']],
+'D': ['w615l900l25804560564122c564331564539456656c254656l90656l17368l173588l248588401588478496c47833147816540168c24868', ['checkOutlines', 'autohint']],
+'E': ['w527l900l4780l47871l17371l173309l422309l422380l173380l173586l468586l468656l90656', ['checkOutlines', 'autohint']],
+'F': ['w494l900l1730l173294l423294l423364l173364l173586l468586l468656l90656', ['checkOutlines', 'autohint']],
+'G': ['2269e36343ed191177dbabff76144dacbac9aebe0a6f66ecfda5a040afe3112ee329d2887a5e0e0281abe1bc579f4734a6ba38e6b8a11e33eefc202564ca1c7f', ['checkOutlines', 'autohint']],
+'H': ['w652l900l1730l173309l478309l4780l5620l562656l478656l478381l173381l173656l90656', ['checkOutlines', 'autohint']],
+'I': ['w263l900l1730l173656l90656', ['checkOutlines', 'autohint']],
+'J': ['w480l31936924129-12c212-12340-1239380c393193l393656l309656l30920130910127461c204611576112083c91135', ['checkOutlines', 'autohint']],
+'K': ['w579l900l1730l173208l286341l4820l5750l338406l543656l449656l176327l173327l173656l90656', ['checkOutlines', 'autohint']],
+'L': ['w486l900l4600l46071l17371l173656l90656', ['checkOutlines', 'autohint']],
+'M': ['3536c1a1bf159a6cc1cd19dbf7f77490b7087f83070bf12462b94617a087f0b85c94b88a08da77a6f2d7048355d76e3ceee72023ce1e348119eec935000270fe', ['checkOutlines', 'autohint']],
+'N': ['0876aba1f5d3297dab45b12d67a399dfcad8df5bfa302e64dda7213a0d2e4d9114ceb5eba0c1813a0e72e01f830cd40b9e5ff05e0da452a976195b7017bf3cfc', ['checkOutlines', 'autohint']],
+'O': ['979b46dca37c933907e4ee50a973c34c43d643256eba747c98ed0444373dad83225762727112912ee1f2e514723f6a3290d12d86a08b028d9f1d8b512d0fb4c8', ['checkOutlines', 'autohint']],
+'P': ['99a6ffe6e4c99a7dae0a8f628e07708a7461acffdccfa5a36b24dc5347196d854f31a0e3edeaa08422daa9b2cfd6dde0a2f3ec38cc4416142ea7d79727dd438b', ['checkOutlines', 'autohint']],
+'Q': ['fa67843b2de05ad2f81d4f410a0f7070902baecfd74ca4fe1d6d611addc78b2f261d0b13d7fd41e6c5f1f0dac76b80be1e5b63a2cfe88d56fd79890f8b9bf57d', ['checkOutlines', 'autohint']],
+'R': ['2e2ddfebdefdbbe975ec231cb5c08baa9e0b7df47c8a2bb8742f8ce6b1183b167768bfe02522ee55da965ccdba175d75f71974c10cbb09e4be73417a12607d28', ['checkOutlines', 'autohint']],
+'S': ['2536f290acb178f160a8fe63035d7dd62277be439fdf2033a7857a5747ae26d5cb9cca1d6eeac2aa1ba4e20fa6aca8871a9f22e080c80ec30d7142953fc61cf7', ['checkOutlines', 'autohint']],
+'T': ['w536l2260l3100l310586l508586l508656l28656l28586l226586', ['checkOutlines', 'autohint']],
+'U': ['w645l872718760189-12c323-12457-1255860c558271l558656l478656l47826947811141061c3236123761170111c170269l170656l87656', ['checkOutlines', 'autohint']],
+'V': ['w515l2100l3070l515656l430656l325302302224286162c26285l25885233162218224c194302l89656l0656', ['checkOutlines', 'autohint']],
+'W': ['29c5f20a29e7cc4cdf208439e44a6d7e2f935f6bc370b1c3c725a73f33afb7c06461904917ee051c5aff041b4fd614fbda28d83ff780e634e4a8e0668af95d92', ['checkOutlines', 'autohint']],
+'X': ['ca091a711edf624812896f61a17203052f89539bed5eaf9b6823faef971c8d462492193c095a1c7d2e245583ff8593a54ce2e26ef89249b5168805994df234f8', ['checkOutlines', 'autohint']],
+'Y': ['w476l1960l2800l280254l477656l390656l306471286423263377c240328l236328214377194423c173471l88656l-1656l196254', ['checkOutlines', 'autohint']],
+'Z': ['w539l450l4970l49771l14871l494607l494656l76656l76586l390586l4550', ['checkOutlines', 'autohint']],
+'a': ['de48cb1274dfe031af1f28bcccedf34f014209062b8f936b1e535dd834529c5c643d14d29e248ff751577b23228f85c21be6b084d394cc94007d5caffebb14cb', ['checkOutlines', 'autohint']],
+'b': ['b92ccc277b1b8ff2f4786afbb30d49146118955c62540a4ee374410c792a7a09b643fbf7a1015d70aee0a6c13d2e1f9ac8579644470b8204077fa9e88d90bf17', ['checkOutlines', 'autohint']],
+'c': ['3e4fe6d317a3bf7dcab2360a956cee88dbbc68e9f5e902aa6404f0ed2419a14038e45abb0b9ff9cee5ece3e2a0d22378f9cec6172221bb7c879c03eb2da82bef', ['checkOutlines', 'autohint']],
+'d': ['53d6426ae30aa2c6cf8e378d68b16793b3e09389bcdc1b05623dab9bf2317091c5cf94f0ee4cdd2d60f0aded2940984eb8d7eefce38cabbfbd4e31fa4a7ac178', ['checkOutlines', 'autohint']],
+'e': ['6aa98885a0e0f8d0f16200bd3466e4347169335ae28f52f23f3312b64c6a076353445948e2753eb9a222b4a12fe1ab193508b86856d6b822a47e8401c07f9564', ['checkOutlines', 'autohint']],
+'eight': ['ef0660592f45c493b53cd0ce2f15398d8f62c8e0031c7fc496699d69b00c00e46a409a9cd8adea77904f6be95d921ce5270a62056668c780b537ad6a4caf8344', ['checkOutlines', 'autohint']],
+'f': ['82c6633fdaf062e1968b783f8a75e660fd973d741f88fd2f07e4bb5c8f70a4e7224d7559584ce47916598c92b39cb36ff07133e35f20d275fdf55a8dfd662bd2', ['checkOutlines', 'autohint']],
+'five': ['f77f171985b4384a3d800540446f1981f117e98f5ead4fba888e096f0796769197ac00300311429d1be21f98be39b50391e8cdb59cd2b1d7d8ca7bc462aea572', ['checkOutlines', 'autohint']],
+'four': ['7230c1dedca0df99c20f65c131180d5b64ac1b5334974db98fe8b4b253ff651e65e3b3bcf79f57c09c25547c34523479943930429bc6ab313178b1d39afc823e', ['checkOutlines', 'autohint']],
+'g': ['1b4b8136ce1d18bb3a722fe32e3a56f4e9aefce33d5f59e344941604f306cfb9dda1cb45dafd1e46f8c5ef44c7d191eded78b21f3c795088bab1a1622fe0abc7', ['checkOutlines', 'autohint']],
+'h': ['07eb4e21c0e691cd448cdd6b84bea1413073adb795366128cde9ec67bd294fceb9bd06554dfd49d32fca9ac7842b69160c8f12f90d8fe79ce26e1740456b9432', ['checkOutlines', 'autohint']],
+'hashMapVersion': (1, 0),
+'i': ['w246c124586156586181608c181639181671156692c1246929269267671c676396760892586l820l1640l164486l82486', ['checkOutlines', 'autohint']],
+'j': ['a398897c5d7d04001a2badd48c884438a0538fed270b8f39d0a052c0445b14e631ff80bf8863a21471bdba4baed35e1e6419028b07aec6e51b10dc2c76a075a4', ['checkOutlines', 'autohint']],
+'k': ['w495l820l1630l163128l254234l3960l4860l301291l464486l373486l166230l163230l163712l82712', ['checkOutlines', 'autohint']],
+'l': ['w255l82988227107-12c169-12191-12205-9c216-4l205581965619256c187561755616466c16492l164712l82712', ['checkOutlines', 'autohint']],
+'m': ['3b9e4f00ba853ad386333eb5397d3500c2249a1aee7560539f19ae61388dc968b4b8fbf041ac6df813d780fac7475492e479876b7b6b65c305a4d1f1e769f78b', ['checkOutlines', 'autohint']],
+'n': ['4dacebc2e4a36de6894e4266ab6f54942efba0079d5308f92c1e0b8b9aaefe3759645b28c80aff54e2042af9684e83326a5c8801b4f46439ca1ae1b6f1609afe', ['checkOutlines', 'autohint']],
+'nine': ['624954a2e8e85eabe694968c1fe2f6e6b2552c76fd18a5047a705ea1242e714d9902fbc5e43e4137df586d1bd2e2c18e90081ad8e8e33a45987fb89e8eb00538', ['checkOutlines', 'autohint']],
+'o': ['2037c95e920bcdfd3f908084912058c14a44570b6c2c7a25ec29e43edc1ef2ed70cb35521349392e9eed4234d2049f8151f2daa880d68acfb81bb8ae72507a0e', ['checkOutlines', 'autohint']],
+'one': ['w497l790l4390l43968l30768l307638l244638209617167601c109591l109538l225538l22568l7968', ['checkOutlines', 'autohint']],
+'p': ['6d450729f1a6079bb8d9954843e00919ca3d72c7f8782aaf0ed42f43a9701d93109d3a9338789321961977e93f641f127bfb9141ef3efdf59f1f6d84ccfe300a', ['checkOutlines', 'autohint']],
+'q': ['d1a20d9995f400e77024d8da1f777ccfc29d009a03e611d4629982d2782edc0c74fac0cc08cfb05a6a473abdb2963e3a2b50e6d30428f48cd3834b5003881639', ['checkOutlines', 'autohint']],
+'r': ['w347l820l1640l164312197394246424c287424307424318421c334416l350488334495319498c298498243498193459c160398l157398l150486l82486', ['checkOutlines', 'autohint']],
+'s': ['7fd2b86537597dcc96d8ace3e8130b479e6aa111fe881941fc608d8a33d6ba55054227577bc12c03eac1616e29d3b106219bc5c10d0208b2414a901392aca743', ['checkOutlines', 'autohint']],
+'seven': ['w497c1770l2620273249304394c455587l455638l44638l44567l362567236392188240', ['checkOutlines', 'autohint']],
+'six': ['fd7a526bd2bf1c598e866b370dd7922a889f04934dadd38642fd43769fcd873f5f8eee10e8762538401ba53ea4a64b314ae3be5e6478acff2d7f621bb3abce7c', ['checkOutlines', 'autohint']],
+'space': ['w202', ['checkOutlines', 'autohint']],
+'t': ['724ba96fc10dd34314ce80f33ee7f51f2cc5252585423f67c37b9737018e0db656596c66474da9f956188ee6a9fd41bb10512f18eb7995ef7cd2fd5296e6bb39', ['checkOutlines', 'autohint']],
+'three': ['4886be41730003bb47d4f647a8518b764191efa3aa83d8c1e446747e7555c20855396dcf9fd2f40b71f7306c69dffbe346cc524384e6cad216cb5566ce2a1df3', ['checkOutlines', 'autohint']],
+'two': ['24d026b252c7d6d2a030d2eaa6c19ad8a506205e6c16e8ec89a9967bd35b58d9f8c2be1b78051ab418a93e3ec97b389eb9d038fd723d1e0c983c58d6fd0ca939', ['checkOutlines', 'autohint']],
+'u': ['w544l751787554121-12c224-12291-1233923c38476l38776l3940l4620l462486l380486l3801413348429959c249591855915898c158189l158486l75486', ['checkOutlines', 'autohint']],
+'v': ['w467l1870l2830l455486l374486l282210268162252113c23867l23467219113203162c189210l97486l12486', ['checkOutlines', 'autohint']],
+'w': ['2ea4b8a7d7ff3087d4b143fb61ccd52c7bbefea83f2621ea83acd290d608f5420f5901acf12c09a90c698706b59069e9a9cd491b25e1bb843870e856b5f96517', ['checkOutlines', 'autohint']],
+'x': ['c60e1f49a95ba6875b061ad4c854be857877f9b16c1d60ca4ac6242f348cf7f442c9d38142b5acffaf12f7bdce56e5683edf22841a773b2d1e380160313d2687', ['checkOutlines', 'autohint']],
+'y': ['d14e2d31ca4e240c0b5c0130ab5367c49328b53fbb3dbe6843e4850856ec272cba1630455ed6acfb3f4185d8e3b4707964fae99e2d3bf183f41c17ea7db51987', ['checkOutlines', 'autohint']],
+'z': ['w425l310l3990l39967l13567l391442l391486l59486l59419l287419l3144', ['checkOutlines', 'autohint']],
+'zero': ['d8c77fb9b3c0f9a266a500cc9a55d0b870a270cc6affab1f87696fc531c727c150c60060200509eb3bb0279a21a90b4245e39bb9992f482674cec535549888b2', ['checkOutlines', 'autohint']],
+}
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/fontinfo.plist b/tests/tx_data/input/alt-missing-glif.ufo/fontinfo.plist
new file mode 100644
index 000000000..9f1baa884
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/fontinfo.plist
@@ -0,0 +1,84 @@
+
+
+
+
+ ascender
+ 750
+ capHeight
+ 750
+ copyright
+
+ descender
+ -250
+ familyName
+ Exercise 1
+ guidelines
+
+
+ italicAngle
+ 0
+ postscriptBlueFuzz
+ 0
+ postscriptBlueScale
+ 0.0625
+ postscriptBlueShift
+ 7
+ postscriptBlueValues
+
+ -12
+ 0
+ 486
+ 498
+ 518
+ 530
+ 574
+ 586
+ 638
+ 650
+ 656
+ 668
+ 712
+ 724
+
+ postscriptFamilyBlues
+
+
+ postscriptFamilyOtherBlues
+
+
+ postscriptFontName
+ Exercise1-Regular
+ postscriptOtherBlues
+
+ -217
+ -205
+
+ postscriptStemSnapH
+
+ 68
+
+ postscriptStemSnapV
+
+ 82
+ 86
+
+ postscriptUnderlinePosition
+ -100
+ postscriptUnderlineThickness
+ 51
+ postscriptWeightName
+ Regular
+ styleName
+ Regular
+ trademark
+
+ unitsPerEm
+ 1000
+ versionMajor
+ 1
+ versionMinor
+ 0
+ xHeight
+ 500
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/A_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/A_.glif
new file mode 100644
index 000000000..55323869c
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/A_.glif
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 200 67
+ hstem 588 68
+ vstem 3 538
+
+
+
+ id
+ w544l4520l5410l319656l225656l30l880l151200l390200l203367227440248512c268588l272588293512314440c338367l369267l172267
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/B_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/B_.glif
new file mode 100644
index 000000000..ebe2b080b
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/B_.glif
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 66
+ hstem 314 62
+ hstem 590 66
+ vstem 90 83
+ vstem 466 82
+
+
+
+ pointTag
+ hintSet0005
+ stems
+
+ hstem 0 66
+ hstem 314 62
+ hstem 590 66
+ vstem 90 83
+ vstem 428 82
+
+
+
+ pointTag
+ hintSet0016
+ stems
+
+ hstem 0 66
+ hstem 314 62
+ hstem 590 66
+ vstem 90 83
+ vstem 466 82
+
+
+
+ id
+ bd4977f3195ae5d9ee51128baf4232b4cbce2663b0de63a8cf877e31de29998421209050b1a3608b12c296e09ace8d5b7116d5ba4774b14880a4471dd1a4db07
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/C_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/C_.glif
new file mode 100644
index 000000000..a59acfc04
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/C_.glif
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 73
+ hstem 595 73
+ vstem 52 86
+
+
+
+ id
+ c6d34c50586b4c9def26d533a6683065251060c70cac59e410bdbad68c4fa14b819ebb4e5b304a9b2c50d944f85ef9e0a5faa8475c1404ba626cbec4ae6fafbe
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/D_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/D_.glif
new file mode 100644
index 000000000..3a24b4bc7
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/D_.glif
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 68
+ hstem 588 68
+ vstem 90 83
+ vstem 478 86
+
+
+
+ id
+ w615l900l25804560564122c564331564539456656c254656l90656l17368l173588l248588401588478496c47833147816540168c24868
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/E_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/E_.glif
new file mode 100644
index 000000000..37937ec3a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/E_.glif
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 71
+ hstem 309 71
+ hstem 586 70
+ vstem 90 83
+
+
+
+ id
+ w527l900l4780l47871l17371l173309l422309l422380l173380l173586l468586l468656l90656
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/F_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/F_.glif
new file mode 100644
index 000000000..2a022f8a0
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/F_.glif
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 294 70
+ hstem 586 70
+ vstem 90 83
+
+
+
+ id
+ w494l900l1730l173294l423294l423364l173364l173586l468586l468656l90656
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/G_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/G_.glif
new file mode 100644
index 000000000..b39508074
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/G_.glif
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 73
+ hstem 271 69
+ hstem 595 73
+ vstem 52 86
+ vstem 474 76
+
+
+
+ id
+ 2269e36343ed191177dbabff76144dacbac9aebe0a6f66ecfda5a040afe3112ee329d2887a5e0e0281abe1bc579f4734a6ba38e6b8a11e33eefc202564ca1c7f
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/H_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/H_.glif
new file mode 100644
index 000000000..b0663b0c0
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/H_.glif
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 309 72
+ hstem 656 -20
+ vstem 90 83
+ vstem 478 84
+
+
+
+ id
+ w652l900l1730l173309l478309l4780l5620l562656l478656l478381l173381l173656l90656
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/I_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/I_.glif
new file mode 100644
index 000000000..23884ca31
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/I_.glif
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 656 -20
+ vstem 90 83
+
+
+
+ id
+ w263l900l1730l173656l90656
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/J_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/J_.glif
new file mode 100644
index 000000000..c74548382
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/J_.glif
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 73
+ hstem 656 -20
+ vstem 309 84
+
+
+
+ id
+ w480l31936924129-12c212-12340-1239380c393193l393656l309656l30920130910127461c204611576112083c91135
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/K_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/K_.glif
new file mode 100644
index 000000000..1653de4b5
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/K_.glif
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 656 -20
+ vstem 90 83
+
+
+
+ id
+ w579l900l1730l173208l286341l4820l5750l338406l543656l449656l176327l173327l173656l90656
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/L_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/L_.glif
new file mode 100644
index 000000000..acbb2e00d
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/L_.glif
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 71
+ hstem 656 -20
+ vstem 90 83
+
+
+
+ id
+ w486l900l4600l46071l17371l173656l90656
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/M_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/M_.glif
new file mode 100644
index 000000000..1f351a4e2
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/M_.glif
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 66 104
+ hstem 555 101
+ vstem 90 77
+ vstem 558 79
+
+
+
+ id
+ 3536c1a1bf159a6cc1cd19dbf7f77490b7087f83070bf12462b94617a087f0b85c94b88a08da77a6f2d7048355d76e3ceee72023ce1e348119eec935000270fe
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/N_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/N_.glif
new file mode 100644
index 000000000..5d6416177
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/N_.glif
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 656 -20
+ vstem 90 79
+ vstem 478 79
+
+
+
+ pointTag
+ hintSet0003
+ stems
+
+ hstem 21 -21
+ hstem 548 108
+ vstem 90 79
+ vstem 478 79
+
+
+
+ pointTag
+ hintSet0011
+ stems
+
+ hstem 0 108
+ hstem 656 -20
+ vstem 90 79
+ vstem 478 79
+
+
+
+ id
+ 0876aba1f5d3297dab45b12d67a399dfcad8df5bfa302e64dda7213a0d2e4d9114ceb5eba0c1813a0e72e01f830cd40b9e5ff05e0da452a976195b7017bf3cfc
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/O_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/O_.glif
new file mode 100644
index 000000000..2d131c016
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/O_.glif
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 73
+ hstem 595 73
+ vstem 52 86
+ vstem 526 87
+
+
+
+ id
+ 979b46dca37c933907e4ee50a973c34c43d643256eba747c98ed0444373dad83225762727112912ee1f2e514723f6a3290d12d86a08b028d9f1d8b512d0fb4c8
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/P_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/P_.glif
new file mode 100644
index 000000000..c290bfd78
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/P_.glif
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 260 68
+ hstem 589 67
+ vstem 90 83
+ vstem 450 83
+
+
+
+ id
+ 99a6ffe6e4c99a7dae0a8f628e07708a7461acffdccfa5a36b24dc5347196d854f31a0e3edeaa08422daa9b2cfd6dde0a2f3ec38cc4416142ea7d79727dd438b
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/Q_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/Q_.glif
new file mode 100644
index 000000000..c571f6cb5
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/Q_.glif
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -164 70
+ hstem -8 65
+ hstem 595 73
+ vstem 52 86
+ vstem 526 87
+
+
+
+ id
+ fa67843b2de05ad2f81d4f410a0f7070902baecfd74ca4fe1d6d611addc78b2f261d0b13d7fd41e6c5f1f0dac76b80be1e5b63a2cfe88d56fd79890f8b9bf57d
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/R_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/R_.glif
new file mode 100644
index 000000000..3145071bd
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/R_.glif
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 277 68
+ hstem 589 67
+ vstem 90 83
+ vstem 442 83
+
+
+
+ id
+ 2e2ddfebdefdbbe975ec231cb5c08baa9e0b7df47c8a2bb8742f8ce6b1183b167768bfe02522ee55da965ccdba175d75f71974c10cbb09e4be73417a12607d28
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/S_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/S_.glif
new file mode 100644
index 000000000..b38d6ef89
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/S_.glif
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 73
+ hstem 595 73
+ vstem 74 84
+ vstem 410 85
+
+
+
+ id
+ 2536f290acb178f160a8fe63035d7dd62277be439fdf2033a7857a5747ae26d5cb9cca1d6eeac2aa1ba4e20fa6aca8871a9f22e080c80ec30d7142953fc61cf7
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/T_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/T_.glif
new file mode 100644
index 000000000..ae4d6db60
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/T_.glif
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 586 70
+ vstem 226 84
+
+
+
+ id
+ w536l2260l3100l310586l508586l508656l28656l28586l226586
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/U_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/U_.glif
new file mode 100644
index 000000000..1f2e0b21a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/U_.glif
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 73
+ hstem 656 -20
+ vstem 87 83
+ vstem 478 80
+
+
+
+ id
+ w645l872718760189-12c323-12457-1255860c558271l558656l478656l47826947811141061c3236123761170111c170269l170656l87656
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/V_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/V_.glif
new file mode 100644
index 000000000..a2f474f26
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/V_.glif
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 85
+ hstem 656 -20
+ vstem 0 515
+
+
+
+ id
+ w515l2100l3070l515656l430656l325302302224286162c26285l25885233162218224c194302l89656l0656
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/W_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/W_.glif
new file mode 100644
index 000000000..bdb0e27b5
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/W_.glif
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 87
+ hstem 656 -20
+ vstem 23 739
+
+
+
+ pointTag
+ hintSet0003
+ stems
+
+ hstem 0 87
+ hstem 544 112
+ vstem 23 739
+
+
+
+ id
+ 29c5f20a29e7cc4cdf208439e44a6d7e2f935f6bc370b1c3c725a73f33afb7c06461904917ee051c5aff041b4fd614fbda28d83ff780e634e4a8e0668af95d92
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/X_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/X_.glif
new file mode 100644
index 000000000..9312dd1b5
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/X_.glif
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 656 -20
+ vstem 15 483
+
+
+
+ id
+ ca091a711edf624812896f61a17203052f89539bed5eaf9b6823faef971c8d462492193c095a1c7d2e245583ff8593a54ce2e26ef89249b5168805994df234f8
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/Y_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/Y_.glif
new file mode 100644
index 000000000..a7ed567e6
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/Y_.glif
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 656 -20
+ vstem 196 84
+
+
+
+ id
+ w476l1960l2800l280254l477656l390656l306471286423263377c240328l236328214377194423c173471l88656l-1656l196254
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/Z_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/Z_.glif
new file mode 100644
index 000000000..337fc1b0a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/Z_.glif
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 71
+ hstem 586 70
+ vstem 45 452
+
+
+
+ id
+ w539l450l4970l49771l14871l494607l494656l76656l76586l390586l4550
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/_notdef.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/_notdef.glif
new file mode 100644
index 000000000..c3df63af9
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/_notdef.glif
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 58
+ hstem 600 60
+ vstem 89 65
+ vstem 498 67
+
+
+
+ id
+ 283ca2a4dcb237acdee4cb2bb677cbc5a9c9cc2fbaaede3cf9c07cc9dfbab8ad054b2308d5fcb76e7a42189d347a9fdff18e3d90ac096ed25e2a01975e3cd11d
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/a.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/a.glif
new file mode 100644
index 000000000..51df070e3
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/a.glif
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 66
+ hstem 430 68
+ vstem 58 81
+ vstem 357 82
+
+
+
+ pointTag
+ hintSet0002
+ stems
+
+ hstem -12 66
+ hstem 430 68
+ vstem 58 81
+ vstem 367.5 71.5
+
+
+
+ pointTag
+ hintSet0004
+ stems
+
+ hstem 21 -21
+ hstem 430 68
+ vstem 58 81
+ vstem 367.5 71.5
+
+
+
+ pointTag
+ hintSet0005
+ stems
+
+ hstem 21 -21
+ hstem 430 68
+ vstem 58 81
+ vstem 357 82
+
+
+
+ pointTag
+ hintSet0012
+ stems
+
+ hstem -12 66
+ hstem 430 68
+ vstem 58 81
+ vstem 357 82
+
+
+
+ id
+ de48cb1274dfe031af1f28bcccedf34f014209062b8f936b1e535dd834529c5c643d14d29e248ff751577b23228f85c21be6b084d394cc94007d5caffebb14cb
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/b.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/b.glif
new file mode 100644
index 000000000..eb843163a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/b.glif
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 429 69
+ hstem 712 -20
+ vstem 82 82
+ vstem 422 85
+
+
+
+ pointTag
+ hintSet0001
+ stems
+
+ hstem 21 -21
+ hstem 429 69
+ hstem 712 -20
+ vstem 82 69.5
+ vstem 422 85
+
+
+
+ pointTag
+ hintSet0002
+ stems
+
+ hstem -12 69
+ hstem 429 69
+ hstem 712 -20
+ vstem 82 69.5
+ vstem 422 85
+
+
+
+ pointTag
+ hintSet0007
+ stems
+
+ hstem -12 69
+ hstem 429 69
+ hstem 712 -20
+ vstem 82 82
+ vstem 422 85
+
+
+
+ id
+ b92ccc277b1b8ff2f4786afbb30d49146118955c62540a4ee374410c792a7a09b643fbf7a1015d70aee0a6c13d2e1f9ac8579644470b8204077fa9e88d90bf17
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/c.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/c.glif
new file mode 100644
index 000000000..4563d70da
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/c.glif
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 68
+ hstem 430 68
+ vstem 46 85
+
+
+
+ id
+ 3e4fe6d317a3bf7dcab2360a956cee88dbbc68e9f5e902aa6404f0ed2419a14038e45abb0b9ff9cee5ece3e2a0d22378f9cec6172221bb7c879c03eb2da82bef
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/contents.plist b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/contents.plist
new file mode 100644
index 000000000..767e78f05
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/contents.plist
@@ -0,0 +1,132 @@
+
+
+
+
+ .notdef
+ _notdef.glif
+ A
+ A_.glif
+ B
+ B_.glif
+ C
+ C_.glif
+ D
+ D_.glif
+ E
+ E_.glif
+ F
+ F_.glif
+ G
+ G_.glif
+ H
+ H_.glif
+ I
+ I_.glif
+ J
+ J_.glif
+ K
+ K_.glif
+ L
+ L_.glif
+ M
+ M_.glif
+ N
+ N_.glif
+ O
+ O_.glif
+ P
+ P_.glif
+ Q
+ Q_.glif
+ R
+ R_.glif
+ S
+ S_.glif
+ T
+ T_.glif
+ U
+ U_.glif
+ V
+ V_.glif
+ W
+ W_.glif
+ X
+ X_.glif
+ Y
+ Y_.glif
+ Z
+ Z_.glif
+ a
+ a.glif
+ b
+ b.glif
+ c
+ c.glif
+ d
+ d.glif
+ e
+ e.glif
+ eight
+ eight.glif
+ f
+ f.glif
+ five
+ five.glif
+ four
+ four.glif
+ g
+ g.glif
+ h
+ h.glif
+ i
+ i.glif
+ j
+ j.glif
+ k
+ k.glif
+ l
+ l.glif
+ m
+ m.glif
+ n
+ n.glif
+ nine
+ nine.glif
+ o
+ o.glif
+ one
+ one.glif
+ p
+ p.glif
+ q
+ q.glif
+ r
+ r.glif
+ s
+ s.glif
+ seven
+ seven.glif
+ six
+ six.glif
+ t
+ t.glif
+ three
+ three.glif
+ two
+ two.glif
+ u
+ u.glif
+ v
+ v.glif
+ w
+ w.glif
+ x
+ x.glif
+ y
+ y.glif
+ z
+ z.glif
+ zero
+ zero.glif
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/d.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/d.glif
new file mode 100644
index 000000000..7d8e51a6f
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/d.glif
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 69
+ hstem 429 69
+ hstem 712 -20
+ vstem 47 85
+ vstem 390 83
+
+
+
+ pointTag
+ hintSet0002
+ stems
+
+ hstem -12 69
+ hstem 429 69
+ hstem 712 -20
+ vstem 47 85
+ vstem 401.5 71.5
+
+
+
+ pointTag
+ hintSet0004
+ stems
+
+ hstem 21 -21
+ hstem 429 69
+ hstem 712 -20
+ vstem 47 85
+ vstem 401.5 71.5
+
+
+
+ pointTag
+ hintSet0005
+ stems
+
+ hstem 21 -21
+ hstem 429 69
+ hstem 712 -20
+ vstem 47 85
+ vstem 390 83
+
+
+
+ pointTag
+ hintSet0011
+ stems
+
+ hstem -12 69
+ hstem 429 69
+ hstem 712 -20
+ vstem 47 85
+ vstem 390 83
+
+
+
+ id
+ 53d6426ae30aa2c6cf8e378d68b16793b3e09389bcdc1b05623dab9bf2317091c5cf94f0ee4cdd2d60f0aded2940984eb8d7eefce38cabbfbd4e31fa4a7ac178
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/e.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/e.glif
new file mode 100644
index 000000000..55502e47a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/e.glif
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 66
+ hstem 225 54
+ hstem 433 65
+ vstem 46 80
+ vstem 386 72
+
+
+
+ pointTag
+ hintSet0005
+ stems
+
+ hstem -12 66
+ hstem 225 54
+ hstem 433 65
+ vstem 46 81
+ vstem 386 72
+
+
+
+ pointTag
+ hintSet0009
+ stems
+
+ hstem -12 66
+ hstem 225 54
+ hstem 433 65
+ vstem 46 80
+ vstem 386 72
+
+
+
+ id
+ 6aa98885a0e0f8d0f16200bd3466e4347169335ae28f52f23f3312b64c6a076353445948e2753eb9a222b4a12fe1ab193508b86856d6b822a47e8401c07f9564
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/eight.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/eight.glif
new file mode 100644
index 000000000..76a0287a9
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/eight.glif
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 61
+ hstem 589 61
+ vstem 41 74
+ vstem 377 79
+
+
+
+ pointTag
+ hintSet0005
+ stems
+
+ hstem -12 61
+ hstem 589 61
+ vstem 72 76
+ vstem 362 71
+
+
+
+ pointTag
+ hintSet0010
+ stems
+
+ hstem -12 61
+ hstem 589 61
+ vstem 41 74
+ vstem 377 79
+
+
+
+ pointTag
+ hintSet0015
+ stems
+
+ hstem -12 61
+ hstem 589 61
+ vstem 72 76
+ vstem 362 71
+
+
+
+ pointTag
+ hintSet0020
+ stems
+
+ hstem -12 61
+ hstem 589 61
+ vstem 41 74
+ vstem 377 79
+
+
+
+ id
+ ef0660592f45c493b53cd0ce2f15398d8f62c8e0031c7fc496699d69b00c00e46a409a9cd8adea77904f6be95d921ce5270a62056668c780b537ad6a4caf8344
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/f.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/f.glif
new file mode 100644
index 000000000..9572f2c71
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/f.glif
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 419 67
+ hstem 657 67
+ vstem 96 82
+
+
+
+ pointTag
+ hintSet0010
+ stems
+
+ hstem 21 -21
+ hstem 419 67
+ hstem 657 67
+ vstem 96 185
+
+
+
+ pointTag
+ hintSet0012
+ stems
+
+ hstem 21 -21
+ hstem 419 67
+ hstem 657 67
+ vstem 96 82
+
+
+
+ id
+ 82c6633fdaf062e1968b783f8a75e660fd973d741f88fd2f07e4bb5c8f70a4e7224d7559584ce47916598c92b39cb36ff07133e35f20d275fdf55a8dfd662bd2
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/five.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/five.glif
new file mode 100644
index 000000000..e8b3dc45d
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/five.glif
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 68
+ hstem 342 62
+ hstem 567 71
+ vstem 366 83
+
+
+
+ id
+ f77f171985b4384a3d800540446f1981f117e98f5ead4fba888e096f0796769197ac00300311429d1be21f98be39b50391e8cdb59cd2b1d7d8ca7bc462aea572
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/four.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/four.glif
new file mode 100644
index 000000000..7dccc95f6
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/four.glif
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 176 66
+ hstem 550 88
+ vstem 304 78
+
+
+
+ id
+ 7230c1dedca0df99c20f65c131180d5b64ac1b5334974db98fe8b4b253ff651e65e3b3bcf79f57c09c25547c34523479943930429bc6ab313178b1d39afc823e
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/g.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/g.glif
new file mode 100644
index 000000000..499e31b23
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/g.glif
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -224 57
+ hstem 21 -21
+ hstem 154 55
+ hstem 423 63
+ vstem 45 72
+ vstem 349 75
+
+
+
+ pointTag
+ hintSet0002
+ stems
+
+ hstem -224 57
+ hstem -8 68
+ hstem 154 55
+ hstem 423 63
+ vstem 63 80
+ vstem 412 80
+
+
+
+ pointTag
+ hintSet0006
+ stems
+
+ hstem -224 57
+ hstem 21 -21
+ hstem 154 55
+ hstem 423 63
+ vstem 45 72
+ vstem 349 75
+
+
+
+ pointTag
+ hintSet0009
+ stems
+
+ hstem -224 57
+ hstem -8 68
+ hstem 154 55
+ hstem 423 63
+ vstem 73 69
+ vstem 412 80
+
+
+
+ pointTag
+ hintSet0015
+ stems
+
+ hstem -224 57
+ hstem -8 68
+ hstem 154 55
+ hstem 423 63
+ vstem 63 80
+ vstem 349 75
+
+
+
+ pointTag
+ hintSet0020
+ stems
+
+ hstem -224 57
+ hstem -8 68
+ hstem 154 55
+ hstem 438 60
+ vstem 63 80
+ vstem 349 75
+
+
+
+ pointTag
+ hintSet0024
+ stems
+
+ hstem -224 57
+ hstem -8 68
+ hstem 154 55
+ hstem 423 63
+ vstem 73 69
+ vstem 349 75
+
+
+
+ pointTag
+ hintSet0027
+ stems
+
+ hstem -224 57
+ hstem 21 -21
+ hstem 154 55
+ hstem 423 63
+ vstem 45 72
+ vstem 349 75
+
+
+
+ pointTag
+ hintSet0028
+ stems
+
+ hstem -224 57
+ hstem -8 68
+ hstem 154 55
+ hstem 438 60
+ vstem 63 80
+ vstem 349 75
+
+
+
+ id
+ 1b4b8136ce1d18bb3a722fe32e3a56f4e9aefce33d5f59e344941604f306cfb9dda1cb45dafd1e46f8c5ef44c7d191eded78b21f3c795088bab1a1622fe0abc7
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/h.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/h.glif
new file mode 100644
index 000000000..ece392ea8
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/h.glif
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 427 71
+ hstem 712 -20
+ vstem 82 82
+ vstem 389 82
+
+
+
+ id
+ 07eb4e21c0e691cd448cdd6b84bea1413073adb795366128cde9ec67bd294fceb9bd06554dfd49d32fca9ac7842b69160c8f12f90d8fe79ce26e1740456b9432
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/i.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/i.glif
new file mode 100644
index 000000000..fd0e4491f
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/i.glif
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ hstem 586 106
+ vstem 67 114
+
+
+
+ pointTag
+ hintSet0005
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ hstem 586 106
+ vstem 82 82
+
+
+
+ id
+ w246c124586156586181608c181639181671156692c1246929269267671c676396760892586l820l1640l164486l82486
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/j.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/j.glif
new file mode 100644
index 000000000..40ec0d7c4
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/j.glif
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -217 67
+ hstem 486 -20
+ hstem 586 106
+ vstem 83 82
+
+
+
+ pointTag
+ hintSet0008
+ stems
+
+ hstem -217 67
+ hstem 486 -20
+ hstem 586 106
+ vstem 68 113
+
+
+
+ id
+ a398897c5d7d04001a2badd48c884438a0538fed270b8f39d0a052c0445b14e631ff80bf8863a21471bdba4baed35e1e6419028b07aec6e51b10dc2c76a075a4
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/k.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/k.glif
new file mode 100644
index 000000000..73e90acab
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/k.glif
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ hstem 712 -20
+ vstem 82 81
+
+
+
+ id
+ w495l820l1630l163128l254234l3960l4860l301291l464486l373486l166230l163230l163712l82712
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/l.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/l.glif
new file mode 100644
index 000000000..2ad03e083
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/l.glif
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 17 -21
+ hstem 712 -20
+ vstem 82 82
+
+
+
+ pointTag
+ hintSet0001
+ stems
+
+ hstem -12 68
+ hstem 712 -20
+ vstem 82 82
+
+
+
+ id
+ w255l82988227107-12c169-12191-12205-9c216-4l205581965619256c187561755616466c16492l164712l82712
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/layerinfo.plist b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/layerinfo.plist
new file mode 100644
index 000000000..aa5f6f5fe
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/layerinfo.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ lib
+
+ org.unifiedfontobject.normalizer.imageReferences
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/m.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/m.glif
new file mode 100644
index 000000000..831f4270a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/m.glif
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 427 71
+ vstem 82 82
+ vstem 377 82
+ vstem 671 82
+
+
+
+ pointTag
+ hintSet0016
+ stems
+
+ hstem 21 -21
+ hstem 427 71
+ vstem 82 71.5
+ vstem 377 82
+ vstem 671 82
+
+
+
+ pointTag
+ hintSet0018
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ vstem 82 71.5
+ vstem 377 82
+ vstem 671 82
+
+
+
+ pointTag
+ hintSet0019
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ vstem 82 82
+ vstem 377 82
+ vstem 671 82
+
+
+
+ id
+ 3b9e4f00ba853ad386333eb5397d3500c2249a1aee7560539f19ae61388dc968b4b8fbf041ac6df813d780fac7475492e479876b7b6b65c305a4d1f1e769f78b
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/n.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/n.glif
new file mode 100644
index 000000000..a881a08a3
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/n.glif
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 427 71
+ vstem 82 82
+ vstem 389 82
+
+
+
+ pointTag
+ hintSet0009
+ stems
+
+ hstem 21 -21
+ hstem 427 71
+ vstem 82 71.5
+ vstem 389 82
+
+
+
+ pointTag
+ hintSet0011
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ vstem 82 71.5
+ vstem 389 82
+
+
+
+ pointTag
+ hintSet0012
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ vstem 82 82
+ vstem 389 82
+
+
+
+ id
+ 4dacebc2e4a36de6894e4266ab6f54942efba0079d5308f92c1e0b8b9aaefe3759645b28c80aff54e2042af9684e83326a5c8801b4f46439ca1ae1b6f1609afe
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/nine.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/nine.glif
new file mode 100644
index 000000000..be568d85b
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/nine.glif
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 68
+ hstem 248 62
+ hstem 585 65
+ vstem 40 77
+ vstem 371 77
+
+
+
+ id
+ 624954a2e8e85eabe694968c1fe2f6e6b2552c76fd18a5047a705ea1242e714d9902fbc5e43e4137df586d1bd2e2c18e90081ad8e8e33a45987fb89e8eb00538
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/o.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/o.glif
new file mode 100644
index 000000000..4964a1409
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/o.glif
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 68
+ hstem 430 68
+ vstem 46 85
+ vstem 411 85
+
+
+
+ id
+ 2037c95e920bcdfd3f908084912058c14a44570b6c2c7a25ec29e43edc1ef2ed70cb35521349392e9eed4234d2049f8151f2daa880d68acfb81bb8ae72507a0e
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/one.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/one.glif
new file mode 100644
index 000000000..1c23c49fc
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/one.glif
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 68
+ hstem 538 100
+ vstem 225 82
+
+
+
+ pointTag
+ hintSet0006
+ stems
+
+ hstem 0 68
+ hstem 538 100
+ vstem 109 198
+
+
+
+ pointTag
+ hintSet0008
+ stems
+
+ hstem 0 68
+ hstem 538 100
+ vstem 225 82
+
+
+
+ id
+ w497l790l4390l43968l30768l307638l244638209617167601c109591l109538l225538l22568l7968
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/p.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/p.glif
new file mode 100644
index 000000000..aebed9008
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/p.glif
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -184 -21
+ hstem -12 69
+ hstem 429 69
+ vstem 82 82
+ vstem 422 85
+
+
+
+ pointTag
+ hintSet0004
+ stems
+
+ hstem -184 -21
+ hstem -12 69
+ hstem 429 69
+ vstem 82 71.5
+ vstem 422 85
+
+
+
+ pointTag
+ hintSet0006
+ stems
+
+ hstem -184 -21
+ hstem -12 69
+ hstem 486 -20
+ vstem 82 71.5
+ vstem 422 85
+
+
+
+ pointTag
+ hintSet0007
+ stems
+
+ hstem -184 -21
+ hstem -12 69
+ hstem 486 -20
+ vstem 82 82
+ vstem 422 85
+
+
+
+ pointTag
+ hintSet0012
+ stems
+
+ hstem -184 -21
+ hstem -12 69
+ hstem 429 69
+ vstem 82 82
+ vstem 422 85
+
+
+
+ pointTag
+ hintSet0016
+ stems
+
+ hstem -184 -21
+ hstem -12 69
+ hstem 486 -20
+ vstem 82 82
+ vstem 422 85
+
+
+
+ id
+ 6d450729f1a6079bb8d9954843e00919ca3d72c7f8782aaf0ed42f43a9701d93109d3a9338789321961977e93f641f127bfb9141ef3efdf59f1f6d84ccfe300a
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/q.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/q.glif
new file mode 100644
index 000000000..a64cb64af
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/q.glif
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -184 -21
+ hstem -12 69
+ hstem 429 69
+ vstem 47 85
+ vstem 390 83
+
+
+
+ pointTag
+ hintSet0006
+ stems
+
+ hstem -184 -21
+ hstem -12 69
+ hstem 486 -20
+ vstem 47 85
+ vstem 390 83
+
+
+
+ pointTag
+ hintSet0007
+ stems
+
+ hstem -184 -21
+ hstem -12 69
+ hstem 486 -20
+ vstem 47 85
+ vstem 403 70
+
+
+
+ pointTag
+ hintSet0008
+ stems
+
+ hstem -184 -21
+ hstem -12 69
+ hstem 429 69
+ vstem 47 85
+ vstem 403 70
+
+
+
+ pointTag
+ hintSet0011
+ stems
+
+ hstem -184 -21
+ hstem -12 69
+ hstem 429 69
+ vstem 47 85
+ vstem 390 83
+
+
+
+ id
+ d1a20d9995f400e77024d8da1f777ccfc29d009a03e611d4629982d2782edc0c74fac0cc08cfb05a6a473abdb2963e3a2b50e6d30428f48cd3834b5003881639
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/r.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/r.glif
new file mode 100644
index 000000000..0ad68606a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/r.glif
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 424 74
+ vstem 82 82
+
+
+
+ pointTag
+ hintSet0005
+ stems
+
+ hstem 21 -21
+ hstem 488 -20
+ vstem 82 82
+
+
+
+ pointTag
+ hintSet0006
+ stems
+
+ hstem 21 -21
+ hstem 424 74
+ vstem 82 71.5
+
+
+
+ pointTag
+ hintSet0009
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ vstem 82 71.5
+
+
+
+ pointTag
+ hintSet0010
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ vstem 82 82
+
+
+
+ id
+ w347l820l1640l164312197394246424c287424307424318421c334416l350488334495319498c298498243498193459c160398l157398l150486l82486
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/s.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/s.glif
new file mode 100644
index 000000000..6ac03de00
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/s.glif
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 64
+ hstem 434 64
+ vstem 52 79
+ vstem 308 79
+
+
+
+ id
+ 7fd2b86537597dcc96d8ace3e8130b479e6aa111fe881941fc608d8a33d6ba55054227577bc12c03eac1616e29d3b106219bc5c10d0208b2414a901392aca743
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/seven.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/seven.glif
new file mode 100644
index 000000000..f50297c02
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/seven.glif
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 567 71
+ vstem 177 85
+
+
+
+ id
+ w497c1770l2620273249304394c455587l455638l44638l44567l362567236392188240
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/six.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/six.glif
new file mode 100644
index 000000000..b2ca4498e
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/six.glif
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 65
+ hstem 328 62
+ hstem 581 69
+ vstem 48 78
+ vstem 379 78
+
+
+
+ pointTag
+ hintSet0001
+ stems
+
+ hstem -12 65
+ hstem 328 62
+ hstem 581 69
+ vstem 48 80
+ vstem 379 78
+
+
+
+ pointTag
+ hintSet0004
+ stems
+
+ hstem -12 65
+ hstem 328 62
+ hstem 581 69
+ vstem 48 78
+ vstem 379 78
+
+
+
+ pointTag
+ hintSet0005
+ stems
+
+ hstem -12 65
+ hstem 328 62
+ hstem 582 -20
+ vstem 48 78
+ vstem 379 78
+
+
+
+ pointTag
+ hintSet0006
+ stems
+
+ hstem -12 65
+ hstem 328 62
+ hstem 581 69
+ vstem 48 78
+ vstem 379 78
+
+
+
+ id
+ fd7a526bd2bf1c598e866b370dd7922a889f04934dadd38642fd43769fcd873f5f8eee10e8762538401ba53ea4a64b314ae3be5e6478acff2d7f621bb3abce7c
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/t.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/t.glif
new file mode 100644
index 000000000..298bb3dea
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/t.glif
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 67
+ hstem 419 67
+ vstem 96 83
+
+
+
+ pointTag
+ hintSet0011
+ stems
+
+ hstem -12 67
+ hstem 419 67
+ vstem 105 74
+
+
+
+ pointTag
+ hintSet0013
+ stems
+
+ hstem -12 67
+ hstem 419 67
+ vstem 96 83
+
+
+
+ id
+ 724ba96fc10dd34314ce80f33ee7f51f2cc5252585423f67c37b9737018e0db656596c66474da9f956188ee6a9fd41bb10512f18eb7995ef7cd2fd5296e6bb39
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/three.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/three.glif
new file mode 100644
index 000000000..925e8af1f
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/three.glif
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 68
+ hstem 300 63
+ hstem 583 67
+ vstem 159 149
+ vstem 363 83
+
+
+
+ pointTag
+ hintSet0005
+ stems
+
+ hstem -12 68
+ hstem 300 63
+ hstem 583 67
+ vstem 159 149
+ vstem 340 84
+
+
+
+ pointTag
+ hintSet0013
+ stems
+
+ hstem -12 68
+ hstem 300 63
+ hstem 583 67
+ vstem 159 149
+ vstem 363 83
+
+
+
+ id
+ 4886be41730003bb47d4f647a8518b764191efa3aa83d8c1e446747e7555c20855396dcf9fd2f40b71f7306c69dffbe346cc524384e6cad216cb5566ce2a1df3
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/two.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/two.glif
new file mode 100644
index 000000000..f0f250d21
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/two.glif
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 71
+ hstem 583 67
+ vstem 340 80
+
+
+
+ id
+ 24d026b252c7d6d2a030d2eaa6c19ad8a506205e6c16e8ec89a9967bd35b58d9f8c2be1b78051ab418a93e3ec97b389eb9d038fd723d1e0c983c58d6fd0ca939
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/u.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/u.glif
new file mode 100644
index 000000000..9331e38e6
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/u.glif
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 71
+ hstem 486 -20
+ vstem 75 83
+ vstem 380 82
+
+
+
+ pointTag
+ hintSet0002
+ stems
+
+ hstem -12 71
+ hstem 486 -20
+ vstem 75 83
+ vstem 390.5 71.5
+
+
+
+ pointTag
+ hintSet0004
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ vstem 75 83
+ vstem 390.5 71.5
+
+
+
+ pointTag
+ hintSet0005
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ vstem 75 83
+ vstem 380 82
+
+
+
+ pointTag
+ hintSet0008
+ stems
+
+ hstem -12 71
+ hstem 486 -20
+ vstem 75 83
+ vstem 380 82
+
+
+
+ id
+ w544l751787554121-12c224-12291-1233923c38476l38776l3940l4620l462486l380486l3801413348429959c249591855915898c158189l158486l75486
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/v.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/v.glif
new file mode 100644
index 000000000..2e290ca60
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/v.glif
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 67
+ hstem 486 -20
+ vstem 12 443
+
+
+
+ id
+ w467l1870l2830l455486l374486l282210268162252113c23867l23467219113203162c189210l97486l12486
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/w.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/w.glif
new file mode 100644
index 000000000..0a2099d33
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/w.glif
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 70
+ hstem 401 85
+ vstem 24 670
+
+
+
+ id
+ 2ea4b8a7d7ff3087d4b143fb61ccd52c7bbefea83f2621ea83acd290d608f5420f5901acf12c09a90c698706b59069e9a9cd491b25e1bb843870e856b5f96517
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/x.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/x.glif
new file mode 100644
index 000000000..7360aaad0
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/x.glif
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 21 -21
+ hstem 486 -20
+ vstem 14 418
+
+
+
+ id
+ c60e1f49a95ba6875b061ad4c854be857877f9b16c1d60ca4ac6242f348cf7f442c9d38142b5acffaf12f7bdce56e5683edf22841a773b2d1e380160313d2687
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/y.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/y.glif
new file mode 100644
index 000000000..f790db553
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/y.glif
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -209 68
+ hstem 486 -20
+ vstem 12 443
+
+
+
+ id
+ d14e2d31ca4e240c0b5c0130ab5367c49328b53fbb3dbe6843e4850856ec272cba1630455ed6acfb3f4185d8e3b4707964fae99e2d3bf183f41c17ea7db51987
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/z.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/z.glif
new file mode 100644
index 000000000..190d76642
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/z.glif
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem 0 67
+ hstem 419 67
+ vstem 31 368
+
+
+
+ id
+ w425l310l3990l39967l13567l391442l391486l59486l59419l287419l3144
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/zero.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/zero.glif
new file mode 100644
index 000000000..f56a61bf6
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs.com.adobe.type.processedglyphs/zero.glif
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.adobe.type.autohint.v2
+
+ hintSetList
+
+
+ pointTag
+ hintSet0000
+ stems
+
+ hstem -12 66
+ hstem 584 66
+ vstem 44 80
+ vstem 373 80
+
+
+
+ id
+ d8c77fb9b3c0f9a266a500cc9a55d0b870a270cc6affab1f87696fc531c727c150c60060200509eb3bb0279a21a90b4245e39bb9992f482674cec535549888b2
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/A_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/A_.glif
new file mode 100644
index 000000000..56dbc8216
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/A_.glif
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/C_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/C_.glif
new file mode 100644
index 000000000..a051143e7
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/C_.glif
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/D_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/D_.glif
new file mode 100644
index 000000000..764059851
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/D_.glif
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/E_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/E_.glif
new file mode 100644
index 000000000..b06bd2f68
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/E_.glif
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/F_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/F_.glif
new file mode 100644
index 000000000..8e0247813
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/F_.glif
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/G_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/G_.glif
new file mode 100644
index 000000000..157853617
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/G_.glif
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/H_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/H_.glif
new file mode 100644
index 000000000..c045fdd5a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/H_.glif
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/I_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/I_.glif
new file mode 100644
index 000000000..6c293ec1f
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/I_.glif
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/J_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/J_.glif
new file mode 100644
index 000000000..c3efea7a6
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/J_.glif
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/K_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/K_.glif
new file mode 100644
index 000000000..b94b0c205
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/K_.glif
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/L_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/L_.glif
new file mode 100644
index 000000000..246aec150
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/L_.glif
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/M_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/M_.glif
new file mode 100644
index 000000000..202af9514
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/M_.glif
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/N_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/N_.glif
new file mode 100644
index 000000000..48c6f6298
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/N_.glif
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/O_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/O_.glif
new file mode 100644
index 000000000..f66477568
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/O_.glif
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/P_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/P_.glif
new file mode 100644
index 000000000..c6dce3416
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/P_.glif
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/Q_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/Q_.glif
new file mode 100644
index 000000000..90c1d4438
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/Q_.glif
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/R_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/R_.glif
new file mode 100644
index 000000000..3b0d12ba7
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/R_.glif
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/S_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/S_.glif
new file mode 100644
index 000000000..aba82a3d8
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/S_.glif
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/T_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/T_.glif
new file mode 100644
index 000000000..6dc3a6efa
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/T_.glif
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/U_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/U_.glif
new file mode 100644
index 000000000..4fc9735ee
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/U_.glif
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/V_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/V_.glif
new file mode 100644
index 000000000..ae86fdba6
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/V_.glif
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/W_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/W_.glif
new file mode 100644
index 000000000..7f5d981f8
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/W_.glif
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/X_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/X_.glif
new file mode 100644
index 000000000..73572813e
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/X_.glif
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/Y_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/Y_.glif
new file mode 100644
index 000000000..d38492faa
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/Y_.glif
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/Z_.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/Z_.glif
new file mode 100644
index 000000000..6163ef88e
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/Z_.glif
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/_notdef.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/_notdef.glif
new file mode 100644
index 000000000..0732d24b2
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/_notdef.glif
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/a.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/a.glif
new file mode 100644
index 000000000..20d872e2f
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/a.glif
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/b.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/b.glif
new file mode 100644
index 000000000..197fc0c2c
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/b.glif
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/c.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/c.glif
new file mode 100644
index 000000000..e91743302
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/c.glif
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/contents.plist b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/contents.plist
new file mode 100644
index 000000000..864544c60
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/contents.plist
@@ -0,0 +1,132 @@
+
+
+
+
+ .notdef
+ _notdef.glif
+ A
+ A_.glif
+ C
+ C_.glif
+ D
+ D_.glif
+ E
+ E_.glif
+ F
+ F_.glif
+ G
+ G_.glif
+ H
+ H_.glif
+ I
+ I_.glif
+ J
+ J_.glif
+ K
+ K_.glif
+ L
+ L_.glif
+ M
+ M_.glif
+ N
+ N_.glif
+ O
+ O_.glif
+ P
+ P_.glif
+ Q
+ Q_.glif
+ R
+ R_.glif
+ S
+ S_.glif
+ T
+ T_.glif
+ U
+ U_.glif
+ V
+ V_.glif
+ W
+ W_.glif
+ X
+ X_.glif
+ Y
+ Y_.glif
+ Z
+ Z_.glif
+ a
+ a.glif
+ b
+ b.glif
+ c
+ c.glif
+ d
+ d.glif
+ e
+ e.glif
+ eight
+ eight.glif
+ f
+ f.glif
+ five
+ five.glif
+ four
+ four.glif
+ g
+ g.glif
+ h
+ h.glif
+ i
+ i.glif
+ j
+ j.glif
+ k
+ k.glif
+ l
+ l.glif
+ m
+ m.glif
+ n
+ n.glif
+ nine
+ nine.glif
+ o
+ o.glif
+ one
+ one.glif
+ p
+ p.glif
+ q
+ q.glif
+ r
+ r.glif
+ s
+ s.glif
+ seven
+ seven.glif
+ six
+ six.glif
+ space
+ space.glif
+ t
+ t.glif
+ three
+ three.glif
+ two
+ two.glif
+ u
+ u.glif
+ v
+ v.glif
+ w
+ w.glif
+ x
+ x.glif
+ y
+ y.glif
+ z
+ z.glif
+ zero
+ zero.glif
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/d.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/d.glif
new file mode 100644
index 000000000..94f8e71f8
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/d.glif
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/e.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/e.glif
new file mode 100644
index 000000000..db2cbf13f
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/e.glif
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/eight.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/eight.glif
new file mode 100644
index 000000000..a8e044728
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/eight.glif
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/f.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/f.glif
new file mode 100644
index 000000000..7eaba0d14
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/f.glif
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/five.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/five.glif
new file mode 100644
index 000000000..a9fc7d224
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/five.glif
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/four.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/four.glif
new file mode 100644
index 000000000..469fc2eec
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/four.glif
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/g.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/g.glif
new file mode 100644
index 000000000..c2f630c4a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/g.glif
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/h.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/h.glif
new file mode 100644
index 000000000..af38a9e62
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/h.glif
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/i.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/i.glif
new file mode 100644
index 000000000..26694f39d
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/i.glif
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/j.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/j.glif
new file mode 100644
index 000000000..049d87f9a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/j.glif
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/k.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/k.glif
new file mode 100644
index 000000000..96d5e8863
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/k.glif
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/l.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/l.glif
new file mode 100644
index 000000000..4f867ae83
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/l.glif
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/layerinfo.plist b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/layerinfo.plist
new file mode 100644
index 000000000..7cc969341
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/layerinfo.plist
@@ -0,0 +1,14 @@
+
+
+
+
+ color
+ 1,0.75,0,0.7
+ lib
+
+ org.unifiedfontobject.normalizer.imageReferences
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/m.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/m.glif
new file mode 100644
index 000000000..183824c5a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/m.glif
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/n.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/n.glif
new file mode 100644
index 000000000..f8c1bcfab
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/n.glif
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/nine.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/nine.glif
new file mode 100644
index 000000000..611ff422a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/nine.glif
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/o.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/o.glif
new file mode 100644
index 000000000..04eb4b2c8
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/o.glif
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/one.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/one.glif
new file mode 100644
index 000000000..57fa5f5dd
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/one.glif
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/p.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/p.glif
new file mode 100644
index 000000000..52939c6a6
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/p.glif
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/q.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/q.glif
new file mode 100644
index 000000000..405bf97e2
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/q.glif
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/r.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/r.glif
new file mode 100644
index 000000000..576ed615d
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/r.glif
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/s.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/s.glif
new file mode 100644
index 000000000..d2d236bf7
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/s.glif
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/seven.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/seven.glif
new file mode 100644
index 000000000..74534293f
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/seven.glif
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/six.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/six.glif
new file mode 100644
index 000000000..fb35437dc
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/six.glif
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/space.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/space.glif
new file mode 100644
index 000000000..5b98e781a
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/space.glif
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/t.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/t.glif
new file mode 100644
index 000000000..ca8cca274
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/t.glif
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/three.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/three.glif
new file mode 100644
index 000000000..8bf93f9e3
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/three.glif
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/two.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/two.glif
new file mode 100644
index 000000000..239397fd2
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/two.glif
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/u.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/u.glif
new file mode 100644
index 000000000..b2c6ee1f4
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/u.glif
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/v.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/v.glif
new file mode 100644
index 000000000..f65f651f1
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/v.glif
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/w.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/w.glif
new file mode 100644
index 000000000..4b46b8922
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/w.glif
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/x.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/x.glif
new file mode 100644
index 000000000..6df2fab13
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/x.glif
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/y.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/y.glif
new file mode 100644
index 000000000..02cc6d634
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/y.glif
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/z.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/z.glif
new file mode 100644
index 000000000..4632d3a1d
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/z.glif
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/glyphs/zero.glif b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/zero.glif
new file mode 100644
index 000000000..a75a769b7
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/glyphs/zero.glif
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/layercontents.plist b/tests/tx_data/input/alt-missing-glif.ufo/layercontents.plist
new file mode 100644
index 000000000..12949b6fb
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/layercontents.plist
@@ -0,0 +1,14 @@
+
+
+
+
+
+ foreground
+ glyphs
+
+
+ com.adobe.type.processedglyphs
+ glyphs.com.adobe.type.processedglyphs
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/lib.plist b/tests/tx_data/input/alt-missing-glif.ufo/lib.plist
new file mode 100644
index 000000000..2349d17ad
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/lib.plist
@@ -0,0 +1,91 @@
+
+
+
+
+ com.typemytype.robofont.compileSettings.autohint
+
+ com.typemytype.robofont.compileSettings.checkOutlines
+
+ com.typemytype.robofont.compileSettings.createDummyDSIG
+
+ com.typemytype.robofont.compileSettings.decompose
+
+ com.typemytype.robofont.compileSettings.generateFormat
+ 0
+ com.typemytype.robofont.compileSettings.releaseMode
+
+ com.typemytype.robofont.italicSlantOffset
+ 0
+ com.typemytype.robofont.segmentType
+ curve
+ com.typemytype.robofont.shouldAddPointsInSplineConversion
+ 1
+ public.glyphOrder
+
+ .notdef
+ space
+ A
+ B
+ C
+ D
+ E
+ F
+ G
+ H
+ I
+ J
+ K
+ L
+ M
+ N
+ O
+ P
+ Q
+ R
+ S
+ T
+ U
+ V
+ W
+ X
+ Y
+ Z
+ a
+ b
+ c
+ d
+ e
+ f
+ g
+ h
+ i
+ j
+ k
+ l
+ m
+ n
+ o
+ p
+ q
+ r
+ s
+ t
+ u
+ v
+ w
+ x
+ y
+ z
+ zero
+ one
+ two
+ three
+ four
+ five
+ six
+ seven
+ eight
+ nine
+
+
+
diff --git a/tests/tx_data/input/alt-missing-glif.ufo/metainfo.plist b/tests/tx_data/input/alt-missing-glif.ufo/metainfo.plist
new file mode 100644
index 000000000..555d9ce4c
--- /dev/null
+++ b/tests/tx_data/input/alt-missing-glif.ufo/metainfo.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ creator
+ com.github.fonttools.ufoLib
+ formatVersion
+ 3
+
+
diff --git a/tests/tx_test.py b/tests/tx_test.py
index ec02918fe..4cf027d8a 100644
--- a/tests/tx_test.py
+++ b/tests/tx_test.py
@@ -1648,3 +1648,23 @@ def test_bug1641_wrong_glyphorder():
expected_path = generate_ps_dump(expected_path)
output_path = generate_ps_dump(output_path)
assert differ([expected_path, output_path, '-s', PFA_SKIP[0]])
+
+
+def test_alt_missing_glyph():
+ """
+ Test case where alt layer has a glyph that default layer doesn't.
+ """
+ msg = (b"tx: (ufr) Warning: glyph 'B' is in the processed layer"
+ b" but not in the default layer.")
+ input_path = get_input_path("alt-missing-glif.ufo")
+ expected_path = get_expected_path("alt-missing-glif.pfb")
+ output_path = get_temp_file_path()
+ arg = CMD + ['-s', '-e', '-a', '-o', 't1', '-f',
+ input_path, output_path]
+ stderr_path = runner(arg)
+ with open(stderr_path, 'rb') as f:
+ output = f.read()
+ assert msg in output
+ expected_path = generate_ps_dump(expected_path)
+ output_path = generate_ps_dump(output_path)
+ assert differ([expected_path, output_path])