```\nfunction predictDeterministicAddress(\n  address implementation,\n  bytes32 salt,\n  address deployer\n) internal pure returns (address predicted) {\n  assembly {\n    let ptr := mload(0x40)\n    mstore(\n      ptr,\n      0x3d605d80600a3d3981f336603057343d52307f00000000000000000000000000\n    )\n    mstore(\n      add(ptr, 0x13),\n      0x830d2d700a97af574b186c80d40429385d24241565b08a7c559ba283a964d9b1\n    )\n    mstore(\n      add(ptr, 0x33),\n      0x60203da23d3df35b3d3d3d3d363d3d37363d7300000000000000000000000000\n    )\n    mstore(add(ptr, 0x46), shl(0x60, implementation))\n    mstore(\n      add(ptr, 0x5a),\n      0x5af43d3d93803e605b57fd5bf3ff000000000000000000000000000000000000\n    )\n    mstore(add(ptr, 0x68), shl(0x60, deployer))\n    mstore(add(ptr, 0x7c), salt)\n    mstore(add(ptr, 0x9c), keccak256(ptr, 0x67))\n    predicted := keccak256(add(ptr, 0x67), 0x55)\n  }\n}\n```\n