<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Technical Specification Support
How imports work
Imports can be used in different ways depending on the use case and support levels.
People who want to support the latest version of STIX 2 without having to make changes, can implicitly use the latest version
Step1:  or,
Step2:  People who want to use an explicit version
Step3:  or,
Step4:  or even, (less preferred)
Step5:  The last option makes it easy to update to a new version in one place per file, once you've made the deliberate action to do this.
People who want to use multiple versions in a single file
Step6:  or,
Step7:  or (less preferred)
Step9:  How parsing works
If the version positional argument is not provided the library will make the best attempt using the "spec_version" property found on a Bundle, SDOs, SCOs, or SROs.
You can lock your parse() method to a specific STIX version by
Step10:  In the example above if a 2.1 or higher object is parsed, the operation will fail.
How custom content works
CustomObject, CustomObservable, CustomMarking and CustomExtension must be registered explicitly by STIX version. This is a design decision since properties or requirements may change as the STIX Technical Specification advances.
You can perform this by
<ASSISTANT_TASK:>
Python Code:
import stix2
stix2.Indicator()
Explanation: Technical Specification Support
How imports work
Imports can be used in different ways depending on the use case and support levels.
People who want to support the latest version of STIX 2 without having to make changes, can implicitly use the latest version:<div class="alert alert-warning">
Warning
The implicit import method can cause the code to break between major releases to support a newer approved committee specification. Therefore, not recommended for large scale applications relying on specific object support.
</div>
End of explanation
from stix2 import Indicator
Indicator()
Explanation: or,
End of explanation
import stix2.v20
stix2.v20.Indicator()
Explanation: People who want to use an explicit version:
End of explanation
from stix2.v20 import Indicator
Indicator()
Explanation: or,
End of explanation
import stix2.v20 as stix2
stix2.Indicator()
Explanation: or even, (less preferred)
End of explanation
import stix2
stix2.v20.Indicator()
stix2.v21.Indicator()
Explanation: The last option makes it easy to update to a new version in one place per file, once you've made the deliberate action to do this.
People who want to use multiple versions in a single file:
End of explanation
from stix2 import v20, v21
v20.Indicator()
v21.Indicator()
Explanation: or,
End of explanation
from stix2.v20 import Indicator as Indicator_v20
from stix2.v21 import Indicator as Indicator_v21
Indicator_v20()
Indicator_v21()
Explanation: or (less preferred):
End of explanation
from stix2 import parse
indicator = parse({
    "type": "indicator",
    "id": "indicator--dbcbd659-c927-4f9a-994f-0a2632274394",
    "created": "2017-09-26T23:33:39.829Z",
    "modified": "2017-09-26T23:33:39.829Z",
    "labels": [
        "malicious-activity"
    ],
    "name": "File hash for malware variant",
    "pattern": "[file:hashes.md5 = 'd41d8cd98f00b204e9800998ecf8427e']",
    "valid_from": "2017-09-26T23:33:39.829952Z"
}, version="2.0")
print(indicator.serialize(pretty=True))
Explanation: How parsing works
If the version positional argument is not provided the library will make the best attempt using the "spec_version" property found on a Bundle, SDOs, SCOs, or SROs.
You can lock your parse() method to a specific STIX version by:
End of explanation
import stix2
# Make my custom observable available in STIX 2.0
@stix2.v20.CustomObservable('x-new-object-type',
                            [("prop", stix2.properties.BooleanProperty())])
class NewObject2(object):
    pass
# Make my custom observable available in STIX 2.1
@stix2.v21.CustomObservable('x-new-object-type',
                            [("prop", stix2.properties.BooleanProperty())])
class NewObject2(object):
    pass
Explanation: In the example above if a 2.1 or higher object is parsed, the operation will fail.
How custom content works
CustomObject, CustomObservable, CustomMarking and CustomExtension must be registered explicitly by STIX version. This is a design decision since properties or requirements may change as the STIX Technical Specification advances.
You can perform this by:
End of explanation
<END_TASK>