diff --git a/README.md b/README.md index d028223..c4f891e 100644 --- a/README.md +++ b/README.md @@ -28,3 +28,9 @@ xcodebuild -project beatygril/beatygril.xcodeproj -scheme 'Wrapper Application' 瘦脸现固定使用Vision revision 3的76点配置,以17组轮廓到鼻部/瞳孔锚点的局部逆向采样替代脸框水平挤压,包含原版尺寸增益与滑块强度映射。完整点阵贯通实时稳定与离线存储;旧分析记录没有完整76点时跳过瘦脸,重新分析可补齐。其他脸型项仍使用原有近似实现,不能将本次对齐扩张为全部脸型逐像素等价。 离屏验证新增224项:含48组脸部投影/尺寸/歪头与独立17-pin数值场对照、数据恢复和缺点保护;完整回归604项通过。Motion/FCP界面由用户自测。可运行 `python3 scripts/deliver.py --wait-for-hosts --user-tests`,签名公证后只读等待宿主自然退出,安装验证与清理无需操作宿主界面。 + +## 1.0.6 下巴与图像坐标修复 + +下巴改为76点中68→38、67→37、66→36的三组局部位移,正值上收、负值延伸,保留原版正负不同系数及尺寸增益。Core Image/IOSurface输入输出移除按TOP_LEFT额外翻转,和原版图像链对齐。修复依据与离屏复现见[下巴与坐标分析](docs/analysis/下巴与坐标分析.md)。七类其余脸型项仍是近似实现。 + +旧版分析记录无法区分是否包含额外翻转,新版保留原字符串但暂用实时跟随;重新分析即可写入新坐标标记并恢复离线跟踪。最终Motion/FCP画面由用户自行测试。 diff --git a/Templates/大鱼人像美化/README.md b/Templates/大鱼人像美化/README.md index 46cf59f..ea3c608 100644 --- a/Templates/大鱼人像美化/README.md +++ b/Templates/大鱼人像美化/README.md @@ -1,6 +1,6 @@ # 大鱼人像美化 FCP 效果模板 -版本:1.0.5。滤镜 UUID:`FB14B0E6-59B2-4836-916F-CD0C559E9241`。模板必须与已安装的大鱼人像美化 FxPlug APP 配套使用。 +版本:1.0.6。滤镜 UUID:`FB14B0E6-59B2-4836-916F-CD0C559E9241`。模板必须与已安装的大鱼人像美化 FxPlug APP 配套使用。 ## 默认数值 @@ -33,3 +33,5 @@ Apple项目、群组、Effect Source和滤镜节点骨架来源于用户自有 本次已经静态核验Source Media→clip→相对文件链存在、文件字节一致、48项发布仍解析、隐藏数据未发布和保存选择状态;修复后已在FCP独立验收项目新增实例,确认输入替换、实际人像和提亮画面正常;Mix=0逐字节直通由宿主适配器IOSurface回归测试覆盖,未将其混称为FCP截图逐像素核验。 1.0.5将瘦脸改为76点驱动的17组局部位移,供用户在Motion/FCP自测最大瘦脸与转脸。旧跟踪记录若没有全点阵,需重新分析后才有瘦脸,或关闭“使用跟踪数据”采用当前帧自动检测。 + +1.0.6移除Core Image/IOSurface链按宿主原点重复翻转,修正下巴三组局部位移及正负方向。旧版未标记坐标空间的分析记录保留但不再重放,自动回退实时跟随;需要离线记录时重新分析当前目标。 diff --git a/Templates/大鱼人像美化/VALIDATION.json b/Templates/大鱼人像美化/VALIDATION.json index d8c73b9..34d2a1c 100644 --- a/Templates/大鱼人像美化/VALIDATION.json +++ b/Templates/大鱼人像美化/VALIDATION.json @@ -1,6 +1,6 @@ { - "version": "1.0.5", - "sha256": "ba08de6916cd837b3733aa0c6fcb78f2e8224431d25e1310089ae67d18445f2d", + "version": "1.0.6", + "sha256": "30ca8edf36801264c5de2c753c40b720aba8052633620713a12401098fcd2409", "filterUUID": "FB14B0E6-59B2-4836-916F-CD0C559E9241", "publishedFunctionalControls": 46, "informationalControls": 2, @@ -27,8 +27,9 @@ "date": "2026-10-21", "FCP": "Restored input-chain template shows supplied real video; effect parameters and forward analysis responded in independent QA project.", "Motion": "1.0.4 installed formal app loaded the real-video QA project and rendered brightness/geometry with a primary box at different playhead positions; offline tracking disabled.", - "scope": "1.0.5 native visual QA is reserved for user self-testing; no Motion/FCP UI operations in the slimming repair. Historical input/brightness validation remains scoped to prior releases.", - "version105": "Formal 1.0.5 (7) signed/notarized/stapled/installed and PluginKit formal path verified. User closed hosts before replacement; no Motion/FCP UI operated. Native visual testing pending user." + "scope": "1.0.6 coordinate/chin repair native visual QA is reserved for user self-testing; no Motion/FCP UI operations. Historical host tests remain scoped to their versions.", + "version105": "Formal 1.0.5 (7) signed/notarized/stapled/installed and PluginKit formal path verified. User closed hosts before replacement; no Motion/FCP UI operated. Native visual testing pending user.", + "version106": "Source repair under validation, not yet installed." }, "slimValidation": { "offlineFullChecks": 604, @@ -36,5 +37,19 @@ "extraRealVideoASanChecks": 264, "sampledVideoFrames": 11, "maxUVOracleError": 1.09828022e-05 + }, + "coordinateChinValidation": { + "offlineFullChecks": 904, + "thinChinChecks": 394, + "hostAdapterChecksASan": 247, + "oscChecksASan": 98, + "extraRealVideoASanChecks": 494, + "sampledVideoFrames": 11, + "independentAnatomicalChecks": 12, + "originCombinations": 16, + "allOriginTagsPixelIdentical": true, + "maxByteErrorVsIndependentCIReference": 2, + "maxUVOracleError": 1.09828022e-05, + "nativeVisualQA": "pending user" } } diff --git a/Templates/大鱼人像美化/大鱼人像美化.moef b/Templates/大鱼人像美化/大鱼人像美化.moef index f68569a..9811823 100644 --- a/Templates/大鱼人像美化/大鱼人像美化.moef +++ b/Templates/大鱼人像美化/大鱼人像美化.moef @@ -46,7 +46,7 @@ 1 - 大鱼人像美化 1.0.5:人像磨皮、肤色、脸型、五官保护和三目标人脸跟踪。模板中频磨皮默认为50%。 + 大鱼人像美化 1.0.6:人像磨皮、肤色、脸型、五官保护和三目标人脸跟踪。模板中频磨皮默认为50%。 1920 @@ -298,7 +298,7 @@ - + 8589934608 diff --git a/beatygril/beatygril/Plugin/Info.plist b/beatygril/beatygril/Plugin/Info.plist index 95542fa..9baedf9 100644 --- a/beatygril/beatygril/Plugin/Info.plist +++ b/beatygril/beatygril/Plugin/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 1.0.5 + 1.0.6 CFBundleVersion - 7 + 8 NSHumanReadableCopyright PlugInKit @@ -72,7 +72,7 @@ uuid FB14B0E6-59B2-4836-916F-CD0C559E9241 version - 1.0.5 + 1.0.6 className @@ -84,7 +84,7 @@ uuid E0E432C8-3D71-4ABA-B006-E7F519E06C87 version - 1.0.5 + 1.0.6 protocolNames FxOnScreenControl diff --git a/beatygril/beatygril/Plugin/beatygrilPlugIn.m b/beatygril/beatygril/Plugin/beatygrilPlugIn.m index 3f14895..c3255e6 100644 --- a/beatygril/beatygril/Plugin/beatygrilPlugIn.m +++ b/beatygril/beatygril/Plugin/beatygrilPlugIn.m @@ -52,15 +52,29 @@ static BOOL PGFail(NSError **error, NSString *message) { userInfo:@{NSLocalizedDescriptionKey:message}]; return NO; } +static NSString * const PGHostCoordinateSpace = @"iosurface-ci-y-up-v1"; +static BOOL PGCompatibleHostTrack(NSData *data) { + if (!data.length || data.length > 128*1024*1024) return NO; + NSDictionary *archive = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:nil error:nil]; + return [archive isKindOfClass:NSDictionary.class] && [archive[@"hostCoordinateSpace"] isEqual:PGHostCoordinateSpace]; +} +static NSData *PGMarkHostTrack(NSData *data) { + if (!data) return nil; + NSMutableDictionary *archive = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainers format:nil error:nil]; + if (![archive isKindOfClass:NSMutableDictionary.class]) return nil; + archive[@"hostCoordinateSpace"] = PGHostCoordinateSpace; + return [NSPropertyListSerialization dataWithPropertyList:archive format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil]; +} static CIImage *PGImageFromTile(FxImageTile *tile) { if (!tile.ioSurface) return nil; // The host already supplies video-gamma RGB. Keep those numeric values in // every stage; implicit Core Image linearization changes mask thresholds. NSDictionary *options = @{kCIImageColorSpace:NSNull.null}; CIImage *image = [CIImage imageWithIOSurface:(__bridge IOSurfaceRef)tile.ioSurface options:options]; - if (tile.imageOrigin == kFxImageOrigin_TOP_LEFT) { - image = [image imageByApplyingTransform:CGAffineTransformMake(1,0,0,-1,0,image.extent.size.height)]; - } + // Match the reference's CI/IOSurface path. imageOrigin describes the host's + // coordinate axes; it is not an instruction to reverse IOSurface scanlines. + // An extra input/output flip can hide in passthrough while inverting faces + // inside Vision and the analytic shape/mask stages. FxRect b = tile.tilePixelBounds; return [image imageByApplyingTransform:CGAffineTransformMakeTranslation(b.left,b.bottom)]; } @@ -76,6 +90,7 @@ static CIImage *PGImageFromTile(FxImageTile *tile) { @property BOOL analyzing; @property BOOL analysisForward; @property (strong) NSArray *loadedTracks; +@property uint32_t compatibleTrackMask; @property BOOL reportedRender; @end @@ -239,13 +254,22 @@ static CIImage *PGImageFromTile(FxImageTile *tile) { @synchronized(_faceProcessor) { NSArray *tracks=plist[@"tracks"]; if(![tracks isKindOfClass:NSArray.class]||tracks.count!=3) return PGFail(error,@"跟踪状态无效。"); + for(id track in tracks) if(![track isKindOfClass:NSString.class]) return PGFail(error,@"跟踪记录无效。"); if(![_loadedTracks isEqualToArray:tracks]) { + _compatibleTrackMask=0; for(NSUInteger i=0;i<3;i++) { - if(![tracks[i] isKindOfClass:NSString.class]) return PGFail(error,@"跟踪记录无效。"); - [_faceProcessor setTrackingData:[[NSData alloc] initWithBase64EncodedString:tracks[i] options:0] forTarget:i]; + NSData *data=[[NSData alloc] initWithBase64EncodedString:tracks[i] options:0]; + BOOL compatible=PGCompatibleHostTrack(data); + if(compatible) _compatibleTrackMask |= 1u< api=[_apiManager apiForProtocol:@protocol(FxParameterSettingAPI_v5)]; NSData *data=nil; @synchronized(_analysisFaceProcessor) {data=[_analysisFaceProcessor trackingDataForTarget:_analysisSettings.targetIndex];} + data=PGMarkHostTrack(data); @synchronized(_faceProcessor) {_loadedTracks=nil;} if(data.length>64*1024*1024) { _analyzing=NO; diff --git a/beatygril/beatygril/Wrapper Application/Info.plist b/beatygril/beatygril/Wrapper Application/Info.plist index a1fe6cd..7e30af8 100644 --- a/beatygril/beatygril/Wrapper Application/Info.plist +++ b/beatygril/beatygril/Wrapper Application/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0.5 + 1.0.6 CFBundleVersion - 7 + 8 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright diff --git a/docs/analysis/chin-report.json b/docs/analysis/chin-report.json index 254a262..4521199 100644 --- a/docs/analysis/chin-report.json +++ b/docs/analysis/chin-report.json @@ -39,12 +39,28 @@ "face": 116, "thin_chin": 394, "failures": 0, - "maximum_uv_oracle_error": 1.09828022e-05 + "maximum_uv_oracle_error": 1.09828022e-05, + "realVideoASanChecks": 494, + "realVideoFrames": 11, + "independentAnatomicalChecks": 12, + "fullChecks": 904, + "hostAdapterASanChecks": 247, + "oscASanChecks": 98, + "allOriginTagsPixelIdentical": true, + "maxByteErrorVsIndependentCIReference": 2 }, "limitations": [ "Seven other shape controls remain approximations.", "Combined analytic controls and multi-face resampling order is not fully reference equivalent.", - "FxPlug adapter imageOrigin handling is under separate investigation.", "Motion/FCP final visual validation is reserved for user." - ] + ], + "adapterCorrection": { + "change": "remove imageOrigin-based input/output flips to match reference CI/IOSurface path", + "legacyTrackPolicy": "preserve unmarked strings but use realtime follow; reanalysis writes hostCoordinateSpace=iosurface-ci-y-up-v1", + "referenceOutputEvidence": [ + "ev_88a71ec62fade296495f1e3f5428cdb15ad4cda43866e09fb040fa3a4bdb0440", + "ev_110d76f7958decb0c56b7daafe292d60a8bc56cd035b40a997f61395cb91ebfe" + ], + "nativeBufferCaptured": false + } } diff --git a/docs/analysis/rea-image-orientation.json b/docs/analysis/rea-image-orientation.json new file mode 100644 index 0000000..ba97743 --- /dev/null +++ b/docs/analysis/rea-image-orientation.json @@ -0,0 +1,11758 @@ +{ + "schema": "paintfcp-read-only-image-orientation-evidence-v1", + "artifact": { + "path": "/Applications/MSE18V2.app", + "analyzed_arm64_sha256": "f01e8c0b7e2676b2961950b0e48efdd2589af218e4b36de7d39f5d1c76852bfb" + }, + "scope": "Static shipped-artifact output-helper analysis. No application execution, host capture, private frame, source media, face observation or live face coordinates are included.", + "observations": [ + { + "claim": "The CIImage input is constructed from IOSurface or MTLTexture with a one-entry kCIImageColorSpace options dictionary. The provided render body applies only extent scale and translation, with no orientation/flip transform.", + "source": "saved REA pseudocode /tmp/paintfcp-original-render.c", + "source_lines": [ + [ + 358, + 381 + ], + [ + 418, + 455 + ] + ], + "source_sha256": "b531c5f870ce90c0106c75c5e41db8938b5619bb96486fac51c18ba9cc94ab47" + }, + { + "claim": "0x10002911c forwards the unchanged CIImage and CGRect to CIContext render:toIOSurface:bounds:colorSpace: after nil/empty checks. It does not receive an FxImageTile or imageOrigin and makes no additional image transform.", + "evidence_id": "ev_88a71ec62fade296495f1e3f5428cdb15ad4cda43866e09fb040fa3a4bdb0440", + "call_address": "0x100029188", + "body_bytes": 140 + }, + { + "claim": "0x1000291b4 renders BGRA8, RGBAh or RGBAf to a temporary bitmap, then copies rows forward to IOSurface. Both source and destination pointers increment positively; there is no reversed-row copy.", + "evidence_id": "ev_110d76f7958decb0c56b7daafe292d60a8bc56cd035b40a997f61395cb91ebfe", + "bitmap_render_address": "0x1000292e4", + "row_copy_address": "0x10002933c", + "source_increment_address": "0x100029340", + "destination_increment_address": "0x100029344", + "body_bytes": 480 + } + ], + "sdk_and_official_samples": [ + { + "path": "/Library/Developer/SDKs/FxPlug.sdk/Library/Frameworks/FxPlug.framework/Headers/FxTypes.h", + "lines": [ + 519, + 533 + ], + "observation": "FxImageOrigin describes coordinate-axis handedness/direction, Motion bottom-left and FCP top-left. This documentation does not establish IOSurface physical row order." + }, + { + "path": "/Library/Developer/SDKs/FxPlug.sdk/Library/Frameworks/FxPlug.framework/Headers/FxImageTile.h", + "lines": [ + 19, + 54 + ], + "observation": "ioSurface carries image data; imageOrigin is documented as tile origin. No physical row-reversal rule is stated." + }, + { + "path": "/Library/Developer/Xcode/Templates/FxPlug/FxPlug 4.xctemplate/Plugin/PlugIn.m", + "lines": [ + 248, + 266 + ], + "observation": "Apple FxPlug4 template wraps Metal input/output textures and uses fixed UV vertices, without an imageOrigin branch." + }, + { + "path": "/Volumes/DayuMedia 4TB/FCParticular/Examples/FxBrightnessAnalysis/FxBrightnessAnalysis/PlugIn/FxBrightnessAnalysis.m", + "lines": [ + 688, + 699 + ], + "observation": "Apple example directly creates CIImage from frame.ioSurface without an origin flip. Its area-average analysis is orientation-invariant, so the example alone cannot establish anatomical direction." + } + ], + "conclusions": [ + "The original CI-to-IOSurface direct and bitmap fallback paths contain no additional origin-dependent flip.", + "Applying FxImageOrigin-based input/output flips is not supported by these original CI paths.", + "Native host physical storage was not captured. Static facts and controlled IOSurface tests must remain distinct from native Motion/FCP observation." + ], + "limitations": [ + "Ghidra pseudocode is recovered non-source, not runtime behavior.", + "This focused check does not assert equivalence of the separate original Metal fragment-shader UV pipeline." + ], + "native_dossiers": [ + { + "evidence_id": "ev_88a71ec62fade296495f1e3f5428cdb15ad4cda43866e09fb040fa3a4bdb0440", + "subject": { + "name": "MSE18V2-arm64", + "digest": { + "sha256": "f01e8c0b7e2676b2961950b0e48efdd2589af218e4b36de7d39f5d1c76852bfb" + }, + "format": "mach-o", + "architecture": "arm64", + "local_path": "/private/tmp/paintfcp-rea.b3j9Te/MSE18V2-arm64" + }, + "provider": { + "id": "ghidra", + "name": "Ghidra", + "version": "12.1.4" + }, + "analysis_profile": { + "provider": { + "id": "ghidra", + "name": "Ghidra", + "version": "12.1.4" + }, + "parameters": { + "target_kind": "executable", + "target_format": "mach-o", + "architecture": "arm64", + "available_architectures": [ + "arm64" + ], + "import_mode": "ephemeral-source-immutable", + "annotation_policy": "atomic-function-entry-metadata-v1", + "load_image_observations": "source-mappings-entry-context-v2", + "function_body_evidence": "complete-inclusive-ranges-v1", + "function_references": "complete-body-and-entry-reference-manager-v2", + "string_inventory_evidence": "defined-data-coverage-v1", + "location_resolution": "explicit-address-exact-entry-symbol-first-v3", + "instruction_flow_evidence": "decoded-return-pcode-v1", + "function_boundary_observations": "ghidra-terminal-call-limitations-v1", + "no_return_repair": "returning-imports-decoded-return-v2", + "process_launch": "inspected-jvm-launch-support-v1", + "jump_table_evidence": "typed-case-default-blocks-v1", + "decompiler_jump_loads": true, + "loader": "auto-from-header", + "language_id": "auto-from-header", + "compiler_spec_id": "auto-default", + "analyzer_preset": "ghidra-default" + }, + "digest": "20565088524a2d0359b9b96f46ac48e679d774c7b0092c56abc06de8fdbec11c" + }, + "predicate_type": "rea.analysis", + "operation": "analyze_function", + "parameters": { + "procedure": "0x10002911c" + }, + "normalized_result": { + "procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + }, + "signature": "undefined FUN_10002911c()", + "locals": [ + { + "description": "undefined8 local_10 @ Stack[-0x10]:8", + "provenance": "ghidra-function-database" + }, + { + "description": "undefined8 local_20 @ Stack[-0x20]:8", + "provenance": "ghidra-function-database" + }, + { + "description": "undefined8 local_30 @ Stack[-0x30]:8", + "provenance": "ghidra-function-database" + }, + { + "description": "undefined8 local_40 @ Stack[-0x40]:8", + "provenance": "ghidra-function-database" + }, + { + "description": "undefined8 local_50 @ Stack[-0x50]:8", + "provenance": "ghidra-function-database" + } + ] + }, + "pseudocode": "\nbool FUN_10002911c(undefined8 param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n ulong param_5,ID param_6,undefined8 param_7,undefined8 param_8)\n\n{\n bool bVar1;\n ulong uVar2;\n \n bVar1 = false;\n if (param_5 != 0) {\n uVar2 = param_5;\n _CGRectIsEmpty();\n bVar1 = (uVar2 & 1) == 0;\n if (bVar1) {\n objc_stub::render_toIOSurface_bounds_colorSpace_\n (param_6,param_1,param_2,param_3,param_4,param_5,param_7,param_8);\n }\n }\n return bVar1;\n}\n\n", + "assembly": [ + "0x10002911c: cbz x0, 0x1000291a4", + "0x100029120: stp d11, d10, [sp, #-0x50]!", + "0x100029124: stp d9, d8, [sp, #0x10]", + "0x100029128: stp x22, x21, [sp, #0x20]", + "0x10002912c: stp x20, x19, [sp, #0x30]", + "0x100029130: stp x29, x30, [sp, #0x40]", + "0x100029134: add x29, sp, #0x40", + "0x100029138: mov x19, x3", + "0x10002913c: fmov d8, d3", + "0x100029140: fmov d9, d2", + "0x100029144: fmov d10, d1", + "0x100029148: fmov d11, d0", + "0x10002914c: mov x20, x2", + "0x100029150: mov x22, x1", + "0x100029154: mov x21, x0", + "0x100029158: bl 0x100055500", + "0x10002915c: tbz w0, #0x0, 0x100029168", + "0x100029160: mov w0, #0x0", + "0x100029164: b 0x100029190", + "0x100029168: mov x0, x22", + "0x10002916c: mov x2, x21", + "0x100029170: mov x3, x20", + "0x100029174: fmov d0, d11", + "0x100029178: fmov d1, d10", + "0x10002917c: fmov d2, d9", + "0x100029180: fmov d3, d8", + "0x100029184: mov x4, x19", + "0x100029188: bl 0x10005a920", + "0x10002918c: mov w0, #0x1", + "0x100029190: ldp x29, x30, [sp, #0x40]", + "0x100029194: ldp x20, x19, [sp, #0x30]", + "0x100029198: ldp x22, x21, [sp, #0x20]", + "0x10002919c: ldp d9, d8, [sp, #0x10]", + "0x1000291a0: ldp d11, d10, [sp], #0x50", + "0x1000291a4: ret" + ], + "comments": [ + { + "address": "0x100029188", + "kind": "inline", + "text": "[param_6 render:param_2 toIOSurface:param_3 bounds:param_4 colorSpace:param_5]" + } + ], + "callers": [ + { + "address": "0x10001cba4", + "name": "MSSuperSkinSmoothingPlugIn::renderDestinationImage:sourceImages:pluginState:atTime:error:", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10001cba4", + "end": "0x100021c17" + } + ], + "total_bytes": 20596, + "span_bytes": 20596, + "non_contiguous": false, + "contains_entry": true + } + } + ], + "callees": [ + { + "address": "0x100055500", + "name": "_CGRectIsEmpty", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xc4", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x100055500", + "end": "0x10005550b" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x10005a920", + "name": "objc_stub::render:toIOSurface:bounds:colorSpace:", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10005a920", + "end": "0x10005a933" + } + ], + "total_bytes": 20, + "span_bytes": 20, + "non_contiguous": false, + "contains_entry": true + } + } + ], + "incoming_references": [ + { + "source_address": "0x100021244", + "target_address": "0x10002911c", + "source_procedure": { + "address": "0x10001cba4", + "name": "MSSuperSkinSmoothingPlugIn::renderDestinationImage:sourceImages:pluginState:atTime:error:", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10001cba4", + "end": "0x100021c17" + } + ], + "total_bytes": 20596, + "span_bytes": 20596, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100021328", + "target_address": "0x10002911c", + "source_procedure": { + "address": "0x10001cba4", + "name": "MSSuperSkinSmoothingPlugIn::renderDestinationImage:sourceImages:pluginState:atTime:error:", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10001cba4", + "end": "0x100021c17" + } + ], + "total_bytes": 20596, + "span_bytes": 20596, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x1000922f0", + "target_address": "0x10002911c", + "source_procedure": null, + "target_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "DATA", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + } + ], + "outgoing_references": [ + { + "source_address": "0x10002911c", + "target_address": "0x1000291a4", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "CONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": true, + "terminal": false, + "primary": true, + "operand_index": 1, + "external": false + } + }, + { + "source_address": "0x100029120", + "target_address": "stack:0xffffffffffffffb0", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x100029124", + "target_address": "stack:0xffffffffffffffc0", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x100029128", + "target_address": "stack:0xffffffffffffffd0", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x10002912c", + "target_address": "stack:0xffffffffffffffe0", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x100029130", + "target_address": "stack:0xfffffffffffffff0", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x100029158", + "target_address": "0x100055500", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x100055500", + "name": "_CGRectIsEmpty", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xc4", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x100055500", + "end": "0x10005550b" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x10002915c", + "target_address": "0x100029168", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "CONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": true, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x100029164", + "target_address": "0x100029190", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029188", + "target_address": "0x10005a920", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x10005a920", + "name": "objc_stub::render:toIOSurface:bounds:colorSpace:", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10005a920", + "end": "0x10005a933" + } + ], + "total_bytes": 20, + "span_bytes": 20, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029190", + "target_address": "stack:0xfffffffffffffff0", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "DATA", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029194", + "target_address": "stack:0xffffffffffffffe0", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x100029198", + "target_address": "stack:0xffffffffffffffd0", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x10002919c", + "target_address": "stack:0xffffffffffffffc0", + "source_procedure": { + "address": "0x10002911c", + "name": "FUN_10002911c", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10002911c", + "end": "0x1000291a7" + } + ], + "total_bytes": 140, + "span_bytes": 140, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + } + ], + "referenced_strings": [], + "referenced_names": [ + { + "address": "0x100029168", + "value": "LAB_100029168", + "source_address": "0x10002915c" + }, + { + "address": "0x100029190", + "value": "LAB_100029190", + "source_address": "0x100029164" + }, + { + "address": "0x1000291a4", + "value": "LAB_1000291a4", + "source_address": "0x10002911c" + }, + { + "address": "0x100055500", + "value": "_CGRectIsEmpty", + "source_address": "0x100029158" + }, + { + "address": "0x10005a920", + "value": "objc_stub::render:toIOSurface:bounds:colorSpace:", + "source_address": "0x100029188" + } + ], + "basic_blocks": [ + { + "start": "0x10002911c", + "end": "0x100029120", + "successors": [ + "0x100029120", + "0x1000291a4" + ] + }, + { + "start": "0x100029120", + "end": "0x100029160", + "successors": [ + "0x100029160", + "0x100029168" + ] + }, + { + "start": "0x100029160", + "end": "0x100029168", + "successors": [ + "0x100029190" + ] + }, + { + "start": "0x100029168", + "end": "0x100029190", + "successors": [ + "0x100029190" + ] + }, + { + "start": "0x100029190", + "end": "0x1000291a4", + "successors": [ + "0x1000291a4" + ] + }, + { + "start": "0x1000291a4", + "end": "0x1000291a8", + "successors": [] + } + ], + "native_api": { + "available": true, + "provenance": "ghidra-high-function", + "signature_source": "default", + "calling_convention": "__swiftcall", + "return_type": { + "ordinal": null, + "name": null, + "data_type": "bool", + "size_bytes": 1, + "storage": "w0:1", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type bool." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage" + ], + "role": "return" + }, + "parameters": [ + { + "ordinal": 0, + "name": "param_1", + "data_type": "undefined8", + "size_bytes": 8, + "storage": "d0:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type undefined8." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 1, + "name": "param_2", + "data_type": "undefined8", + "size_bytes": 8, + "storage": "d1:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type undefined8." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 2, + "name": "param_3", + "data_type": "undefined8", + "size_bytes": 8, + "storage": "d2:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type undefined8." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 3, + "name": "param_4", + "data_type": "undefined8", + "size_bytes": 8, + "storage": "d3:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type undefined8." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 4, + "name": "param_5", + "data_type": "ulong", + "size_bytes": 8, + "storage": "x0:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type ulong." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 5, + "name": "param_6", + "data_type": "ID", + "size_bytes": 8, + "storage": "x1:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type ID." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 6, + "name": "param_7", + "data_type": "undefined8", + "size_bytes": 8, + "storage": "x2:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type undefined8." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 7, + "name": "param_8", + "data_type": "undefined8", + "size_bytes": 8, + "storage": "x3:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type undefined8." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + } + ], + "jump_tables": [], + "pseudocode": { + "classification": "decompiler-generated-non-source", + "compilable": false + }, + "decompiler_artifacts": [ + "recovered-signature", + "register-and-stack-variables", + "compiler-generated-control-flow", + "pointer-arithmetic", + "pseudocode" + ], + "limitations": [ + "Types and calling conventions are Ghidra decompiler observations, not source declarations.", + "Register variables, compiler-generated blocks, and pointer arithmetic remain decompiler artifacts.", + "Pseudocode is neither original source nor guaranteed to compile." + ] + }, + "native_value_flow": { + "available": true, + "provenance": "ghidra-high-pcode", + "operations": [ + { + "id": "0x10002911c#0", + "address": "0x10002911c", + "sequence": 0, + "opcode": "INT_NOTEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x31700", + "constant_hex": null + } + }, + { + "id": "0x10002911c#1", + "address": "0x10002911c", + "sequence": 1, + "opcode": "CBRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x1000291a4", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x31700", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x10002911c#357", + "address": "0x10002911c", + "sequence": 357, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "constant", + "size_bytes": 1, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x1000001b", + "constant_hex": null + } + }, + { + "id": "0x100029158#56", + "address": "0x100029158", + "sequence": 56, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100055500", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029158#170", + "address": "0x100029158", + "sequence": 170, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000023", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "38" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x100029158#358", + "address": "0x100029158", + "sequence": 358, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000023", + "constant_hex": null + } + }, + { + "id": "0x10002915c#59", + "address": "0x10002915c", + "sequence": 59, + "opcode": "INT_EQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000012", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x30d00", + "constant_hex": null + } + }, + { + "id": "0x10002915c#61", + "address": "0x10002915c", + "sequence": 61, + "opcode": "CBRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029168", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x30d00", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x10002915c#312", + "address": "0x10002915c", + "sequence": 312, + "opcode": "INT_AND", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "1" + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000012", + "constant_hex": null + } + }, + { + "id": "0x100029188#126", + "address": "0x100029188", + "sequence": 126, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x10005a920", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4008", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5000", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5020", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5040", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5060", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4010", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4018", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x1000291a4#104", + "address": "0x1000291a4", + "sequence": 104, + "opcode": "RETURN", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x1000291a4#356", + "address": "0x1000291a4", + "sequence": 356, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x1000001b", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x30d00", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x30d00", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x4000", + "constant_hex": null + } + } + ], + "def_use": [ + { + "definition": "0x10002911c#0", + "use": "0x10002911c#1", + "input_index": 1 + }, + { + "definition": "0x100029158#358", + "use": "0x100029158#170", + "input_index": 0 + }, + { + "definition": "0x10002915c#312", + "use": "0x10002915c#59", + "input_index": 0 + }, + { + "definition": "0x10002915c#59", + "use": "0x10002915c#61", + "input_index": 1 + }, + { + "definition": "0x100029158#170", + "use": "0x10002915c#312", + "input_index": 0 + }, + { + "definition": "0x1000291a4#356", + "use": "0x1000291a4#104", + "input_index": 1 + }, + { + "definition": "0x10002911c#357", + "use": "0x1000291a4#356", + "input_index": 0 + }, + { + "definition": "0x10002915c#59", + "use": "0x1000291a4#356", + "input_index": 1 + }, + { + "definition": "0x10002915c#59", + "use": "0x1000291a4#356", + "input_index": 2 + } + ], + "effects": [ + { + "operation": "0x10002911c#1", + "kind": "conditional_branch", + "operand_input": null, + "value_input": 1 + }, + { + "operation": "0x100029158#56", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x10002915c#61", + "kind": "conditional_branch", + "operand_input": null, + "value_input": 1 + }, + { + "operation": "0x100029188#126", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + } + ], + "parameters": [ + { + "ordinal": 0, + "name": "param_1", + "data_type": "/undefined8" + }, + { + "ordinal": 1, + "name": "param_2", + "data_type": "/undefined8" + }, + { + "ordinal": 2, + "name": "param_3", + "data_type": "/undefined8" + }, + { + "ordinal": 3, + "name": "param_4", + "data_type": "/undefined8" + }, + { + "ordinal": 4, + "name": "param_5", + "data_type": "/ulong" + }, + { + "ordinal": 5, + "name": "param_6", + "data_type": "/_objc2_/ID" + }, + { + "ordinal": 6, + "name": "param_7", + "data_type": "/undefined8" + }, + { + "ordinal": 7, + "name": "param_8", + "data_type": "/undefined8" + } + ], + "parameter_uses": [ + { + "ordinal": 4, + "use": "0x10002911c#0", + "input_index": 0 + }, + { + "ordinal": 4, + "use": "0x100029158#358", + "input_index": 0 + }, + { + "ordinal": 5, + "use": "0x100029188#126", + "input_index": 1 + }, + { + "ordinal": 0, + "use": "0x100029188#126", + "input_index": 2 + }, + { + "ordinal": 1, + "use": "0x100029188#126", + "input_index": 3 + }, + { + "ordinal": 2, + "use": "0x100029188#126", + "input_index": 4 + }, + { + "ordinal": 3, + "use": "0x100029188#126", + "input_index": 5 + }, + { + "ordinal": 4, + "use": "0x100029188#126", + "input_index": 6 + }, + { + "ordinal": 6, + "use": "0x100029188#126", + "input_index": 7 + }, + { + "ordinal": 7, + "use": "0x100029188#126", + "input_index": 8 + } + ], + "truncated": false, + "omitted_operations_lower_bound": 0, + "known_omitted_inputs": 0, + "known_omitted_edges": 0, + "limitations": [ + "High p-code is decompiler-derived, not original source or runtime behavior. is_dead preserves the Java AST flag; decoded block members can retain that flag, so block_membership separately reports actual syntax-tree membership.", + "Def-use links do not cross function boundaries and may omit memory aliasing, call side effects, or unresolved indirect flow.", + "Memory read/write effects include stack and temporary memory operations; they do not identify persistent state or business meaning.", + "Operation, input, and def-use limits can truncate large functions; inspect truncation, omitted lower bounds, and known omitted counts before drawing conclusions.", + "Known omitted-edge counts cover links omitted from retained operations; omitted operations may contain additional uncounted links." + ] + }, + "limitations": [ + "Unresolved computed or indirect flows without target addresses are not represented as reference edges.", + "Thunk and external classifications are Ghidra FunctionManager observations; they do not resolve targetless calls.", + "Pseudocode and assembly are Ghidra-specific representations, not original source or Hopper-equivalent text.", + "Synthetic Ghidra entry-point references without actionable memory sources are omitted." + ] + }, + "confidence": "observed", + "authority": "shipped-artifact", + "environment": null, + "limitations": [ + "The session serves operations only after Ghidra reports default auto-analysis complete; incomplete analysis does not expose partial results.", + "The imported Program and temporary project are ephemeral and deleted on close. Annotation operations edit session database metadata; original executable bytes are never written.", + "Cancelling an active Ghidra request terminates its ephemeral database and discards session annotations. The selected target remains open; the next provider query imports the original artifact again.", + "Default-space addresses use lowercase 0x-prefixed hexadecimal; other address spaces use :0x.", + "References cover the complete Ghidra function-body AddressSet and exact entry. Dossier incoming edges omit sources owned by that function; procedure_references also retains those internal edges.", + "The dossier combines Ghidra FunctionManager, Listing, ReferenceManager, BasicBlockModel, and decompiler observations; provider-specific pseudocode and assembly are not cross-provider text invariants.", + "Resolved reference metadata identifies computed, indirect, external, call, jump, and data edges; unresolved targetless flows remain unknown, and function classifications distinguish thunks and externals.", + "Synthetic Ghidra entry-point references without actionable memory sources are omitted.", + "The Java bridge serializes one function request per Program and lets each decompilation run until it completes or the caller cancels.", + "macOS sessions require a matching executable Ghidra native decompiler; REA checks for it but does not build native components or change Gatekeeper quarantine state." + ], + "locations": [], + "evidence_links": [] + }, + { + "evidence_id": "ev_110d76f7958decb0c56b7daafe292d60a8bc56cd035b40a997f61395cb91ebfe", + "subject": { + "name": "MSE18V2-arm64", + "digest": { + "sha256": "f01e8c0b7e2676b2961950b0e48efdd2589af218e4b36de7d39f5d1c76852bfb" + }, + "format": "mach-o", + "architecture": "arm64", + "local_path": "/private/tmp/paintfcp-rea.b3j9Te/MSE18V2-arm64" + }, + "provider": { + "id": "ghidra", + "name": "Ghidra", + "version": "12.1.4" + }, + "analysis_profile": { + "provider": { + "id": "ghidra", + "name": "Ghidra", + "version": "12.1.4" + }, + "parameters": { + "target_kind": "executable", + "target_format": "mach-o", + "architecture": "arm64", + "available_architectures": [ + "arm64" + ], + "import_mode": "ephemeral-source-immutable", + "annotation_policy": "atomic-function-entry-metadata-v1", + "load_image_observations": "source-mappings-entry-context-v2", + "function_body_evidence": "complete-inclusive-ranges-v1", + "function_references": "complete-body-and-entry-reference-manager-v2", + "string_inventory_evidence": "defined-data-coverage-v1", + "location_resolution": "explicit-address-exact-entry-symbol-first-v3", + "instruction_flow_evidence": "decoded-return-pcode-v1", + "function_boundary_observations": "ghidra-terminal-call-limitations-v1", + "no_return_repair": "returning-imports-decoded-return-v2", + "process_launch": "inspected-jvm-launch-support-v1", + "jump_table_evidence": "typed-case-default-blocks-v1", + "decompiler_jump_loads": true, + "loader": "auto-from-header", + "language_id": "auto-from-header", + "compiler_spec_id": "auto-default", + "analyzer_preset": "ghidra-default" + }, + "digest": "20565088524a2d0359b9b96f46ac48e679d774c7b0092c56abc06de8fdbec11c" + }, + "predicate_type": "rea.analysis", + "operation": "analyze_function", + "parameters": { + "procedure": "0x1000291b4" + }, + "normalized_result": { + "procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + }, + "signature": "undefined FUN_1000291b4()", + "locals": [ + { + "description": "undefined8 local_10 @ Stack[-0x10]:8", + "provenance": "ghidra-function-database" + }, + { + "description": "undefined8 local_20 @ Stack[-0x20]:8", + "provenance": "ghidra-function-database" + }, + { + "description": "undefined8 local_30 @ Stack[-0x30]:8", + "provenance": "ghidra-function-database" + }, + { + "description": "undefined8 local_40 @ Stack[-0x40]:8", + "provenance": "ghidra-function-database" + }, + { + "description": "undefined8 local_50 @ Stack[-0x50]:8", + "provenance": "ghidra-function-database" + }, + { + "description": "undefined8 local_60 @ Stack[-0x60]:8", + "provenance": "ghidra-function-database" + }, + { + "description": "undefined8 local_70 @ Stack[-0x70]:8", + "provenance": "ghidra-function-database" + } + ] + }, + "pseudocode": "\nbool FUN_1000291b4(double param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n ulong param_5,ID param_6,void *param_7,undefined8 param_8)\n\n{\n uint uVar1;\n bool bVar2;\n bool bVar3;\n int iVar4;\n ulong uVar5;\n void *pvVar6;\n void *pvVar7;\n void *pvVar8;\n void *pvVar9;\n uint *puVar10;\n long lVar11;\n void *pvVar12;\n void *pvVar13;\n double dVar14;\n double dVar15;\n \n if ((param_5 != 0) && (uVar5 = param_5, _CGRectIsEmpty(), (uVar5 & 1) == 0)) {\n pvVar13 = param_7;\n _IOSurfaceGetPixelFormat();\n iVar4 = (int)pvVar13;\n if (iVar4 == 0x42475241) {\n lVar11 = 4;\n puVar10 = (uint *)PTR__kCIFormatBGRA8_100078160;\n }\n else if (iVar4 == 0x52476641) {\n lVar11 = 0x10;\n puVar10 = (uint *)PTR__kCIFormatRGBAf_100078178;\n }\n else {\n if (iVar4 != 0x52476841) {\n return false;\n }\n lVar11 = 8;\n puVar10 = (uint *)PTR__kCIFormatRGBAh_100078180;\n }\n uVar1 = *puVar10;\n dVar14 = param_1;\n _CGRectGetWidth(param_1,param_2,param_3,param_4);\n dVar15 = param_1;\n _CGRectGetHeight(param_1,param_2,param_3,param_4);\n pvVar13 = (void *)(long)dVar15;\n if ((long)dVar14 != 0 && pvVar13 != (void *)0x0) {\n pvVar12 = (void *)((long)dVar14 * lVar11);\n pvVar6 = _calloc((long)pvVar12 * (long)pvVar13,1);\n if (pvVar6 != (void *)0x0) {\n objc_stub::render_toBitmap_rowBytes_bounds_format_colorSpace_\n (param_6,param_1,param_2,param_3,param_4,param_5,pvVar6,pvVar12,(ulong)uVar1,\n param_8);\n _IOSurfaceLock(param_7,0,0);\n pvVar7 = param_7;\n _IOSurfaceGetBaseAddress();\n pvVar8 = param_7;\n _IOSurfaceGetBytesPerRow();\n pvVar9 = param_7;\n _IOSurfaceGetHeight();\n bVar2 = pvVar13 <= pvVar9;\n bVar3 = pvVar7 != (void *)0x0;\n pvVar9 = pvVar6;\n if ((pvVar12 <= pvVar8 && bVar2) && bVar3) {\n do {\n _memcpy(pvVar7,pvVar9,(size_t)pvVar12);\n pvVar7 = (void *)((long)pvVar7 + (long)pvVar8);\n pvVar13 = (void *)((long)pvVar13 + -1);\n pvVar9 = (void *)((long)pvVar9 + (long)pvVar12);\n } while (pvVar13 != (void *)0x0);\n }\n _IOSurfaceUnlock(param_7,0,0);\n _free(pvVar6);\n return (pvVar12 <= pvVar8 && bVar2) && bVar3;\n }\n }\n }\n return false;\n}\n\n", + "assembly": [ + "0x1000291b4: stp d11, d10, [sp, #-0x70]!", + "0x1000291b8: stp d9, d8, [sp, #0x10]", + "0x1000291bc: stp x26, x25, [sp, #0x20]", + "0x1000291c0: stp x24, x23, [sp, #0x30]", + "0x1000291c4: stp x22, x21, [sp, #0x40]", + "0x1000291c8: stp x20, x19, [sp, #0x50]", + "0x1000291cc: stp x29, x30, [sp, #0x60]", + "0x1000291d0: add x29, sp, #0x60", + "0x1000291d4: cbz x0, 0x100029384", + "0x1000291d8: mov x20, x3", + "0x1000291dc: fmov d8, d3", + "0x1000291e0: fmov d9, d2", + "0x1000291e4: fmov d10, d1", + "0x1000291e8: fmov d11, d0", + "0x1000291ec: mov x19, x2", + "0x1000291f0: mov x23, x1", + "0x1000291f4: mov x22, x0", + "0x1000291f8: bl 0x100055500", + "0x1000291fc: tbnz w0, #0x0, 0x100029384", + "0x100029200: mov x0, x19", + "0x100029204: bl 0x1000555b4", + "0x100029208: mov w8, #0x5241", + "0x10002920c: movk w8, #0x4247, LSL #16", + "0x100029210: cmp w0, w8", + "0x100029214: b.eq 0x100029258", + "0x100029218: mov w8, #0x6641", + "0x10002921c: movk w8, #0x5247, LSL #16", + "0x100029220: cmp w0, w8", + "0x100029224: b.eq 0x100029248", + "0x100029228: mov w8, #0x6841", + "0x10002922c: movk w8, #0x5247, LSL #16", + "0x100029230: cmp w0, w8", + "0x100029234: b.ne 0x100029384", + "0x100029238: adrp x8, 0x100078000", + "0x10002923c: ldr x8, [x8, #0x180]", + "0x100029240: mov w21, #0x8", + "0x100029244: b 0x100029264", + "0x100029248: adrp x8, 0x100078000", + "0x10002924c: ldr x8, [x8, #0x178]", + "0x100029250: mov w21, #0x10", + "0x100029254: b 0x100029264", + "0x100029258: adrp x8, 0x100078000", + "0x10002925c: ldr x8, [x8, #0x160]", + "0x100029260: mov w21, #0x4", + "0x100029264: ldr w25, [x8]", + "0x100029268: fmov d0, d11", + "0x10002926c: fmov d1, d10", + "0x100029270: fmov d2, d9", + "0x100029274: fmov d3, d8", + "0x100029278: bl 0x1000554dc", + "0x10002927c: fcvtas x24, d0", + "0x100029280: fmov d0, d11", + "0x100029284: fmov d1, d10", + "0x100029288: fmov d2, d9", + "0x10002928c: fmov d3, d8", + "0x100029290: bl 0x100055488", + "0x100029294: fcvtas x26, d0", + "0x100029298: cmp x24, #0x0", + "0x10002929c: ccmp x26, #0x0, #0x4, ne", + "0x1000292a0: b.eq 0x100029384", + "0x1000292a4: mul x24, x24, x21", + "0x1000292a8: mul x0, x24, x26", + "0x1000292ac: mov w1, #0x1", + "0x1000292b0: bl 0x1000557dc", + "0x1000292b4: cbz x0, 0x100029384", + "0x1000292b8: mov x21, x0", + "0x1000292bc: mov x0, x23", + "0x1000292c0: mov x2, x22", + "0x1000292c4: mov x3, x21", + "0x1000292c8: mov x4, x24", + "0x1000292cc: fmov d0, d11", + "0x1000292d0: fmov d1, d10", + "0x1000292d4: fmov d2, d9", + "0x1000292d8: fmov d3, d8", + "0x1000292dc: mov x5, x25", + "0x1000292e0: mov x6, x20", + "0x1000292e4: bl 0x10005a900", + "0x1000292e8: mov x0, x19", + "0x1000292ec: mov w1, #0x0", + "0x1000292f0: mov x2, #0x0", + "0x1000292f4: bl 0x1000555cc", + "0x1000292f8: mov x0, x19", + "0x1000292fc: bl 0x100055590", + "0x100029300: mov x22, x0", + "0x100029304: mov x0, x19", + "0x100029308: bl 0x10005559c", + "0x10002930c: mov x23, x0", + "0x100029310: mov x0, x19", + "0x100029314: bl 0x1000555a8", + "0x100029318: cmp x23, x24", + "0x10002931c: ccmp x0, x26, #0x0, cs", + "0x100029320: ccmp x22, #0x0, #0x4, cs", + "0x100029324: cset w20, ne", + "0x100029328: b.eq 0x100029350", + "0x10002932c: mov x25, x21", + "0x100029330: mov x0, x22", + "0x100029334: mov x1, x25", + "0x100029338: mov x2, x24", + "0x10002933c: bl 0x1000558d8", + "0x100029340: add x25, x25, x24", + "0x100029344: add x22, x22, x23", + "0x100029348: subs x26, x26, #0x1", + "0x10002934c: b.ne 0x100029330", + "0x100029350: mov x0, x19", + "0x100029354: mov w1, #0x0", + "0x100029358: mov x2, #0x0", + "0x10002935c: bl 0x1000555d8", + "0x100029360: mov x0, x21", + "0x100029364: bl 0x10005586c", + "0x100029368: b 0x100029388", + "0x100029384: mov w20, #0x0", + "0x100029388: mov x0, x20", + "0x10002938c: ldp x29, x30, [sp, #0x60]", + "0x100029390: ldp x20, x19, [sp, #0x50]", + "0x100029394: ldp x22, x21, [sp, #0x40]", + "0x100029398: ldp x24, x23, [sp, #0x30]", + "0x10002939c: ldp x26, x25, [sp, #0x20]", + "0x1000293a0: ldp d9, d8, [sp, #0x10]", + "0x1000293a4: ldp d11, d10, [sp], #0x70", + "0x1000293a8: ret" + ], + "comments": [ + { + "address": "0x1000292e4", + "kind": "inline", + "text": "[param_6 render:param_2 toBitmap:param_3 rowBytes:param_4 bounds:param_5 format:0xcc colorSpace:0x4]" + } + ], + "callers": [ + { + "address": "0x10001cba4", + "name": "MSSuperSkinSmoothingPlugIn::renderDestinationImage:sourceImages:pluginState:atTime:error:", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10001cba4", + "end": "0x100021c17" + } + ], + "total_bytes": 20596, + "span_bytes": 20596, + "non_contiguous": false, + "contains_entry": true + } + } + ], + "callees": [ + { + "address": "0x100055488", + "name": "_CGRectGetHeight", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xba", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x100055488", + "end": "0x100055493" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x1000554dc", + "name": "_CGRectGetWidth", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xc1", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000554dc", + "end": "0x1000554e7" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x100055500", + "name": "_CGRectIsEmpty", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xc4", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x100055500", + "end": "0x10005550b" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x100055590", + "name": "_IOSurfaceGetBaseAddress", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd0", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x100055590", + "end": "0x10005559b" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x10005559c", + "name": "_IOSurfaceGetBytesPerRow", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd1", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10005559c", + "end": "0x1000555a7" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x1000555a8", + "name": "_IOSurfaceGetHeight", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd2", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000555a8", + "end": "0x1000555b3" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x1000555b4", + "name": "_IOSurfaceGetPixelFormat", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd3", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000555b4", + "end": "0x1000555bf" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x1000555cc", + "name": "_IOSurfaceLock", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd5", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000555cc", + "end": "0x1000555d7" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x1000555d8", + "name": "_IOSurfaceUnlock", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd6", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000555d8", + "end": "0x1000555e3" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x1000557dc", + "name": "_calloc", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0x101", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000557dc", + "end": "0x1000557e7" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x10005586c", + "name": "_free", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0x10d", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10005586c", + "end": "0x100055877" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x1000558d8", + "name": "_memcpy", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0x116", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000558d8", + "end": "0x1000558e3" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + { + "address": "0x10005a900", + "name": "objc_stub::render:toBitmap:rowBytes:bounds:format:colorSpace:", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10005a900", + "end": "0x10005a913" + } + ], + "total_bytes": 20, + "span_bytes": 20, + "non_contiguous": false, + "contains_entry": true + } + } + ], + "incoming_references": [ + { + "source_address": "0x1000212dc", + "target_address": "0x1000291b4", + "source_procedure": { + "address": "0x10001cba4", + "name": "MSSuperSkinSmoothingPlugIn::renderDestinationImage:sourceImages:pluginState:atTime:error:", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10001cba4", + "end": "0x100021c17" + } + ], + "total_bytes": 20596, + "span_bytes": 20596, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x10002135c", + "target_address": "0x1000291b4", + "source_procedure": { + "address": "0x10001cba4", + "name": "MSSuperSkinSmoothingPlugIn::renderDestinationImage:sourceImages:pluginState:atTime:error:", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10001cba4", + "end": "0x100021c17" + } + ], + "total_bytes": 20596, + "span_bytes": 20596, + "non_contiguous": false, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x1000922f2", + "target_address": "0x1000291b4", + "source_procedure": null, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "DATA", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + } + ], + "outgoing_references": [ + { + "source_address": "0x1000291b4", + "target_address": "stack:0xffffffffffffff90", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x1000291b8", + "target_address": "stack:0xffffffffffffffa0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x1000291bc", + "target_address": "stack:0xffffffffffffffb0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x1000291c0", + "target_address": "stack:0xffffffffffffffc0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x1000291c4", + "target_address": "stack:0xffffffffffffffd0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x1000291c8", + "target_address": "stack:0xffffffffffffffe0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x1000291cc", + "target_address": "stack:0xfffffffffffffff0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "WRITE", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": true, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x1000291d4", + "target_address": "0x100029384", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "CONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": true, + "terminal": false, + "primary": true, + "operand_index": 1, + "external": false + } + }, + { + "source_address": "0x1000291f8", + "target_address": "0x100055500", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x100055500", + "name": "_CGRectIsEmpty", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xc4", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x100055500", + "end": "0x10005550b" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x1000291fc", + "target_address": "0x100029384", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "CONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": true, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x100029204", + "target_address": "0x1000555b4", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000555b4", + "name": "_IOSurfaceGetPixelFormat", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd3", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000555b4", + "end": "0x1000555bf" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029214", + "target_address": "0x100029258", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "CONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": true, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029224", + "target_address": "0x100029248", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "CONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": true, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029234", + "target_address": "0x100029384", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "CONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": true, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x10002923c", + "target_address": "0x100078180", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 1, + "external": false + } + }, + { + "source_address": "0x100029244", + "target_address": "0x100029264", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x10002924c", + "target_address": "0x100078178", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 1, + "external": false + } + }, + { + "source_address": "0x100029254", + "target_address": "0x100029264", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x10002925c", + "target_address": "0x100078160", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 1, + "external": false + } + }, + { + "source_address": "0x100029264", + "target_address": "0x1000a9400", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": false, + "operand_index": 1, + "external": false + } + }, + { + "source_address": "0x100029264", + "target_address": "0x1000a9700", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": false, + "operand_index": 1, + "external": false + } + }, + { + "source_address": "0x100029264", + "target_address": "0x1000a9800", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 1, + "external": false + } + }, + { + "source_address": "0x100029278", + "target_address": "0x1000554dc", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000554dc", + "name": "_CGRectGetWidth", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xc1", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000554dc", + "end": "0x1000554e7" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029290", + "target_address": "0x100055488", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x100055488", + "name": "_CGRectGetHeight", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xba", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x100055488", + "end": "0x100055493" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x1000292a0", + "target_address": "0x100029384", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "CONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": true, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x1000292b0", + "target_address": "0x1000557dc", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000557dc", + "name": "_calloc", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0x101", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000557dc", + "end": "0x1000557e7" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x1000292b4", + "target_address": "0x100029384", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "CONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": true, + "terminal": false, + "primary": true, + "operand_index": 1, + "external": false + } + }, + { + "source_address": "0x1000292e4", + "target_address": "0x10005a900", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x10005a900", + "name": "objc_stub::render:toBitmap:rowBytes:bounds:format:colorSpace:", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10005a900", + "end": "0x10005a913" + } + ], + "total_bytes": 20, + "span_bytes": 20, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x1000292f4", + "target_address": "0x1000555cc", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000555cc", + "name": "_IOSurfaceLock", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd5", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000555cc", + "end": "0x1000555d7" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x1000292fc", + "target_address": "0x100055590", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x100055590", + "name": "_IOSurfaceGetBaseAddress", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd0", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x100055590", + "end": "0x10005559b" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029308", + "target_address": "0x10005559c", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x10005559c", + "name": "_IOSurfaceGetBytesPerRow", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd1", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10005559c", + "end": "0x1000555a7" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029314", + "target_address": "0x1000555a8", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000555a8", + "name": "_IOSurfaceGetHeight", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd2", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000555a8", + "end": "0x1000555b3" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029328", + "target_address": "0x100029350", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "CONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": true, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x10002933c", + "target_address": "0x1000558d8", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000558d8", + "name": "_memcpy", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0x116", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000558d8", + "end": "0x1000558e3" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x10002934c", + "target_address": "0x100029330", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "CONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": true, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x10002935c", + "target_address": "0x1000555d8", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000555d8", + "name": "_IOSurfaceUnlock", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0xd6", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000555d8", + "end": "0x1000555e3" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029364", + "target_address": "0x10005586c", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x10005586c", + "name": "_free", + "classification": { + "external": false, + "thunk": true, + "thunk_target": "EXTERNAL:0x10d", + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x10005586c", + "end": "0x100055877" + } + ], + "total_bytes": 12, + "span_bytes": 12, + "non_contiguous": false, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_CALL", + "flow": true, + "call": true, + "jump": false, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029368", + "target_address": "0x100029388", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "UNCONDITIONAL_JUMP", + "flow": true, + "call": false, + "jump": true, + "data": false, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x10002938c", + "target_address": "stack:0xfffffffffffffff0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "DATA", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": false, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 0, + "external": false + } + }, + { + "source_address": "0x100029390", + "target_address": "stack:0xffffffffffffffe0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x100029394", + "target_address": "stack:0xffffffffffffffd0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x100029398", + "target_address": "stack:0xffffffffffffffc0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x10002939c", + "target_address": "stack:0xffffffffffffffb0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + }, + { + "source_address": "0x1000293a0", + "target_address": "stack:0xffffffffffffffa0", + "source_procedure": { + "address": "0x1000291b4", + "name": "FUN_1000291b4", + "classification": { + "external": false, + "thunk": false, + "thunk_target": null, + "provenance": "ghidra-function-manager" + }, + "body": { + "available": true, + "provenance": "ghidra-function-body-address-set", + "ranges": [ + { + "start": "0x1000291b4", + "end": "0x10002936b" + }, + { + "start": "0x100029384", + "end": "0x1000293ab" + } + ], + "total_bytes": 480, + "span_bytes": 504, + "non_contiguous": true, + "contains_entry": true + } + }, + "target_procedure": null, + "kind": { + "available": true, + "provenance": "ghidra-reference-manager", + "type": "READ", + "flow": false, + "call": false, + "jump": false, + "data": true, + "read": true, + "write": false, + "indirect": false, + "computed": false, + "conditional": false, + "terminal": false, + "primary": true, + "operand_index": 2, + "external": false + } + } + ], + "referenced_strings": [], + "referenced_names": [ + { + "address": "0x100029248", + "value": "LAB_100029248", + "source_address": "0x100029224" + }, + { + "address": "0x100029258", + "value": "LAB_100029258", + "source_address": "0x100029214" + }, + { + "address": "0x100029264", + "value": "LAB_100029264", + "source_address": "0x100029244" + }, + { + "address": "0x100029264", + "value": "LAB_100029264", + "source_address": "0x100029254" + }, + { + "address": "0x100029330", + "value": "LAB_100029330", + "source_address": "0x10002934c" + }, + { + "address": "0x100029350", + "value": "LAB_100029350", + "source_address": "0x100029328" + }, + { + "address": "0x100029384", + "value": "LAB_100029384", + "source_address": "0x1000291d4" + }, + { + "address": "0x100029384", + "value": "LAB_100029384", + "source_address": "0x1000291fc" + }, + { + "address": "0x100029384", + "value": "LAB_100029384", + "source_address": "0x100029234" + }, + { + "address": "0x100029384", + "value": "LAB_100029384", + "source_address": "0x1000292a0" + }, + { + "address": "0x100029384", + "value": "LAB_100029384", + "source_address": "0x1000292b4" + }, + { + "address": "0x100029388", + "value": "LAB_100029388", + "source_address": "0x100029368" + }, + { + "address": "0x100055488", + "value": "_CGRectGetHeight", + "source_address": "0x100029290" + }, + { + "address": "0x1000554dc", + "value": "_CGRectGetWidth", + "source_address": "0x100029278" + }, + { + "address": "0x100055500", + "value": "_CGRectIsEmpty", + "source_address": "0x1000291f8" + }, + { + "address": "0x100055590", + "value": "_IOSurfaceGetBaseAddress", + "source_address": "0x1000292fc" + }, + { + "address": "0x10005559c", + "value": "_IOSurfaceGetBytesPerRow", + "source_address": "0x100029308" + }, + { + "address": "0x1000555a8", + "value": "_IOSurfaceGetHeight", + "source_address": "0x100029314" + }, + { + "address": "0x1000555b4", + "value": "_IOSurfaceGetPixelFormat", + "source_address": "0x100029204" + }, + { + "address": "0x1000555cc", + "value": "_IOSurfaceLock", + "source_address": "0x1000292f4" + }, + { + "address": "0x1000555d8", + "value": "_IOSurfaceUnlock", + "source_address": "0x10002935c" + }, + { + "address": "0x1000557dc", + "value": "_calloc", + "source_address": "0x1000292b0" + }, + { + "address": "0x10005586c", + "value": "_free", + "source_address": "0x100029364" + }, + { + "address": "0x1000558d8", + "value": "_memcpy", + "source_address": "0x10002933c" + }, + { + "address": "0x10005a900", + "value": "objc_stub::render:toBitmap:rowBytes:bounds:format:colorSpace:", + "source_address": "0x1000292e4" + }, + { + "address": "0x100078160", + "value": "PTR__kCIFormatBGRA8_100078160", + "source_address": "0x10002925c" + }, + { + "address": "0x100078178", + "value": "PTR__kCIFormatRGBAf_100078178", + "source_address": "0x10002924c" + }, + { + "address": "0x100078180", + "value": "PTR__kCIFormatRGBAh_100078180", + "source_address": "0x10002923c" + }, + { + "address": "0x1000a9400", + "value": "_kCIFormatBGRA8", + "source_address": "0x100029264" + }, + { + "address": "0x1000a9700", + "value": "_kCIFormatRGBAf", + "source_address": "0x100029264" + }, + { + "address": "0x1000a9800", + "value": "_kCIFormatRGBAh", + "source_address": "0x100029264" + } + ], + "basic_blocks": [ + { + "start": "0x1000291b4", + "end": "0x1000291d8", + "successors": [ + "0x1000291d8", + "0x100029384" + ] + }, + { + "start": "0x1000291d8", + "end": "0x100029200", + "successors": [ + "0x100029200", + "0x100029384" + ] + }, + { + "start": "0x100029200", + "end": "0x100029218", + "successors": [ + "0x100029218", + "0x100029258" + ] + }, + { + "start": "0x100029218", + "end": "0x100029228", + "successors": [ + "0x100029228", + "0x100029248" + ] + }, + { + "start": "0x100029228", + "end": "0x100029238", + "successors": [ + "0x100029238", + "0x100029384" + ] + }, + { + "start": "0x100029238", + "end": "0x100029248", + "successors": [ + "0x100029264" + ] + }, + { + "start": "0x100029248", + "end": "0x100029258", + "successors": [ + "0x100029264" + ] + }, + { + "start": "0x100029258", + "end": "0x100029264", + "successors": [ + "0x100029264" + ] + }, + { + "start": "0x100029264", + "end": "0x1000292a4", + "successors": [ + "0x1000292a4", + "0x100029384" + ] + }, + { + "start": "0x1000292a4", + "end": "0x1000292b8", + "successors": [ + "0x1000292b8", + "0x100029384" + ] + }, + { + "start": "0x1000292b8", + "end": "0x10002932c", + "successors": [ + "0x10002932c", + "0x100029350" + ] + }, + { + "start": "0x10002932c", + "end": "0x100029330", + "successors": [ + "0x100029330" + ] + }, + { + "start": "0x100029330", + "end": "0x100029350", + "successors": [ + "0x100029330", + "0x100029350" + ] + }, + { + "start": "0x100029350", + "end": "0x10002936c", + "successors": [ + "0x100029388" + ] + }, + { + "start": "0x100029384", + "end": "0x100029388", + "successors": [ + "0x100029388" + ] + }, + { + "start": "0x100029388", + "end": "0x1000293ac", + "successors": [] + } + ], + "native_api": { + "available": true, + "provenance": "ghidra-high-function", + "signature_source": "default", + "calling_convention": "__swiftcall", + "return_type": { + "ordinal": null, + "name": null, + "data_type": "bool", + "size_bytes": 1, + "storage": "w0:1", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type bool." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage" + ], + "role": "return" + }, + "parameters": [ + { + "ordinal": 0, + "name": "param_1", + "data_type": "double", + "size_bytes": 8, + "storage": "d0:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type double." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 1, + "name": "param_2", + "data_type": "undefined8", + "size_bytes": 8, + "storage": "d1:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type undefined8." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 2, + "name": "param_3", + "data_type": "undefined8", + "size_bytes": 8, + "storage": "d2:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type undefined8." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 3, + "name": "param_4", + "data_type": "undefined8", + "size_bytes": 8, + "storage": "d3:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type undefined8." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 4, + "name": "param_5", + "data_type": "ulong", + "size_bytes": 8, + "storage": "x0:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type ulong." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 5, + "name": "param_6", + "data_type": "ID", + "size_bytes": 8, + "storage": "x1:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type ID." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 6, + "name": "param_7", + "data_type": "void *", + "size_bytes": 8, + "storage": "x2:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type void *." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + }, + { + "ordinal": 7, + "name": "param_8", + "data_type": "undefined8", + "size_bytes": 8, + "storage": "x3:8", + "confidence": "low", + "evidence": [ + { + "kind": "signature-source", + "source": "ghidra-function-manager", + "detail": "Function signature source is default." + }, + { + "kind": "decompiler-type", + "source": "ghidra-high-function", + "detail": "HighFunction recovered data type undefined8." + } + ], + "decompiler_artifacts": [ + "recovered-signature", + "register-or-stack-storage", + "compiler-generated-variable" + ], + "role": "parameter" + } + ], + "jump_tables": [], + "pseudocode": { + "classification": "decompiler-generated-non-source", + "compilable": false + }, + "decompiler_artifacts": [ + "recovered-signature", + "register-and-stack-variables", + "compiler-generated-control-flow", + "pointer-arithmetic", + "pseudocode" + ], + "limitations": [ + "Types and calling conventions are Ghidra decompiler observations, not source declarations.", + "Register variables, compiler-generated blocks, and pointer arithmetic remain decompiler artifacts.", + "Pseudocode is neither original source nor guaranteed to compile." + ] + }, + "native_value_flow": { + "available": true, + "provenance": "ghidra-high-pcode", + "operations": [ + { + "id": "0x1000291d4#45", + "address": "0x1000291d4", + "sequence": 45, + "opcode": "INT_NOTEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x31700", + "constant_hex": null + } + }, + { + "id": "0x1000291d4#46", + "address": "0x1000291d4", + "sequence": 46, + "opcode": "CBRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029384", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x31700", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x1000291f8#68", + "address": "0x1000291f8", + "sequence": 68, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100055500", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x1000291f8#701", + "address": "0x1000291f8", + "sequence": 701, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000c0", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "44" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x1000291f8#1379", + "address": "0x1000291f8", + "sequence": 1379, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "44" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x1000291f8#1397", + "address": "0x1000291f8", + "sequence": 1397, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "44" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x1000291f8#1415", + "address": "0x1000291f8", + "sequence": 1415, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "44" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x1000291f8#1711", + "address": "0x1000291f8", + "sequence": 1711, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000c0", + "constant_hex": null + } + }, + { + "id": "0x1000291fc#71", + "address": "0x1000291fc", + "sequence": 71, + "opcode": "INT_EQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000075", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x30d00", + "constant_hex": null + } + }, + { + "id": "0x1000291fc#73", + "address": "0x1000291fc", + "sequence": 73, + "opcode": "CBRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029384", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x30d00", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x1000291fc#1358", + "address": "0x1000291fc", + "sequence": 1358, + "opcode": "INT_AND", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "1" + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000075", + "constant_hex": null + } + }, + { + "id": "0x100029204#76", + "address": "0x100029204", + "sequence": 76, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x1000555b4", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029204#702", + "address": "0x100029204", + "sequence": 702, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000c8", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "4c" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x100029204#1380", + "address": "0x100029204", + "sequence": 1380, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "4c" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x100029204#1398", + "address": "0x100029204", + "sequence": 1398, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "4c" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x100029204#1416", + "address": "0x100029204", + "sequence": 1416, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "4c" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x100029204#1712", + "address": "0x100029204", + "sequence": 1712, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4010", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000c8", + "constant_hex": null + } + }, + { + "id": "0x100029210#85", + "address": "0x100029210", + "sequence": 85, + "opcode": "INT_EQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 4, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "42475241" + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + }, + { + "id": "0x100029210#694", + "address": "0x100029210", + "sequence": 694, + "opcode": "SUBPIECE", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "register", + "size_bytes": 4, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x100029214#90", + "address": "0x100029214", + "sequence": 90, + "opcode": "CBRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029258", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029220#99", + "address": "0x100029220", + "sequence": 99, + "opcode": "INT_EQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 4, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "52476641" + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + }, + { + "id": "0x100029224#104", + "address": "0x100029224", + "sequence": 104, + "opcode": "CBRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029248", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029230#113", + "address": "0x100029230", + "sequence": 113, + "opcode": "INT_NOTEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 4, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "52476841" + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + }, + { + "id": "0x100029234#119", + "address": "0x100029234", + "sequence": 119, + "opcode": "CBRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029384", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029240#123", + "address": "0x100029240", + "sequence": 123, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "8" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40a8", + "constant_hex": null + } + }, + { + "id": "0x100029244#124", + "address": "0x100029244", + "sequence": 124, + "opcode": "BRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029264", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029244#1718", + "address": "0x100029244", + "sequence": 1718, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000130", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000f8", + "constant_hex": null + } + }, + { + "id": "0x100029244#1725", + "address": "0x100029244", + "sequence": 1725, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000130", + "constant_hex": null + } + }, + { + "id": "0x100029250#403", + "address": "0x100029250", + "sequence": 403, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "10" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40a8", + "constant_hex": null + } + }, + { + "id": "0x100029254#404", + "address": "0x100029254", + "sequence": 404, + "opcode": "BRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029264", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029254#1716", + "address": "0x100029254", + "sequence": 1716, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000128", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000e8", + "constant_hex": null + } + }, + { + "id": "0x100029254#1724", + "address": "0x100029254", + "sequence": 1724, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000128", + "constant_hex": null + } + }, + { + "id": "0x100029260#408", + "address": "0x100029260", + "sequence": 408, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "4" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40a8", + "constant_hex": null + } + }, + { + "id": "0x100029260#1717", + "address": "0x100029260", + "sequence": 1717, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000120", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000f0", + "constant_hex": null + } + }, + { + "id": "0x100029260#1723", + "address": "0x100029260", + "sequence": 1723, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000120", + "constant_hex": null + } + }, + { + "id": "0x100029264#126", + "address": "0x100029264", + "sequence": 126, + "opcode": "LOAD", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "1b1" + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4040", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 4, + "location": "unique:0x49000", + "constant_hex": null + } + }, + { + "id": "0x100029264#127", + "address": "0x100029264", + "sequence": 127, + "opcode": "INT_ZEXT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 4, + "location": "unique:0x49000", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c8", + "constant_hex": null + } + }, + { + "id": "0x100029264#846", + "address": "0x100029264", + "sequence": 846, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000f8", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000e8", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000f0", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4040", + "constant_hex": null + } + }, + { + "id": "0x100029264#852", + "address": "0x100029264", + "sequence": 852, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40a8", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40a8", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40a8", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40a8", + "constant_hex": null + } + }, + { + "id": "0x100029278#145", + "address": "0x100029278", + "sequence": 145, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x1000554dc", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5000", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5020", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5040", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5060", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029278#876", + "address": "0x100029278", + "sequence": 876, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000110", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "91" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5000", + "constant_hex": null + } + }, + { + "id": "0x100029278#1381", + "address": "0x100029278", + "sequence": 1381, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "91" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x100029278#1399", + "address": "0x100029278", + "sequence": 1399, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "91" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x100029278#1417", + "address": "0x100029278", + "sequence": 1417, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "91" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x100029278#1721", + "address": "0x100029278", + "sequence": 1721, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5000", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000110", + "constant_hex": null + } + }, + { + "id": "0x10002927c#146", + "address": "0x10002927c", + "sequence": 146, + "opcode": "TRUNC", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5000", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c0", + "constant_hex": null + } + }, + { + "id": "0x100029290#164", + "address": "0x100029290", + "sequence": 164, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100055488", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5000", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5020", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5040", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5060", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029290#877", + "address": "0x100029290", + "sequence": 877, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000118", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "a4" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5000", + "constant_hex": null + } + }, + { + "id": "0x100029290#1382", + "address": "0x100029290", + "sequence": 1382, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "a4" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x100029290#1400", + "address": "0x100029290", + "sequence": 1400, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "a4" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x100029290#1418", + "address": "0x100029290", + "sequence": 1418, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "a4" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x100029290#1722", + "address": "0x100029290", + "sequence": 1722, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5000", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000118", + "constant_hex": null + } + }, + { + "id": "0x100029294#165", + "address": "0x100029294", + "sequence": 165, + "opcode": "TRUNC", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5000", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000138", + "constant_hex": null + } + }, + { + "id": "0x100029294#1726", + "address": "0x100029294", + "sequence": 1726, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000138", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40d0", + "constant_hex": null + } + }, + { + "id": "0x100029298#171", + "address": "0x100029298", + "sequence": 171, + "opcode": "INT_NOTEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c0", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + }, + { + "id": "0x10002929c#1369", + "address": "0x10002929c", + "sequence": 1369, + "opcode": "INT_NOTEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40d0", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + }, + { + "id": "0x1000292a0#199", + "address": "0x1000292a0", + "sequence": 199, + "opcode": "CBRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029384", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x100000b3", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x1000292a0#1674", + "address": "0x1000292a0", + "sequence": 1674, + "opcode": "BOOL_AND", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x100000b3", + "constant_hex": null + } + }, + { + "id": "0x1000292a4#200", + "address": "0x1000292a4", + "sequence": 200, + "opcode": "INT_MULT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c0", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40a8", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000140", + "constant_hex": null + } + }, + { + "id": "0x1000292a4#1727", + "address": "0x1000292a4", + "sequence": 1727, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000140", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c0", + "constant_hex": null + } + }, + { + "id": "0x1000292a8#201", + "address": "0x1000292a8", + "sequence": 201, + "opcode": "INT_MULT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000148", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000150", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x1000292a8#1728", + "address": "0x1000292a8", + "sequence": 1728, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c0", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000148", + "constant_hex": null + } + }, + { + "id": "0x1000292a8#1729", + "address": "0x1000292a8", + "sequence": 1729, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40d0", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000150", + "constant_hex": null + } + }, + { + "id": "0x1000292b0#204", + "address": "0x1000292b0", + "sequence": 204, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x1000557dc", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "1" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x1000292b0#1383", + "address": "0x1000292b0", + "sequence": 1383, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "cc" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x1000292b0#1401", + "address": "0x1000292b0", + "sequence": 1401, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "cc" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x1000292b0#1419", + "address": "0x1000292b0", + "sequence": 1419, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "cc" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x1000292b4#205", + "address": "0x1000292b4", + "sequence": 205, + "opcode": "INT_NOTEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x31700", + "constant_hex": null + } + }, + { + "id": "0x1000292b4#206", + "address": "0x1000292b4", + "sequence": 206, + "opcode": "CBRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029384", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x31700", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x1000292e4#231", + "address": "0x1000292e4", + "sequence": 231, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x10005a900", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4008", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5000", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5020", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5040", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x5060", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c0", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c8", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4018", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x1000292e4#1384", + "address": "0x1000292e4", + "sequence": 1384, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "e7" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x1000292e4#1402", + "address": "0x1000292e4", + "sequence": 1402, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "e7" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x1000292e4#1420", + "address": "0x1000292e4", + "sequence": 1420, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "e7" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x1000292f4#236", + "address": "0x1000292f4", + "sequence": 236, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x1000555cc", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4010", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + } + ], + "output": null + }, + { + "id": "0x1000292f4#1385", + "address": "0x1000292f4", + "sequence": 1385, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "ec" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x1000292f4#1403", + "address": "0x1000292f4", + "sequence": 1403, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "ec" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x1000292f4#1421", + "address": "0x1000292f4", + "sequence": 1421, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "ec" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x1000292fc#239", + "address": "0x1000292fc", + "sequence": 239, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100055590", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x1000292fc#706", + "address": "0x1000292fc", + "sequence": 706, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000d0", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "ef" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x1000292fc#1386", + "address": "0x1000292fc", + "sequence": 1386, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "ef" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x1000292fc#1404", + "address": "0x1000292fc", + "sequence": 1404, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "ef" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x1000292fc#1422", + "address": "0x1000292fc", + "sequence": 1422, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "ef" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x1000292fc#1713", + "address": "0x1000292fc", + "sequence": 1713, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4010", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000d0", + "constant_hex": null + } + }, + { + "id": "0x100029308#243", + "address": "0x100029308", + "sequence": 243, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x10005559c", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029308#707", + "address": "0x100029308", + "sequence": 707, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000d8", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "f3" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x100029308#1387", + "address": "0x100029308", + "sequence": 1387, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "f3" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x100029308#1405", + "address": "0x100029308", + "sequence": 1405, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "f3" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x100029308#1423", + "address": "0x100029308", + "sequence": 1423, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "f3" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x100029308#1714", + "address": "0x100029308", + "sequence": 1714, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4010", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000d8", + "constant_hex": null + } + }, + { + "id": "0x100029314#247", + "address": "0x100029314", + "sequence": 247, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x1000555a8", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029314#708", + "address": "0x100029314", + "sequence": 708, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000e0", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "f7" + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x100029314#1388", + "address": "0x100029314", + "sequence": 1388, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "f7" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x100029314#1406", + "address": "0x100029314", + "sequence": 1406, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "f7" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x100029314#1424", + "address": "0x100029314", + "sequence": 1424, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "f7" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x100029314#1715", + "address": "0x100029314", + "sequence": 1715, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4010", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x100000e0", + "constant_hex": null + } + }, + { + "id": "0x100029318#248", + "address": "0x100029318", + "sequence": 248, + "opcode": "INT_LESSEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c0", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x105", + "constant_hex": null + } + }, + { + "id": "0x10002931c#1371", + "address": "0x10002931c", + "sequence": 1371, + "opcode": "INT_LESSEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40d0", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x105", + "constant_hex": null + } + }, + { + "id": "0x100029320#1372", + "address": "0x100029320", + "sequence": 1372, + "opcode": "INT_NOTEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + }, + { + "id": "0x100029324#300", + "address": "0x100029324", + "sequence": 300, + "opcode": "BOOL_AND", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x100000ac", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x4600", + "constant_hex": null + } + }, + { + "id": "0x100029324#1375", + "address": "0x100029324", + "sequence": 1375, + "opcode": "BOOL_AND", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x105", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x105", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x100000ac", + "constant_hex": null + } + }, + { + "id": "0x100029328#302", + "address": "0x100029328", + "sequence": 302, + "opcode": "CBRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029350", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x100000bb", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029328#1686", + "address": "0x100029328", + "sequence": 1686, + "opcode": "BOOL_AND", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x100000bc", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x100000bb", + "constant_hex": null + } + }, + { + "id": "0x100029328#1687", + "address": "0x100029328", + "sequence": 1687, + "opcode": "BOOL_AND", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x105", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x105", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x100000bc", + "constant_hex": null + } + }, + { + "id": "0x100029328#1720", + "address": "0x100029328", + "sequence": 1720, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000108", + "constant_hex": null + } + }, + { + "id": "0x100029330#855", + "address": "0x100029330", + "sequence": 855, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x24200", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40b0", + "constant_hex": null + } + }, + { + "id": "0x100029330#863", + "address": "0x100029330", + "sequence": 863, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000100", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000108", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c8", + "constant_hex": null + } + }, + { + "id": "0x100029330#867", + "address": "0x100029330", + "sequence": 867, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x7b100", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40d0", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40d0", + "constant_hex": null + } + }, + { + "id": "0x100029330#1394", + "address": "0x100029330", + "sequence": 1394, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x100029330#1412", + "address": "0x100029330", + "sequence": 1412, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x100029330#1430", + "address": "0x100029330", + "sequence": 1430, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x10002933c#308", + "address": "0x10002933c", + "sequence": 308, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x1000558d8", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40b0", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c8", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000158", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x10002933c#1389", + "address": "0x10002933c", + "sequence": 1389, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "134" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x10002933c#1407", + "address": "0x10002933c", + "sequence": 1407, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "134" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x10002933c#1425", + "address": "0x10002933c", + "sequence": 1425, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "134" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x10002933c#1730", + "address": "0x10002933c", + "sequence": 1730, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c0", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000158", + "constant_hex": null + } + }, + { + "id": "0x100029340#312", + "address": "0x100029340", + "sequence": 312, + "opcode": "INT_ADD", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000160", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000168", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000170", + "constant_hex": null + } + }, + { + "id": "0x100029340#1731", + "address": "0x100029340", + "sequence": 1731, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c8", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000160", + "constant_hex": null + } + }, + { + "id": "0x100029340#1732", + "address": "0x100029340", + "sequence": 1732, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40c0", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000168", + "constant_hex": null + } + }, + { + "id": "0x100029340#1733", + "address": "0x100029340", + "sequence": 1733, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000170", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x24200", + "constant_hex": null + } + }, + { + "id": "0x100029344#319", + "address": "0x100029344", + "sequence": 319, + "opcode": "INT_ADD", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000178", + "constant_hex": null + }, + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000180", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000188", + "constant_hex": null + } + }, + { + "id": "0x100029344#1734", + "address": "0x100029344", + "sequence": 1734, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40b0", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000178", + "constant_hex": null + } + }, + { + "id": "0x100029344#1735", + "address": "0x100029344", + "sequence": 1735, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000180", + "constant_hex": null + } + }, + { + "id": "0x100029344#1736", + "address": "0x100029344", + "sequence": 1736, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000188", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x24200", + "constant_hex": null + } + }, + { + "id": "0x100029348#326", + "address": "0x100029348", + "sequence": 326, + "opcode": "INT_ADD", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000190", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "ffffffffffffffff" + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000198", + "constant_hex": null + } + }, + { + "id": "0x100029348#328", + "address": "0x100029348", + "sequence": 328, + "opcode": "INT_NOTEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x7b100", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + }, + { + "id": "0x100029348#1737", + "address": "0x100029348", + "sequence": 1737, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x40d0", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000190", + "constant_hex": null + } + }, + { + "id": "0x100029348#1738", + "address": "0x100029348", + "sequence": 1738, + "opcode": "CAST", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000198", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x7b100", + "constant_hex": null + } + }, + { + "id": "0x10002934c#335", + "address": "0x10002934c", + "sequence": 335, + "opcode": "CBRANCH", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 1, + "location": "0x100029330", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x108", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x10002934c#1719", + "address": "0x10002934c", + "sequence": 1719, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x24200", + "constant_hex": null + } + ], + "output": { + "kind": "unique", + "size_bytes": 8, + "location": "unique:0x10000100", + "constant_hex": null + } + }, + { + "id": "0x100029350#1393", + "address": "0x100029350", + "sequence": 1393, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x100029350#1411", + "address": "0x100029350", + "sequence": 1411, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x100029350#1429", + "address": "0x100029350", + "sequence": 1429, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x10002935c#340", + "address": "0x10002935c", + "sequence": 340, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x1000555d8", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4010", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + }, + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + } + ], + "output": null + }, + { + "id": "0x10002935c#1390", + "address": "0x10002935c", + "sequence": 1390, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "154" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x10002935c#1408", + "address": "0x10002935c", + "sequence": 1408, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "154" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x10002935c#1426", + "address": "0x10002935c", + "sequence": 1426, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "154" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x100029364#343", + "address": "0x100029364", + "sequence": 343, + "opcode": "CALL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x10005586c", + "constant_hex": null + }, + { + "kind": "register", + "size_bytes": 8, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x100029364#1391", + "address": "0x100029364", + "sequence": 1391, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "157" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x100029364#1409", + "address": "0x100029364", + "sequence": 1409, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "157" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x100029364#1427", + "address": "0x100029364", + "sequence": 1427, + "opcode": "INDIRECT", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "constant", + "size_bytes": 4, + "location": null, + "constant_hex": "157" + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x100029384#1396", + "address": "0x100029384", + "sequence": 1396, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x100029384#1414", + "address": "0x100029384", + "sequence": 1414, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x100029384#1432", + "address": "0x100029384", + "sequence": 1432, + "opcode": "MULTIEQUAL", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + }, + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x100029388#1395", + "address": "0x100029388", + "sequence": 1395, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x100029388#1413", + "address": "0x100029388", + "sequence": 1413, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x100029388#1431", + "address": "0x100029388", + "sequence": 1431, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x100029388#1684", + "address": "0x100029388", + "sequence": 1684, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "constant", + "size_bytes": 1, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x100029388#1695", + "address": "0x100029388", + "sequence": 1695, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "unique", + "size_bytes": 1, + "location": "unique:0x4600", + "constant_hex": null + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x100029388#1706", + "address": "0x100029388", + "sequence": 1706, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "constant", + "size_bytes": 1, + "location": null, + "constant_hex": "0" + } + ], + "output": { + "kind": "register", + "size_bytes": 1, + "location": "register:0x4000", + "constant_hex": null + } + }, + { + "id": "0x1000293a8#398", + "address": "0x1000293a8", + "sequence": 398, + "opcode": "RETURN", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x1000293a8#1392", + "address": "0x1000293a8", + "sequence": 1392, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x1000293a8#1410", + "address": "0x1000293a8", + "sequence": 1410, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x1000293a8#1428", + "address": "0x1000293a8", + "sequence": 1428, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x1000293a8#1696", + "address": "0x1000293a8", + "sequence": 1696, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x1000293a8#1697", + "address": "0x1000293a8", + "sequence": 1697, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x1000293a8#1698", + "address": "0x1000293a8", + "sequence": 1698, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x1000293a8#1699", + "address": "0x1000293a8", + "sequence": 1699, + "opcode": "RETURN", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": null + }, + { + "id": "0x1000293a8#1707", + "address": "0x1000293a8", + "sequence": 1707, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078160", + "constant_hex": null + } + }, + { + "id": "0x1000293a8#1708", + "address": "0x1000293a8", + "sequence": 1708, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078178", + "constant_hex": null + } + }, + { + "id": "0x1000293a8#1709", + "address": "0x1000293a8", + "sequence": 1709, + "opcode": "COPY", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + ], + "output": { + "kind": "address", + "size_bytes": 8, + "location": "0x100078180", + "constant_hex": null + } + }, + { + "id": "0x1000293a8#1710", + "address": "0x1000293a8", + "sequence": 1710, + "opcode": "RETURN", + "is_dead": true, + "block_membership": "member", + "inputs": [ + { + "kind": "constant", + "size_bytes": 8, + "location": null, + "constant_hex": "0" + }, + { + "kind": "register", + "size_bytes": 1, + "location": "register:0x4000", + "constant_hex": null + } + ], + "output": null + } + ], + "def_use": [ + { + "definition": "0x1000291d4#45", + "use": "0x1000291d4#46", + "input_index": 1 + }, + { + "definition": "0x1000291f8#1711", + "use": "0x1000291f8#701", + "input_index": 0 + }, + { + "definition": "0x1000291fc#1358", + "use": "0x1000291fc#71", + "input_index": 0 + }, + { + "definition": "0x1000291fc#71", + "use": "0x1000291fc#73", + "input_index": 1 + }, + { + "definition": "0x1000291f8#701", + "use": "0x1000291fc#1358", + "input_index": 0 + }, + { + "definition": "0x100029204#1712", + "use": "0x100029204#702", + "input_index": 0 + }, + { + "definition": "0x1000291f8#1379", + "use": "0x100029204#1380", + "input_index": 0 + }, + { + "definition": "0x1000291f8#1397", + "use": "0x100029204#1398", + "input_index": 0 + }, + { + "definition": "0x1000291f8#1415", + "use": "0x100029204#1416", + "input_index": 0 + }, + { + "definition": "0x100029210#694", + "use": "0x100029210#85", + "input_index": 0 + }, + { + "definition": "0x100029204#702", + "use": "0x100029210#694", + "input_index": 0 + }, + { + "definition": "0x100029210#85", + "use": "0x100029214#90", + "input_index": 1 + }, + { + "definition": "0x100029210#694", + "use": "0x100029220#99", + "input_index": 0 + }, + { + "definition": "0x100029220#99", + "use": "0x100029224#104", + "input_index": 1 + }, + { + "definition": "0x100029210#694", + "use": "0x100029230#113", + "input_index": 0 + }, + { + "definition": "0x100029230#113", + "use": "0x100029234#119", + "input_index": 1 + }, + { + "definition": "0x100029244#1725", + "use": "0x100029244#1718", + "input_index": 0 + }, + { + "definition": "0x100029204#1416", + "use": "0x100029244#1725", + "input_index": 0 + }, + { + "definition": "0x100029254#1724", + "use": "0x100029254#1716", + "input_index": 0 + }, + { + "definition": "0x100029204#1398", + "use": "0x100029254#1724", + "input_index": 0 + }, + { + "definition": "0x100029260#1723", + "use": "0x100029260#1717", + "input_index": 0 + }, + { + "definition": "0x100029204#1380", + "use": "0x100029260#1723", + "input_index": 0 + }, + { + "definition": "0x100029264#846", + "use": "0x100029264#126", + "input_index": 1 + }, + { + "definition": "0x100029264#126", + "use": "0x100029264#127", + "input_index": 0 + }, + { + "definition": "0x100029244#1718", + "use": "0x100029264#846", + "input_index": 0 + }, + { + "definition": "0x100029254#1716", + "use": "0x100029264#846", + "input_index": 1 + }, + { + "definition": "0x100029260#1717", + "use": "0x100029264#846", + "input_index": 2 + }, + { + "definition": "0x100029240#123", + "use": "0x100029264#852", + "input_index": 0 + }, + { + "definition": "0x100029250#403", + "use": "0x100029264#852", + "input_index": 1 + }, + { + "definition": "0x100029260#408", + "use": "0x100029264#852", + "input_index": 2 + }, + { + "definition": "0x100029278#1721", + "use": "0x100029278#876", + "input_index": 0 + }, + { + "definition": "0x100029204#1380", + "use": "0x100029278#1381", + "input_index": 0 + }, + { + "definition": "0x100029204#1398", + "use": "0x100029278#1399", + "input_index": 0 + }, + { + "definition": "0x100029204#1416", + "use": "0x100029278#1417", + "input_index": 0 + }, + { + "definition": "0x100029278#876", + "use": "0x10002927c#146", + "input_index": 0 + }, + { + "definition": "0x100029290#1722", + "use": "0x100029290#877", + "input_index": 0 + }, + { + "definition": "0x100029278#1381", + "use": "0x100029290#1382", + "input_index": 0 + }, + { + "definition": "0x100029278#1399", + "use": "0x100029290#1400", + "input_index": 0 + }, + { + "definition": "0x100029278#1417", + "use": "0x100029290#1418", + "input_index": 0 + }, + { + "definition": "0x100029290#877", + "use": "0x100029294#165", + "input_index": 0 + }, + { + "definition": "0x100029294#165", + "use": "0x100029294#1726", + "input_index": 0 + }, + { + "definition": "0x10002927c#146", + "use": "0x100029298#171", + "input_index": 0 + }, + { + "definition": "0x100029294#1726", + "use": "0x10002929c#1369", + "input_index": 0 + }, + { + "definition": "0x1000292a0#1674", + "use": "0x1000292a0#199", + "input_index": 1 + }, + { + "definition": "0x100029298#171", + "use": "0x1000292a0#1674", + "input_index": 0 + }, + { + "definition": "0x10002929c#1369", + "use": "0x1000292a0#1674", + "input_index": 1 + }, + { + "definition": "0x10002927c#146", + "use": "0x1000292a4#200", + "input_index": 0 + }, + { + "definition": "0x100029264#852", + "use": "0x1000292a4#200", + "input_index": 1 + }, + { + "definition": "0x1000292a4#200", + "use": "0x1000292a4#1727", + "input_index": 0 + }, + { + "definition": "0x1000292a8#1728", + "use": "0x1000292a8#201", + "input_index": 0 + }, + { + "definition": "0x1000292a8#1729", + "use": "0x1000292a8#201", + "input_index": 1 + }, + { + "definition": "0x1000292a4#1727", + "use": "0x1000292a8#1728", + "input_index": 0 + }, + { + "definition": "0x100029294#1726", + "use": "0x1000292a8#1729", + "input_index": 0 + }, + { + "definition": "0x1000292a8#201", + "use": "0x1000292b0#204", + "input_index": 1 + }, + { + "definition": "0x100029290#1382", + "use": "0x1000292b0#1383", + "input_index": 0 + }, + { + "definition": "0x100029290#1400", + "use": "0x1000292b0#1401", + "input_index": 0 + }, + { + "definition": "0x100029290#1418", + "use": "0x1000292b0#1419", + "input_index": 0 + }, + { + "definition": "0x1000292b0#204", + "use": "0x1000292b4#205", + "input_index": 0 + }, + { + "definition": "0x1000292b4#205", + "use": "0x1000292b4#206", + "input_index": 1 + }, + { + "definition": "0x1000292b0#204", + "use": "0x1000292e4#231", + "input_index": 7 + }, + { + "definition": "0x1000292a4#1727", + "use": "0x1000292e4#231", + "input_index": 8 + }, + { + "definition": "0x100029264#127", + "use": "0x1000292e4#231", + "input_index": 9 + }, + { + "definition": "0x1000292b0#1383", + "use": "0x1000292e4#1384", + "input_index": 0 + }, + { + "definition": "0x1000292b0#1401", + "use": "0x1000292e4#1402", + "input_index": 0 + }, + { + "definition": "0x1000292b0#1419", + "use": "0x1000292e4#1420", + "input_index": 0 + }, + { + "definition": "0x1000292e4#1384", + "use": "0x1000292f4#1385", + "input_index": 0 + }, + { + "definition": "0x1000292e4#1402", + "use": "0x1000292f4#1403", + "input_index": 0 + }, + { + "definition": "0x1000292e4#1420", + "use": "0x1000292f4#1421", + "input_index": 0 + }, + { + "definition": "0x1000292fc#1713", + "use": "0x1000292fc#706", + "input_index": 0 + }, + { + "definition": "0x1000292f4#1385", + "use": "0x1000292fc#1386", + "input_index": 0 + }, + { + "definition": "0x1000292f4#1403", + "use": "0x1000292fc#1404", + "input_index": 0 + }, + { + "definition": "0x1000292f4#1421", + "use": "0x1000292fc#1422", + "input_index": 0 + }, + { + "definition": "0x100029308#1714", + "use": "0x100029308#707", + "input_index": 0 + }, + { + "definition": "0x1000292fc#1386", + "use": "0x100029308#1387", + "input_index": 0 + }, + { + "definition": "0x1000292fc#1404", + "use": "0x100029308#1405", + "input_index": 0 + }, + { + "definition": "0x1000292fc#1422", + "use": "0x100029308#1423", + "input_index": 0 + }, + { + "definition": "0x100029314#1715", + "use": "0x100029314#708", + "input_index": 0 + }, + { + "definition": "0x100029308#1387", + "use": "0x100029314#1388", + "input_index": 0 + }, + { + "definition": "0x100029308#1405", + "use": "0x100029314#1406", + "input_index": 0 + }, + { + "definition": "0x100029308#1423", + "use": "0x100029314#1424", + "input_index": 0 + }, + { + "definition": "0x1000292a4#1727", + "use": "0x100029318#248", + "input_index": 0 + }, + { + "definition": "0x100029308#707", + "use": "0x100029318#248", + "input_index": 1 + }, + { + "definition": "0x100029294#1726", + "use": "0x10002931c#1371", + "input_index": 0 + }, + { + "definition": "0x100029314#708", + "use": "0x10002931c#1371", + "input_index": 1 + }, + { + "definition": "0x1000292fc#706", + "use": "0x100029320#1372", + "input_index": 0 + }, + { + "definition": "0x100029324#1375", + "use": "0x100029324#300", + "input_index": 0 + }, + { + "definition": "0x100029320#1372", + "use": "0x100029324#300", + "input_index": 1 + }, + { + "definition": "0x100029318#248", + "use": "0x100029324#1375", + "input_index": 0 + }, + { + "definition": "0x10002931c#1371", + "use": "0x100029324#1375", + "input_index": 1 + }, + { + "definition": "0x100029328#1686", + "use": "0x100029328#302", + "input_index": 1 + }, + { + "definition": "0x100029328#1687", + "use": "0x100029328#1686", + "input_index": 0 + }, + { + "definition": "0x100029320#1372", + "use": "0x100029328#1686", + "input_index": 1 + }, + { + "definition": "0x100029318#248", + "use": "0x100029328#1687", + "input_index": 0 + }, + { + "definition": "0x10002931c#1371", + "use": "0x100029328#1687", + "input_index": 1 + }, + { + "definition": "0x1000292b0#204", + "use": "0x100029328#1720", + "input_index": 0 + }, + { + "definition": "0x100029344#1736", + "use": "0x100029330#855", + "input_index": 0 + }, + { + "definition": "0x1000292fc#706", + "use": "0x100029330#855", + "input_index": 1 + }, + { + "definition": "0x10002934c#1719", + "use": "0x100029330#863", + "input_index": 0 + }, + { + "definition": "0x100029328#1720", + "use": "0x100029330#863", + "input_index": 1 + }, + { + "definition": "0x100029348#1738", + "use": "0x100029330#867", + "input_index": 0 + }, + { + "definition": "0x100029294#1726", + "use": "0x100029330#867", + "input_index": 1 + }, + { + "definition": "0x10002933c#1389", + "use": "0x100029330#1394", + "input_index": 0 + }, + { + "definition": "0x100029314#1388", + "use": "0x100029330#1394", + "input_index": 1 + }, + { + "definition": "0x10002933c#1407", + "use": "0x100029330#1412", + "input_index": 0 + }, + { + "definition": "0x100029314#1406", + "use": "0x100029330#1412", + "input_index": 1 + }, + { + "definition": "0x10002933c#1425", + "use": "0x100029330#1430", + "input_index": 0 + }, + { + "definition": "0x100029314#1424", + "use": "0x100029330#1430", + "input_index": 1 + }, + { + "definition": "0x100029330#855", + "use": "0x10002933c#308", + "input_index": 1 + }, + { + "definition": "0x100029330#863", + "use": "0x10002933c#308", + "input_index": 2 + }, + { + "definition": "0x10002933c#1730", + "use": "0x10002933c#308", + "input_index": 3 + }, + { + "definition": "0x100029330#1394", + "use": "0x10002933c#1389", + "input_index": 0 + }, + { + "definition": "0x100029330#1412", + "use": "0x10002933c#1407", + "input_index": 0 + }, + { + "definition": "0x100029330#1430", + "use": "0x10002933c#1425", + "input_index": 0 + }, + { + "definition": "0x1000292a4#1727", + "use": "0x10002933c#1730", + "input_index": 0 + }, + { + "definition": "0x100029340#1731", + "use": "0x100029340#312", + "input_index": 0 + }, + { + "definition": "0x100029340#1732", + "use": "0x100029340#312", + "input_index": 1 + }, + { + "definition": "0x100029330#863", + "use": "0x100029340#1731", + "input_index": 0 + }, + { + "definition": "0x1000292a4#1727", + "use": "0x100029340#1732", + "input_index": 0 + }, + { + "definition": "0x100029340#312", + "use": "0x100029340#1733", + "input_index": 0 + }, + { + "definition": "0x100029344#1734", + "use": "0x100029344#319", + "input_index": 0 + }, + { + "definition": "0x100029344#1735", + "use": "0x100029344#319", + "input_index": 1 + }, + { + "definition": "0x100029330#855", + "use": "0x100029344#1734", + "input_index": 0 + }, + { + "definition": "0x100029308#707", + "use": "0x100029344#1735", + "input_index": 0 + }, + { + "definition": "0x100029344#319", + "use": "0x100029344#1736", + "input_index": 0 + }, + { + "definition": "0x100029348#1737", + "use": "0x100029348#326", + "input_index": 0 + }, + { + "definition": "0x100029348#1738", + "use": "0x100029348#328", + "input_index": 0 + }, + { + "definition": "0x100029330#867", + "use": "0x100029348#1737", + "input_index": 0 + }, + { + "definition": "0x100029348#326", + "use": "0x100029348#1738", + "input_index": 0 + }, + { + "definition": "0x100029348#328", + "use": "0x10002934c#335", + "input_index": 1 + }, + { + "definition": "0x100029340#1733", + "use": "0x10002934c#1719", + "input_index": 0 + }, + { + "definition": "0x100029314#1388", + "use": "0x100029350#1393", + "input_index": 0 + }, + { + "definition": "0x10002933c#1389", + "use": "0x100029350#1393", + "input_index": 1 + }, + { + "definition": "0x100029314#1406", + "use": "0x100029350#1411", + "input_index": 0 + }, + { + "definition": "0x10002933c#1407", + "use": "0x100029350#1411", + "input_index": 1 + }, + { + "definition": "0x100029314#1424", + "use": "0x100029350#1429", + "input_index": 0 + }, + { + "definition": "0x10002933c#1425", + "use": "0x100029350#1429", + "input_index": 1 + }, + { + "definition": "0x100029350#1393", + "use": "0x10002935c#1390", + "input_index": 0 + }, + { + "definition": "0x100029350#1411", + "use": "0x10002935c#1408", + "input_index": 0 + }, + { + "definition": "0x100029350#1429", + "use": "0x10002935c#1426", + "input_index": 0 + }, + { + "definition": "0x1000292b0#204", + "use": "0x100029364#343", + "input_index": 1 + }, + { + "definition": "0x10002935c#1390", + "use": "0x100029364#1391", + "input_index": 0 + }, + { + "definition": "0x10002935c#1408", + "use": "0x100029364#1409", + "input_index": 0 + }, + { + "definition": "0x10002935c#1426", + "use": "0x100029364#1427", + "input_index": 0 + }, + { + "definition": "0x1000291f8#1379", + "use": "0x100029384#1396", + "input_index": 1 + }, + { + "definition": "0x100029290#1382", + "use": "0x100029384#1396", + "input_index": 2 + }, + { + "definition": "0x1000292b0#1383", + "use": "0x100029384#1396", + "input_index": 3 + }, + { + "definition": "0x1000291f8#1397", + "use": "0x100029384#1414", + "input_index": 1 + }, + { + "definition": "0x100029290#1400", + "use": "0x100029384#1414", + "input_index": 2 + }, + { + "definition": "0x1000292b0#1401", + "use": "0x100029384#1414", + "input_index": 3 + }, + { + "definition": "0x1000291f8#1415", + "use": "0x100029384#1432", + "input_index": 1 + }, + { + "definition": "0x100029290#1418", + "use": "0x100029384#1432", + "input_index": 2 + }, + { + "definition": "0x1000292b0#1419", + "use": "0x100029384#1432", + "input_index": 3 + }, + { + "definition": "0x100029384#1396", + "use": "0x100029388#1395", + "input_index": 0 + }, + { + "definition": "0x100029384#1414", + "use": "0x100029388#1413", + "input_index": 0 + }, + { + "definition": "0x100029384#1432", + "use": "0x100029388#1431", + "input_index": 0 + }, + { + "definition": "0x100029324#300", + "use": "0x100029388#1695", + "input_index": 0 + }, + { + "definition": "0x100029388#1684", + "use": "0x1000293a8#398", + "input_index": 1 + }, + { + "definition": "0x100029388#1395", + "use": "0x1000293a8#1392", + "input_index": 0 + }, + { + "definition": "0x100029388#1413", + "use": "0x1000293a8#1410", + "input_index": 0 + }, + { + "definition": "0x100029388#1431", + "use": "0x1000293a8#1428", + "input_index": 0 + }, + { + "definition": "0x100029364#1391", + "use": "0x1000293a8#1696", + "input_index": 0 + }, + { + "definition": "0x100029364#1409", + "use": "0x1000293a8#1697", + "input_index": 0 + }, + { + "definition": "0x100029364#1427", + "use": "0x1000293a8#1698", + "input_index": 0 + }, + { + "definition": "0x100029388#1695", + "use": "0x1000293a8#1699", + "input_index": 1 + }, + { + "definition": "0x100029204#1380", + "use": "0x1000293a8#1707", + "input_index": 0 + }, + { + "definition": "0x100029204#1398", + "use": "0x1000293a8#1708", + "input_index": 0 + }, + { + "definition": "0x100029204#1416", + "use": "0x1000293a8#1709", + "input_index": 0 + }, + { + "definition": "0x100029388#1706", + "use": "0x1000293a8#1710", + "input_index": 1 + } + ], + "effects": [ + { + "operation": "0x1000291d4#46", + "kind": "conditional_branch", + "operand_input": null, + "value_input": 1 + }, + { + "operation": "0x1000291f8#68", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x1000291fc#73", + "kind": "conditional_branch", + "operand_input": null, + "value_input": 1 + }, + { + "operation": "0x100029204#76", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x100029214#90", + "kind": "conditional_branch", + "operand_input": null, + "value_input": 1 + }, + { + "operation": "0x100029224#104", + "kind": "conditional_branch", + "operand_input": null, + "value_input": 1 + }, + { + "operation": "0x100029234#119", + "kind": "conditional_branch", + "operand_input": null, + "value_input": 1 + }, + { + "operation": "0x100029264#126", + "kind": "memory_read", + "operand_input": 1, + "value_input": null + }, + { + "operation": "0x100029278#145", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x100029290#164", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x1000292a0#199", + "kind": "conditional_branch", + "operand_input": null, + "value_input": 1 + }, + { + "operation": "0x1000292b0#204", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x1000292b4#206", + "kind": "conditional_branch", + "operand_input": null, + "value_input": 1 + }, + { + "operation": "0x1000292e4#231", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x1000292f4#236", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x1000292fc#239", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x100029308#243", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x100029314#247", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x100029328#302", + "kind": "conditional_branch", + "operand_input": null, + "value_input": 1 + }, + { + "operation": "0x10002933c#308", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x10002934c#335", + "kind": "conditional_branch", + "operand_input": null, + "value_input": 1 + }, + { + "operation": "0x10002935c#340", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + }, + { + "operation": "0x100029364#343", + "kind": "direct_call", + "operand_input": 0, + "value_input": null + } + ], + "parameters": [ + { + "ordinal": 0, + "name": "param_1", + "data_type": "/double" + }, + { + "ordinal": 1, + "name": "param_2", + "data_type": "/undefined8" + }, + { + "ordinal": 2, + "name": "param_3", + "data_type": "/undefined8" + }, + { + "ordinal": 3, + "name": "param_4", + "data_type": "/undefined8" + }, + { + "ordinal": 4, + "name": "param_5", + "data_type": "/ulong" + }, + { + "ordinal": 5, + "name": "param_6", + "data_type": "/_objc2_/ID" + }, + { + "ordinal": 6, + "name": "param_7", + "data_type": "/void *" + }, + { + "ordinal": 7, + "name": "param_8", + "data_type": "/undefined8" + } + ], + "parameter_uses": [ + { + "ordinal": 4, + "use": "0x1000291d4#45", + "input_index": 0 + }, + { + "ordinal": 4, + "use": "0x1000291f8#1711", + "input_index": 0 + }, + { + "ordinal": 6, + "use": "0x100029204#1712", + "input_index": 0 + }, + { + "ordinal": 0, + "use": "0x100029278#145", + "input_index": 1 + }, + { + "ordinal": 1, + "use": "0x100029278#145", + "input_index": 2 + }, + { + "ordinal": 2, + "use": "0x100029278#145", + "input_index": 3 + }, + { + "ordinal": 3, + "use": "0x100029278#145", + "input_index": 4 + }, + { + "ordinal": 0, + "use": "0x100029278#1721", + "input_index": 0 + }, + { + "ordinal": 0, + "use": "0x100029290#164", + "input_index": 1 + }, + { + "ordinal": 1, + "use": "0x100029290#164", + "input_index": 2 + }, + { + "ordinal": 2, + "use": "0x100029290#164", + "input_index": 3 + }, + { + "ordinal": 3, + "use": "0x100029290#164", + "input_index": 4 + }, + { + "ordinal": 0, + "use": "0x100029290#1722", + "input_index": 0 + }, + { + "ordinal": 5, + "use": "0x1000292e4#231", + "input_index": 1 + }, + { + "ordinal": 0, + "use": "0x1000292e4#231", + "input_index": 2 + }, + { + "ordinal": 1, + "use": "0x1000292e4#231", + "input_index": 3 + }, + { + "ordinal": 2, + "use": "0x1000292e4#231", + "input_index": 4 + }, + { + "ordinal": 3, + "use": "0x1000292e4#231", + "input_index": 5 + }, + { + "ordinal": 4, + "use": "0x1000292e4#231", + "input_index": 6 + }, + { + "ordinal": 7, + "use": "0x1000292e4#231", + "input_index": 10 + }, + { + "ordinal": 6, + "use": "0x1000292f4#236", + "input_index": 1 + }, + { + "ordinal": 6, + "use": "0x1000292fc#1713", + "input_index": 0 + }, + { + "ordinal": 6, + "use": "0x100029308#1714", + "input_index": 0 + }, + { + "ordinal": 6, + "use": "0x100029314#1715", + "input_index": 0 + }, + { + "ordinal": 6, + "use": "0x10002935c#340", + "input_index": 1 + } + ], + "truncated": false, + "omitted_operations_lower_bound": 0, + "known_omitted_inputs": 0, + "known_omitted_edges": 0, + "limitations": [ + "High p-code is decompiler-derived, not original source or runtime behavior. is_dead preserves the Java AST flag; decoded block members can retain that flag, so block_membership separately reports actual syntax-tree membership.", + "Def-use links do not cross function boundaries and may omit memory aliasing, call side effects, or unresolved indirect flow.", + "Memory read/write effects include stack and temporary memory operations; they do not identify persistent state or business meaning.", + "Operation, input, and def-use limits can truncate large functions; inspect truncation, omitted lower bounds, and known omitted counts before drawing conclusions.", + "Known omitted-edge counts cover links omitted from retained operations; omitted operations may contain additional uncounted links." + ] + }, + "limitations": [ + "Unresolved computed or indirect flows without target addresses are not represented as reference edges.", + "Thunk and external classifications are Ghidra FunctionManager observations; they do not resolve targetless calls.", + "Pseudocode and assembly are Ghidra-specific representations, not original source or Hopper-equivalent text.", + "Synthetic Ghidra entry-point references without actionable memory sources are omitted." + ] + }, + "confidence": "observed", + "authority": "shipped-artifact", + "environment": null, + "limitations": [ + "The session serves operations only after Ghidra reports default auto-analysis complete; incomplete analysis does not expose partial results.", + "The imported Program and temporary project are ephemeral and deleted on close. Annotation operations edit session database metadata; original executable bytes are never written.", + "Cancelling an active Ghidra request terminates its ephemeral database and discards session annotations. The selected target remains open; the next provider query imports the original artifact again.", + "Default-space addresses use lowercase 0x-prefixed hexadecimal; other address spaces use :0x.", + "References cover the complete Ghidra function-body AddressSet and exact entry. Dossier incoming edges omit sources owned by that function; procedure_references also retains those internal edges.", + "The dossier combines Ghidra FunctionManager, Listing, ReferenceManager, BasicBlockModel, and decompiler observations; provider-specific pseudocode and assembly are not cross-provider text invariants.", + "Resolved reference metadata identifies computed, indirect, external, call, jump, and data edges; unresolved targetless flows remain unknown, and function classifications distinguish thunks and externals.", + "Synthetic Ghidra entry-point references without actionable memory sources are omitted.", + "The Java bridge serializes one function request per Program and lets each decompilation run until it completes or the caller cancels.", + "macOS sessions require a matching executable Ghidra native decompiler; REA checks for it but does not build native components or change Gatekeeper quarantine state." + ], + "locations": [], + "evidence_links": [] + } + ] +} diff --git a/docs/analysis/下巴与坐标分析.md b/docs/analysis/下巴与坐标分析.md index ae30908..60f0c65 100644 --- a/docs/analysis/下巴与坐标分析.md +++ b/docs/analysis/下巴与坐标分析.md @@ -21,3 +21,18 @@ 纯CI图像中,76点落在真实瞳孔和下巴,没有全局Y轴反置。但FxPlug适配层曾根据imageOrigin在输入、输出各翻转一次。以相同物理top-first照片字节离屏构造TOP_LEFT输入输出时,旧代码默认直通仍精确一致,却能复现下巴作用到眼部的现象;这说明直通测试无法排除中间处理倒置。 imageOrigin描述坐标轴方向,不能单凭枚举推断IOSurface的物理行序。原版render主入口包装CIImage后仅见正尺度和位移,仍需核对其输出helper,不能仅凭主函数的有界检索宣称原版整个链条无翻转。原生FCP本次实际缓冲行序未捕获,最后视觉交由用户自测。临时照片、完整人脸坐标和探针输出均留在被忽略的build目录。 + +## 原版输出链闭环与适配修复 + +继续REA分析两个输出helper后,确认主入口所见的无额外翻转不是仅靠字符串缺失作出的猜测: + +- `0x10002911c`直接调用`CIContext render:toIOSurface:bounds:colorSpace:`,没有修改图像方向。证据`ev_88a71ec62fade296495f1e3f5428cdb15ad4cda43866e09fb040fa3a4bdb0440`。 +- `0x1000291b4`备用路径先render到BGRA8/RGBAh/RGBAf位图,再按源、目的行步长同时正向递增复制到IOSurface,没有倒行。证据`ev_110d76f7958decb0c56b7daafe292d60a8bc56cd035b40a997f61395cb91ebfe`,另有汇编交叉核对。完整记录见[rea-image-orientation.json](rea-image-orientation.json)。 + +已移除我们输入/输出两处基于TOP_LEFT的额外翻转,保持与原版同类CI→IOSurface路径一致。独立探针在相同物理top-first字节下验证默认/大眼/下巴正负×四种源/目的标签共16组,全部与upright CI参考逐字节一致;旧代码在相同构造下出现下巴到眼部的热点,且默认直通0误差不能揭示内部倒置。这里验证的是物理缓冲构造与修复链,未捕获本次实际FCP缓冲。 + +Apple[FxImageOrigin](https://developer.apple.com/documentation/professional_video_applications/fximageorigin)和本机SDK说明其描述坐标轴方向;[FxPlug渲染说明](https://developer.apple.com/documentation/professional-video-applications/rendering-in-fxplug)确认FxPlug4经IOSurface传入图像。文档本身未规定每个宿主的物理行序,本次改动依据为原版链和独立物理测试,不能把文档扩张成原生内存捕获。 + +旧档案没有记录图像适配坐标契约,无法安全判断是否由旧翻转链产生。adapter现为新分析结果加`hostCoordinateSpace=iosurface-ci-y-up-v1`;未标记记录保留原字符串,渲染和续分析均不载入旧坐标。当前目标暂用实时跟随,新分析后恢复离线记录。不改通用PGFaceProcessor的旧档案读取能力,也不把用户记录直接删除或静默改写成新坐标。 + +独立生理热点检查:NASA、实际素材0秒、4秒侧脸三张图均在真实下巴1.2–2.9像素内获得最大位移,实际下巴正值上收、负值延伸,双瞳孔采样位移不超过0.00003像素;12项专项检查通过。另同一素材11帧共494项瘦脸/下巴ASan检查通过,含重复基础用例,不与完整回归简单相加。用户照片、帧及完整点位均没有入库。 diff --git a/docs/analysis/脸型变形与转脸分析.md b/docs/analysis/脸型变形与转脸分析.md index 38a2a20..42bf39d 100644 --- a/docs/analysis/脸型变形与转脸分析.md +++ b/docs/analysis/脸型变形与转脸分析.md @@ -82,3 +82,5 @@ xcrun clang -fobjc-arc -Wall -Wextra \ ## 后续修复状态 1.0.5已实现并安装76点/17组局部瘦脸,旧的矩形框瘦脸已移除。上文“安装版未修复”为本次分析开始时1.0.4的历史状态。新增独立数值场与真实素材回归,签名公证及安装记录见 `../验证记录.md`。Motion/FCP最终视觉由用户自测,其他8类脸型控制与快速多人重叠的既有近似边界仍保留。 + +1.0.6继续分析下巴与宿主图像轴,新增原版三pin下巴及CI/IOSurface无额外翻转修复,详见[下巴与坐标分析](下巴与坐标分析.md)。其余七类控制仍为近似实现。 diff --git a/docs/verification/v1.0.6/anatomical-summary.json b/docs/verification/v1.0.6/anatomical-summary.json new file mode 100644 index 0000000..a6c0ab3 --- /dev/null +++ b/docs/verification/v1.0.6/anatomical-summary.json @@ -0,0 +1,15 @@ +{ + "checks": 12, + "cases": 3, + "includes_profile": true, + "processor_sha256": "fe4f2a6fc28799cc9b81832baaa2d6739320bde9def175ecc8a4494d004d6b28", + "max_pupil_sampling_displacement_px": 2.8653327774463833e-05, + "peak_distance_to_real_chin_px": [ + 1.1827483260479077, + 2.8140858161593 + ], + "positive_visual_direction": "toward lower lip", + "negative_visual_direction": "away from lower lip", + "actual_photos_and_full_geometry": "ignored local build only", + "scope": "standalone actual PNG anatomy; bypasses FxPlug adapter; no native host operation" +} diff --git a/docs/verification/v1.0.6/core-tests.txt b/docs/verification/v1.0.6/core-tests.txt new file mode 100644 index 0000000..c5b3086 --- /dev/null +++ b/docs/verification/v1.0.6/core-tests.txt @@ -0,0 +1,5 @@ +Beauty renderer: 49 checks, 0 failures (Metal). +2026-10-21 20:48:04.999 face-tests[9473:5455578] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2 +Face processing: 116 checks passed +2026-10-21 20:48:08.750 slim-tests[9480:5455684] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2 +PASS: 394 slim alignment checks; maximum UV oracle error 1.09828022e-05 diff --git a/docs/verification/v1.0.6/host-tests.txt b/docs/verification/v1.0.6/host-tests.txt new file mode 100644 index 0000000..6d9e2d7 --- /dev/null +++ b/docs/verification/v1.0.6/host-tests.txt @@ -0,0 +1,21 @@ +2026-10-21 20:55:46.681 host-tests[10689:5467036] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2 +Default IOSurface maximum byte difference: 0 +Alternate destination tag maximum byte difference: 0 +Anatomy default 0/0 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0 +Anatomy default 0/1 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0 +Anatomy default 1/0 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0 +Anatomy default 1/1 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0 +Anatomy big-eye 0/0 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0 +Anatomy big-eye 0/1 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0 +Anatomy big-eye 1/0 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0 +Anatomy big-eye 1/1 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0 +Anatomy chin-positive 0/0 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0 +Anatomy chin-positive 0/1 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0 +Anatomy chin-positive 1/0 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0 +Anatomy chin-positive 1/1 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0 +Anatomy chin-negative 0/0 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0 +Anatomy chin-negative 0/1 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0 +Anatomy chin-negative 1/0 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0 +Anatomy chin-negative 1/1 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0 +Legacy fallback upright comparison: max=2 mean=0.0010357 +Host adapter: 247 checks, 0 failures diff --git a/docs/verification/v1.0.6/osc-tests.txt b/docs/verification/v1.0.6/osc-tests.txt new file mode 100644 index 0000000..5b42805 --- /dev/null +++ b/docs/verification/v1.0.6/osc-tests.txt @@ -0,0 +1,21 @@ +2026-10-21 20:53:14.697 osc-tests[10458:5463835] PGFaceOSC point-write desired=(0.25,0.75) setter=(0.25,0.75) readback=(0.25,0.75) mode=normalized verified=1 +2026-10-21 20:53:14.705 osc-tests[10458:5463835] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(80,180) surface=320x240 origin=0 +2026-10-21 20:53:15.118 osc-tests[10458:5463835] PGFaceOSC point-write desired=(0.8,0.3) setter=(1152,-432) readback=(0.8,0.3) mode=centered-pixels verified=1 +2026-10-21 20:53:15.118 osc-tests[10458:5463835] PGFaceOSC coordinates selection=(0.7,0.4) objectBounds=(-1920,-1080,3840,2160) canvas=(152,78) surface=320x240 origin=0 +2026-10-21 20:53:15.168 osc-tests[10458:5463835] PGFaceOSC point-write desired=(0.8,0.3) setter=(0.8,0.3) readback=(0.12345,0.87654) mode=normalized verified=0 +2026-10-21 20:53:15.168 osc-tests[10458:5463835] PGFaceOSC point-write desired=(0.75,0.25) setter=(0.75,0.25) readback=(0.75,0.25) mode=normalized verified=1 +2026-10-21 20:53:15.168 osc-tests[10458:5463835] PGFaceOSC coordinates selection=(0.75,0.25) objectBounds=(-100,-50,200,100) canvas=(160,60) surface=320x240 origin=0 +2026-10-21 20:53:15.218 osc-tests[10458:5463835] PGFaceOSC point-write desired=(0.625,0.375) setter=(0.625,0.375) readback=(0.625,0.375) mode=normalized verified=1 +2026-10-21 20:53:15.218 osc-tests[10458:5463835] PGFaceOSC coordinates selection=(0.625,0.375) objectBounds=(-100,-50,200,100) canvas=(240,60) surface=320x240 origin=0 +2026-10-21 20:53:15.268 osc-tests[10458:5463835] PGFaceOSC point-write desired=(0.25,0.75) setter=(0.25,0.75) readback=(0.25,0.75) mode=normalized verified=1 +2026-10-21 20:53:15.268 osc-tests[10458:5463835] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(144,180) surface=320x240 origin=0 +2026-10-21 20:53:15.318 osc-tests[10458:5463835] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1 +2026-10-21 20:53:15.318 osc-tests[10458:5463835] PGFaceOSC coordinates selection=(0,1) objectBounds=(-100,-50,200,100) canvas=(100,140) surface=320x240 origin=0 +2026-10-21 20:53:15.369 osc-tests[10458:5463835] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(nan,nan) surface=320x240 origin=0 +2026-10-21 20:53:15.418 osc-tests[10458:5463835] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1 +2026-10-21 20:53:15.418 osc-tests[10458:5463835] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(inf,nan) surface=320x240 origin=0 +2026-10-21 20:53:15.467 osc-tests[10458:5463835] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1 +2026-10-21 20:53:15.467 osc-tests[10458:5463835] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(80,nan) surface=320x240 origin=0 +2026-10-21 20:53:15.517 osc-tests[10458:5463835] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1 +2026-10-21 20:53:15.517 osc-tests[10458:5463835] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1 +OSC adapter: 98 checks, 0 failures diff --git a/docs/verification/v1.0.6/slim-chin-real-video-asan.txt b/docs/verification/v1.0.6/slim-chin-real-video-asan.txt new file mode 100644 index 0000000..900c6e4 --- /dev/null +++ b/docs/verification/v1.0.6/slim-chin-real-video-asan.txt @@ -0,0 +1,2 @@ +2026-10-21 20:50:27.412 slim-chin-asan[10123:5460221] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2 +PASS: 494 slim alignment checks; maximum UV oracle error 1.09828022e-05 diff --git a/docs/验证记录.md b/docs/验证记录.md index 9278469..d872637 100644 --- a/docs/验证记录.md +++ b/docs/验证记录.md @@ -61,3 +61,11 @@ Motion:独立普通视频项目,源PTS0、1920×1080/25fps/10秒,媒体通 额外用用户视频11帧(含4秒及18秒明显侧脸)运行264项瘦脸ASan检查,通过且未发现内存错误;此数包含重复的220项基础数值/数据检查,不与604简单相加。独立恢复从远程abe97ed0cbd5a2b5ffda6ebdb486d3bff9170964克隆,69文件/9资源和模式一致、strict fsck通过,clone内389项Metal/人脸/瘦脸测试通过。签名构建源码就是该节点;后续交付脚本补充了已公证产物校验恢复与重复注销兼容,产品源码未再变化。 正式安装APP仅位于 `/Library/Plug-Ins/FxPlug/beatygril.app`;配套1.0.5模板及占位资源已同步并逐字节核验。临时构建、旧版APP备份、公证ZIP已清理;项目、DerivedData、桌面、下载、Applications及系统/用户FxPlug目录扫描只发现该正式APP,无扫描错误。原生效果验收状态为用户自测待完成。票据、发现、恢复与检测报告见 `docs/verification/v1.0.5/`。 + +## 1.0.6 下巴与图像轴修复(构建前) + +用户反馈“下巴调整作用到眼睛”。纯CI76点物理位置并未全局反置,但FxPlug适配器曾将TOP_LEFT当作物理行序,在输入和输出各多翻转一次;默认直通会抵消,无法验证中间Vision和变形的解剖方向。独立top-first照片构造复现下巴跑向眼部;原版REA输入及两条CI→IOSurface输出路径均没有同样额外翻转,现删除这两处。未捕获本次实际FCP缓冲,原生视觉由用户自测。 + +下巴另有旧框高斯算法和正负符号错误,现按原版68→38、67→37、66→36三pin、正0.04/负0.02和共同尺寸增益对齐。数学场、真实图物理下巴/瞳孔、正负符号与侧脸热点均已检查;其余七类控制及全部组合顺序未宣称完整恢复。新分析记录写入显式坐标标记;旧未标记记录保留但不再重放,自动回退实时跟随,重新分析可恢复离线记录。 + +本轮不操作、启动或退出Motion/FCP。完整分析证据见[下巴与坐标分析](analysis/下巴与坐标分析.md)。完整904项通过(美化49、人脸116、瘦脸/下巴394、宿主适配247、OSC98),宿主适配和OSC启用ASan。宿主适配16种默认/大眼/下巴正负×源/目的原点组合彼此逐字节一致,与独立upright文件参考最大差2/255;独立文件解码和IOSurface检测路径存在微小数值差,阈值另限制均差<0.005/255,并检查实际解剖热点。额外用户视频11帧494项ASan通过,含重复基础用例,不与904简单相加。用户帧和完整点位未上传远程。当前正式APP仍为1.0.5,不能将构建前验证描述为1.0.6已安装。 diff --git a/tests/host_adapter_tests.m b/tests/host_adapter_tests.m index 8091c15..f996613 100644 --- a/tests/host_adapter_tests.m +++ b/tests/host_adapter_tests.m @@ -7,6 +7,9 @@ #import #import "beatygrilPlugIn.h" #import "PGParameterIDs.h" +#import "PGFaceProcessor.h" +#import "PGBeautyRenderer.h" +#include // This adapter simulates host callbacks, but uses real IOSurface buffers and the // production FxPlug entry points. It does not simulate FCP plugin discovery/UI. @@ -173,6 +176,12 @@ static NSUInteger MaximumDifference(NSData *a, NSData *b) { for (NSUInteger i = 0; i < a.length; i++) maximum = MAX(maximum, (NSUInteger)abs(x[i] - y[i])); return maximum; } +static double MeanDifference(NSData *a, NSData *b) { + if (!a.length || a.length != b.length) return INFINITY; + const uint8_t *x = a.bytes, *y = b.bytes; double total = 0; + for (NSUInteger i = 0; i < a.length; i++) total += abs(x[i]-y[i]); + return total/a.length; +} static NSData *ExpectedCrop(PGHostTile *source, NSUInteger x, NSUInteger y, NSUInteger width, NSUInteger height, BOOL flip) { NSData *sourceBytes = SurfaceBytes(source); size_t sourceWidth = IOSurfaceGetWidth((__bridge IOSurfaceRef)source.storage); NSMutableData *result = [NSMutableData dataWithLength:width * height * 4]; @@ -200,6 +209,204 @@ static void RejectState(beatygrilPlugIn *plugin, PGHostTile *destination, PGHost Check(!rendered && !escaped && error != nil, description); } static NSData *PlistState(id value) { return [NSPropertyListSerialization dataWithPropertyList:value format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil]; } +// Decode independently of CI/IOSurface, so a pair of adapter flips cannot +// silently cancel in our test input and expected output. ImageIO + Quartz gives +// the NASA fixture top-first BGRA bytes, also cross-checked against Pillow. +static NSData *DecodedPortrait(NSString *path, size_t *width, size_t *height) { + CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:path], NULL); + CGImageRef image = source ? CGImageSourceCreateImageAtIndex(source, 0, NULL) : NULL; + if (source) CFRelease(source); + if (!image) return nil; + *width = CGImageGetWidth(image); *height = CGImageGetHeight(image); + NSMutableData *bytes = [NSMutableData dataWithLength:*width * *height * 4]; + CGColorSpaceRef space = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); + CGContextRef context = CGBitmapContextCreate(bytes.mutableBytes, *width, *height, 8, *width * 4, space, + kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); + if (context) { + CGContextSetBlendMode(context, kCGBlendModeCopy); + CGContextSetInterpolationQuality(context, kCGInterpolationNone); + CGContextDrawImage(context, CGRectMake(0, 0, *width, *height), image); + CGContextRelease(context); + } + CGColorSpaceRelease(space); CGImageRelease(image); + return context ? bytes : nil; +} +static BOOL StoreSurfaceBytes(PGHostTile *tile, NSData *bytes) { + IOSurfaceRef surface = (__bridge IOSurfaceRef)tile.storage; + size_t width = IOSurfaceGetWidth(surface), height = IOSurfaceGetHeight(surface); + if (bytes.length != width * height * 4) return NO; + IOSurfaceLock(surface, 0, NULL); + for (size_t row = 0; row < height; row++) + memcpy((uint8_t *)IOSurfaceGetBaseAddress(surface) + row * IOSurfaceGetBytesPerRow(surface), + (const uint8_t *)bytes.bytes + row * width * 4, width * 4); + IOSurfaceUnlock(surface, 0, NULL); + return YES; +} +static CIContext *NumericContext(void) { + return [CIContext contextWithMTLDevice:MTLCreateSystemDefaultDevice() options:@{ + kCIContextWorkingColorSpace:NSNull.null, kCIContextOutputColorSpace:NSNull.null}]; +} +static NSData *ImageBytes(CIContext *context, CIImage *image) { + if (!image) return nil; + size_t width = (size_t)image.extent.size.width, height = (size_t)image.extent.size.height; + NSMutableData *bytes = [NSMutableData dataWithLength:width * height * 4]; + [context render:image toBitmap:bytes.mutableBytes rowBytes:width * 4 bounds:image.extent format:kCIFormatBGRA8 colorSpace:nil]; + return bytes; +} +static CIImage *ProcessedReference(CIImage *image, PGBeautySettings settings, CMTime time, NSData *track) { + PGFaceProcessor *faces = [PGFaceProcessor new]; + if (track) [faces setTrackingData:track forTarget:settings.targetIndex]; + NSError *error = nil; + PGFaceFrame *frame = [faces processImage:image settings:settings time:time error:&error]; + if (!frame) return nil; + return [[PGBeautyRenderer new] processImage:frame.image settings:settings skinMask:frame.skinMask + colorMask:frame.colorMask teethMask:frame.teethMask eyeMask:frame.eyeMask error:&error]; +} +static CGPoint LandmarkCenter(VNFaceLandmarkRegion2D *region, CGRect box, CGSize size) { + CGPoint center = CGPointZero; + if (!region.pointCount || !region.normalizedPoints) return center; + for (NSUInteger i = 0; i < region.pointCount; i++) { + center.x += region.normalizedPoints[i].x; center.y += region.normalizedPoints[i].y; + } + center.x /= region.pointCount; center.y /= region.pointCount; + return CGPointMake((box.origin.x + center.x * box.size.width) * size.width, + (1 - box.origin.y - center.y * box.size.height) * size.height); +} +static double ChangeMass(NSData *baseline, NSData *changed, size_t width, CGRect region) { + if (baseline.length != changed.length || !width) return INFINITY; + const uint8_t *a = baseline.bytes, *b = changed.bytes; + size_t height = baseline.length / (width * 4); double total = 0; + for (size_t row = 0; row < height; row++) for (size_t x = 0; x < width; x++) + if (CGRectContainsPoint(region, CGPointMake(x + .5, row + .5))) { + size_t i = (row * width + x) * 4; + for (size_t c = 0; c < 3; c++) total += abs(a[i+c] - b[i+c]); + } + return total; +} +static void PortraitAnatomyTests(NSString *fixture, CIImage *portrait) { + size_t width = 0, height = 0; + NSData *canonical = DecodedPortrait(fixture, &width, &height); + Check(canonical != nil && width == 512 && height == 512, @"independent ImageIO/Quartz decodes the 512px NASA fixture"); + if (!canonical || width != 512 || height != 512 || !portrait) return; + // Asymmetric samples pin the decoder's physical row/column order. These + // values match Pillow's RGB decode exactly, independently of Core Image. + const size_t positions[][2] = {{16,16},{100,250},{205,100},{222,178},{480,450}}; + const uint8_t samples[][4] = {{35,6,14,255},{93,132,234,255},{11,35,58,255},{42,73,102,255},{2,1,3,255}}; + BOOL samplesMatch = YES; + for (size_t i = 0; i < 5; i++) + samplesMatch &= memcmp((const uint8_t *)canonical.bytes + (positions[i][1]*width + positions[i][0])*4, samples[i], 4) == 0; + Check(samplesMatch, @"independent asymmetric pixels establish top-first BGRA and the horizontal direction"); + CIContext *context = NumericContext(); + Check(MaximumDifference(canonical, ImageBytes(context, portrait)) <= 1, @"upright CI file decode agrees with independent physical source bytes"); + PGFaceFrame *detected = [[PGFaceProcessor new] processImage:portrait settings:PGBeautyDefaults() time:kCMTimeZero error:nil]; + VNFaceObservation *face = detected.faces.firstObject; + Check(face.landmarks.allPoints.pointCount == 76, @"real portrait provides the 76-point anatomy used by chin pins"); + if (face.landmarks.allPoints.pointCount != 76) return; + CGSize size = CGSizeMake(width, height); CGRect box = face.boundingBox; + CGPoint left = LandmarkCenter(face.landmarks.leftEye, box, size), right = LandmarkCenter(face.landmarks.rightEye, box, size); + CGPoint chin = face.landmarks.allPoints.normalizedPoints[67]; + chin = CGPointMake((box.origin.x + chin.x * box.size.width)*width, (1-box.origin.y-chin.y*box.size.height)*height); + CGFloat fw = box.size.width*width, fh = box.size.height*height; + CGRect leftEye = CGRectMake(left.x-fw*.24, left.y-fh*.17, fw*.48, fh*.34); + CGRect rightEye = CGRectMake(right.x-fw*.24, right.y-fh*.17, fw*.48, fh*.34); + CGRect chinArea = CGRectMake(chin.x-fw*.30, chin.y-fh*.22, fw*.60, fh*.44); + CGRect upsideDownFace = CGRectMake(box.origin.x*width, box.origin.y*height, fw, fh); + const UInt32 controls[] = {0, PGBigEye, PGChin, PGChin}; + const double values[] = {0, 1, 1, -1}; + NSArray *names = @[@"default", @"big-eye", @"chin-positive", @"chin-negative"]; + for (NSUInteger effect = 0; effect < 4; effect++) { + PGBeautySettings settings = PGBeautyDefaults(); + if (effect == 1) settings.faceBigEye = 1; + else if (effect > 1) settings.faceChin = values[effect]; + NSData *expected = ImageBytes(context, ProcessedReference(portrait, settings, kCMTimeZero, nil)); + Check(expected.length == canonical.length, [names[effect] stringByAppendingString:@" independent upright face/beauty chain renders"]); + if (expected.length != canonical.length) continue; + NSData *originBaseline = nil; + for (NSUInteger sourceTop = 0; sourceTop < 2; sourceTop++) for (NSUInteger destinationTop = 0; destinationTop < 2; destinationTop++) { + @autoreleasepool { + PGHostAPI *api = [PGHostAPI new]; beatygrilPlugIn *plugin = [[beatygrilPlugIn alloc] initWithAPIManager:api]; + Check([plugin addParametersWithError:nil], @"anatomy case creates the real plugin parameters"); + if (effect) api.values[@(controls[effect])] = @(values[effect]); + PGHostTile *input = Tile(width, height, 37, -21, sourceTop ? kFxImageOrigin_TOP_LEFT : kFxImageOrigin_BOTTOM_LEFT); + PGHostTile *output = Tile(width, height, 37, -21, destinationTop ? kFxImageOrigin_TOP_LEFT : kFxImageOrigin_BOTTOM_LEFT); + // imageOrigin changes coordinate semantics, never these bytes. + Check(StoreSurfaceBytes(input, canonical), @"all origin combinations receive identical independently decoded physical rows"); + Check(Render(plugin, output, @[input], Snapshot(plugin, kCMTimeZero), kCMTimeZero, nil, NULL), @"active anatomy case renders with nonzero tile origin"); + NSData *actual = SurfaceBytes(output); NSUInteger difference = MaximumDifference(actual, expected); + NSString *label = [NSString stringWithFormat:@"%@ source%@/destination%@", names[effect], sourceTop?@"TOP":@"BOTTOM", destinationTop?@"TOP":@"BOTTOM"]; + // Vision's file-image vs IOSurface path and translated float + // coordinates can round by a few byte levels at high contrast. + // Bound that error tightly; changing only origin tags must be + // exactly invariant, independently of this reference tolerance. + Check(difference <= 4 && MeanDifference(actual,expected) < .005, [label stringByAppendingString:@" matches independent upright CI output"]); + if (!originBaseline) originBaseline = actual; + Check(MaximumDifference(actual,originBaseline) == 0, [label stringByAppendingString:@" is byte-identical across coordinate tags"]); + double lm = ChangeMass(canonical, actual, width, leftEye), rm = ChangeMass(canonical, actual, width, rightEye); + double cm = ChangeMass(canonical, actual, width, chinArea), um = ChangeMass(canonical, actual, width, upsideDownFace); + BOOL located = effect == 0 ? MaximumDifference(canonical, actual) <= 1 : + (effect == 1 ? lm > 100 && rm > 100 && cm < (lm+rm)*.01 && um == 0 : + cm > 100 && cm > 4*(lm+rm) && um == 0); + Check(located, [label stringByAppendingString:effect == 1 ? @" changes the two real eye regions" : (effect ? @" changes the real chin rather than eyes or mirrored anatomy" : @" preserves the independently decoded photo")]); + printf("Anatomy %-13s %lu/%lu max=%lu mean=%.7f eye=%.0f/%.0f chin=%.0f inverted=%.0f\n", names[effect].UTF8String, + (unsigned long)sourceTop, (unsigned long)destinationTop, (unsigned long)difference, MeanDifference(actual,expected), lm, rm, cm, um); + } + } + } +} +static void TrackingCoordinateTests(NSDictionary *archive, NSDictionary *hostValues, PGHostTile *source, CIImage *portrait, CMTime time) { + Check([archive[@"hostCoordinateSpace"] isEqual:@"iosurface-ci-y-up-v1"], @"new host analysis stamps its explicit IOSurface/CI coordinate contract"); + NSMutableDictionary *forged = [NSPropertyListSerialization propertyListWithData:PlistState(archive) + options:NSPropertyListMutableContainers format:nil error:nil]; + if (![forged[@"frames"] isKindOfClass:NSDictionary.class]) { Check(NO, @"analysis archive supplies frames for compatibility regression"); return; } + // Retain fully valid topology but move the saved face away from the actual + // portrait. A falsely replayed legacy archive must produce a visible error. + for (NSMutableDictionary *frame in [forged[@"frames"] allValues]) for (NSMutableDictionary *face in frame[@"faces"]) { + NSMutableArray *box = [face[@"box"] mutableCopy]; box[0] = @([box[0] doubleValue]+.2); box[1] = @([box[1] doubleValue]-.25); face[@"box"] = box; + for (NSString *name in @[@"leftEye",@"rightEye",@"leftBrow",@"rightBrow",@"nose",@"lips",@"mouth",@"contour",@"points76"]) { + if (!face[name]) continue; + NSMutableArray *points = [NSMutableArray new]; + for (NSArray *point in face[name]) [points addObject:@[@([point[0] doubleValue]+.2),@([point[1] doubleValue]-.25)]]; + face[name] = points; + } + } + [forged removeObjectForKey:@"hostCoordinateSpace"]; + NSString *legacyString = [PlistState(forged) base64EncodedStringWithOptions:0]; + NSMutableDictionary *values = [hostValues mutableCopy]; + values[@(PGTarget)] = @2; values[@(PGTrackEnabled)] = @YES; values[@(PGBigEye)] = @1; values[@(PGChin)] = @1; + values[@(PGTrackData3)] = legacyString; + PGHostAPI *legacyAPI = [PGHostAPI new]; legacyAPI.hostTime = time; + beatygrilPlugIn *legacy = [[beatygrilPlugIn alloc] initWithAPIManager:legacyAPI]; [legacy addParametersWithError:nil]; legacyAPI.values = [values mutableCopy]; + PGHostTile *output = Tile(512,512,0,0,kFxImageOrigin_TOP_LEFT); + Check(Render(legacy, output, @[source], Snapshot(legacy,time), time, nil, NULL), @"unmarked old coordinate archive renders through the real adapter"); + NSData *legacyBytes = SurfaceBytes(output); + PGBeautySettings realtime = [legacy settingsAtTime:time]; realtime.trackingEnabled = 0; + CIContext *context = NumericContext(); + NSData *expectedLive = ImageBytes(context, ProcessedReference(portrait,realtime,time,nil)); + printf("Legacy fallback upright comparison: max=%lu mean=%.7f\n",(unsigned long)MaximumDifference(legacyBytes,expectedLive),MeanDifference(legacyBytes,expectedLive)); + Check(expectedLive.length && MaximumDifference(legacyBytes,expectedLive) <= 4 && MeanDifference(legacyBytes,expectedLive) < .005, @"unmarked forged face geometry falls back to realtime upright detection"); + Check([legacyAPI.values[@(PGTrackData3)] isEqualToString:legacyString] && [legacyAPI.values[@(PGTrackEnabled)] boolValue], @"legacy fallback preserves the user's original archive string and enabled parameter"); + + forged[@"hostCoordinateSpace"] = @"iosurface-ci-y-up-v1"; + NSData *trustedTrack = PlistState(forged); + PGHostAPI *trustedAPI = [PGHostAPI new]; trustedAPI.hostTime = time; + beatygrilPlugIn *trusted = [[beatygrilPlugIn alloc] initWithAPIManager:trustedAPI]; [trusted addParametersWithError:nil]; + trustedAPI.values = [values mutableCopy]; trustedAPI.values[@(PGTrackData3)] = [trustedTrack base64EncodedStringWithOptions:0]; + Check(Render(trusted, output, @[source], Snapshot(trusted,time), time, nil, NULL), @"fresh plugin restores a marked coordinate archive"); + NSData *trustedBytes = SurfaceBytes(output); + PGBeautySettings tracked = [trusted settingsAtTime:time]; + NSData *expectedSaved = ImageBytes(context, ProcessedReference(portrait,tracked,time,trustedTrack)); + Check(expectedSaved.length && MaximumDifference(trustedBytes,expectedSaved) <= 1, @"marked saved geometry matches independent exact-time archive replay"); + Check(MaximumDifference(trustedBytes,expectedLive) > 5, @"forged marked geometry is observably different, making the legacy non-replay assertion meaningful"); + + // Reanalysis of an unmarked target starts a fresh compatible archive. + [legacy analyzeForward]; + CMTime next = CMTimeAdd(time,CMTimeMake(10,24)); + [legacy setupAnalysisForTimeRange:CMTimeRangeMake(time,CMTimeMake(240,24)) frameDuration:CMTimeMake(1,24) error:nil]; + BOOL analyzed = [legacy analyzeFrame:source atTime:next error:nil] && [legacy cleanupAnalysis:nil]; + NSData *resaved = [[NSData alloc] initWithBase64EncodedString:legacyAPI.values[@(PGTrackData3)] options:0]; + NSDictionary *fresh = resaved ? [NSPropertyListSerialization propertyListWithData:resaved options:0 format:nil error:nil] : nil; + Check(analyzed && [fresh[@"frames"] count] == 1 && [fresh[@"hostCoordinateSpace"] isEqual:@"iosurface-ci-y-up-v1"], @"reanalysis replaces incompatible geometry with one newly marked frame"); +} static void WritePortrait(PGHostTile *tile, CIImage *image) { CIContext *context = [CIContext contextWithOptions:@{kCIContextWorkingColorSpace:NSNull.null, kCIContextOutputColorSpace:NSNull.null}]; [context render:image toIOSurface:(__bridge IOSurfaceRef)tile.storage bounds:image.extent colorSpace:nil]; @@ -283,7 +490,7 @@ int main(int argc, const char *argv[]) { Check(MaximumDifference(SurfaceBytes(input), SurfaceBytes(output)) <= 1, top ? @"top-left tile preserves sample rows at nonzero origin" : @"bottom-left tile preserves sample rows at nonzero origin"); output.origin = top ? kFxImageOrigin_BOTTOM_LEFT : kFxImageOrigin_TOP_LEFT; Check(Render(plugin, output, @[input], state, kCMTimeZero, &error, NULL), @"opposite-origin tile renders"); - Check(MaximumDifference(ExpectedCrop(input, 0, 0, 48, 32, YES), SurfaceBytes(output)) <= 1, @"opposite image origins flip rows exactly once"); + Check(MaximumDifference(SurfaceBytes(input), SurfaceBytes(output)) <= 1, @"opposite coordinate tags preserve the same physical IOSurface rows"); } PGHostTile *full = Tile(48, 32, 37, -21, kFxImageOrigin_BOTTOM_LEFT), *crop = Tile(16, 12, 43, -17, kFxImageOrigin_BOTTOM_LEFT); Fill(full); Check(Render(plugin, crop, @[full], state, kCMTimeZero, &error, NULL), @"destination sub-tile renders from full input buffer"); @@ -298,11 +505,12 @@ int main(int argc, const char *argv[]) { Check(cropDifference <= 1, @"destination sub-tile translates global pixel bounds correctly"); full.origin = kFxImageOrigin_TOP_LEFT; crop.origin = kFxImageOrigin_TOP_LEFT; Check(Render(plugin, crop, @[full], state, kCMTimeZero, &error, NULL), @"top-left destination sub-tile renders"); - Check(MaximumDifference(ExpectedCrop(full, 6, 4, 16, 12, NO), SurfaceBytes(crop)) <= 1, @"top-left sub-tile selects correct physical source rows"); + Check(MaximumDifference(ExpectedCrop(full, 6, 16, 16, 12, NO), SurfaceBytes(crop)) <= 1, @"top-left coordinate tag does not reverse the sub-tile's physical source rows"); NSString *fixture = argc > 1 ? @(argv[1]) : @"tests/fixtures/astronaut.png"; CIImage *portrait = [CIImage imageWithContentsOfURL:[NSURL fileURLWithPath:fixture] options:@{kCIImageColorSpace:NSNull.null}]; Check(portrait != nil, @"NASA portrait opens for full adapter test"); + PortraitAnatomyTests(fixture, portrait); PGHostTile *portraitSource = Tile(512, 512, 0, 0, kFxImageOrigin_BOTTOM_LEFT), *portraitOutput = Tile(512, 512, 0, 0, kFxImageOrigin_BOTTOM_LEFT); WritePortrait(portraitSource, portrait); api.values[@(PGThin)] = @0.8; api.values[@(PGBigEye)] = @0.6; api.values[@(PGMidtone)] = @0.8; api.values[@(PGBrightness)] = @0.25; api.values[@(PGMix)] = @0; @@ -339,6 +547,7 @@ int main(int argc, const char *argv[]) { NSData *tracking = [[NSData alloc] initWithBase64EncodedString:target options:0]; NSDictionary *trackingArchive = tracking ? [NSPropertyListSerialization propertyListWithData:tracking options:0 format:nil error:nil] : nil; Check([trackingArchive[@"frames"] count] == 2, @"old render snapshot does not erase either newly analyzed frame"); + TrackingCoordinateTests(trackingArchive,api.values,portraitSource,portrait,api.hostTime); Check([api.values[@(PGTrackEnabled)] boolValue] && CMTimeCompare(api.lastSetBoolTime, api.hostTime) == 0, @"analysis enables saved target at host seed time"); NSData *trackedState = Snapshot(plugin, api.hostTime); beatygrilPlugIn *restoredPlugin = [[beatygrilPlugIn alloc] initWithAPIManager:api];