Search for Software Component Candidates

This is an overview.

Candidate Search Request

The expected JSON document POST ed to the RESTful service must contain the following fields:

  • input denotes the query input (keyword Keyword Search, interface signatures Interface Signature Search, test specification Test Specification Search (JUnit 4))

  • testDrivenSearch may be set either to true or false to turn Test-Driven Search evaluation on or off. Note that test-driven search evaluation is only available if the input parameter contains a valid test specification (currently only JUnit 4 is supported).

  • notificationEmailAddress may be set to receive a mail notification about test-driven search results (when ready)

  • queryParams is a sub-document that contains further fields about pagination, filter options, ranking options etc.

    • Pagination: use start (starts at 0) and rows to fetch slices

    • Filtering: use filters to define filters that further constrain the returned result set of candidates

    • Ranking: use rankingStrategy to set a concrete strategy for ranking and rankingCriteria to set an array containing a criterion for each entry that consists of name (i.e., metric name), objective (0 for min, 1 for max) and weight (double precision, exact value depending on user preference as well as selected ranking strategy) as well as the priority fields

    • content may be set to true or false to toggle the inclusion of source code in the returned result set of candidates

    • artifactInformation set to true to enable extended information about the artifacts that provide the component candidates

    • performanceEvaluation set to true to enable performance evaluation (currently Java Microbenchmarking Harness jmh is used in the backend). Please note that his slows drown TDS evaluation drastically.

    • constraints set to an array of textual constraints (Lucene-syntax, i.e., term clauses)

Filters

Available candidate result pre-filters before TDS evaluation (corresponding field to set is the array queryParams.filters, see [candidate-request-doc]):

  • hashcodeclone denotes a basic code clone filtering based on equal source code hashes of the entry class, the compilation unit found of a candidate’s functionality. Simply, the first of the code clones found is returned by the service, the others are ignored.

  • noabstractclass denotes that no candidates with abstract entry classes should be included in the returned result set

  • nointerface denotes that no candidates with interface entry classes should be included in the returned result set

  • latestversion denotes that only the latest version of each component candidate should be included in the returned result set (ignoring all older versions). This filter is Maven specific and relies on the version classifier assigned to Maven artifacts.

Filter passed TDS result candidates (post-filters):

  • functionalsufficiency denotes that passed candidates are filtered by their Functional Sufficiency (FS), in this case all candidates having a FS < 1 (i.e., functionally-sufficient) are filtered out.

Ranking Strategy

Available candidate ranking strategies (corresponding fields to set are queryParams.rankingStrategy as well as the array queryParams.rankingCriteria, see [candidate-request-doc]):

  • HDS_SMOOP denotes the hybrid, non-dominated sorting ranking strategy based on the concept of Dominance and user priorities (the field priority in each criterion in rankingCriteria must be set).

  • WEIGHTEDSUM_SMOOP denotes the weighted-sum ranking strategy (the field weight in each criterion in rankingCriteria must be set).

  • WEIGHTEDEUCLIDEAN_SMOOP denotes the weighted-metric ranking strategy using Euclidean Distance (the field weight in each criterion in rankingCriteria must be set).

  • SINGLE_SMOOP denotes the single-objective ranking based on the first criterion defined in rankingCriteria

Generally, the name field of each criterion denotes the metric name whereas the objective field denotes the objective (either 1 = max or 0 = min).

Note that most ranking criteria is only applicable after test-driven search runs.

Example Request Document

POST /v1/candidates/search HTTP/1.1
Content-Type: application/json;charset=UTF-8
Accept: application/json;charset=UTF-8
Host: localhost
Content-Length: 580

{
  "input" : "Base64",
  "testDrivenSearch" : false,
  "queryParams" : {
    "start" : 0,
    "rows" : 5,
    "content" : false,
    "artifactInformation" : false,
    "performanceEvaluation" : false,
    "rankingPerformanceMeasurement" : false,
    "filters" : [ "hashcodeclone", "noabstractclass", "nointerface", "latestversion" ],
    "rankingStrategy" : "SINGLE_SMOOP",
    "rankingCriteria" : [ {
      "name" : "luceneScore",
      "objective" : true,
      "weight" : 0.0,
      "priority" : 0.0
    } ],
    "constraints" : null
  },
  "notificationEmailAddress" : null
}

Candidate Search Response

Example Response Document
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 4645

{
  "methods" : null,
  "testSubjectName" : null,
  "testClassName" : null,
  "testClassSource" : null,
  "constraints" : null,
  "testable" : false,
  "candidates" : {
    "candidates" : [ {
      "id" : "ea44f2e0-6173-4dd7-9622-e654e185a56a",
      "groupId" : "com.paypal.sdk",
      "artifactId" : "rest-api-sdk",
      "version" : "1.3.0",
      "name" : "Base64",
      "packagename" : "com.paypal.base.codec.binary",
      "score" : 6.2676773,
      "hash" : "90988444a193ab5b66bc250b1e368c24",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 6.267677307128906
      },
      "ranking" : {
        "SINGLE_SMOOP" : 1.0,
        "SINGLE_SMOOP_po" : 1.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.paypal.base.codec.binary.Base64",
      "uri" : "com.paypal.sdk:rest-api-sdk:1.3.0"
    }, {
      "id" : "af9f43b3-8669-4bf9-8ba4-1f71efe2f755",
      "groupId" : "net.java.dev.ajax4jsf",
      "artifactId" : "ajax4jsf",
      "version" : "1.0.6",
      "name" : "Base64",
      "packagename" : "org.ajax4jsf.framework.util.base64",
      "score" : 6.249564,
      "hash" : "2785c533738229066becc89214a46417",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 6.249564170837402
      },
      "ranking" : {
        "SINGLE_SMOOP" : 2.0,
        "SINGLE_SMOOP_po" : 2.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.ajax4jsf.framework.util.base64.Base64",
      "uri" : "net.java.dev.ajax4jsf:ajax4jsf:1.0.6"
    }, {
      "id" : "046815e2-1291-4a58-9d2c-953a3ef14fe8",
      "groupId" : "org.bitbucket.b_c",
      "artifactId" : "jose4j",
      "version" : "0.4.4",
      "name" : "Base64",
      "packagename" : "org.jose4j.base64url.internal.apache.commons.codec.binary",
      "score" : 5.9445486,
      "hash" : "7a20d45855f942c7b751b8a7c5b2435a",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 5.944548606872559
      },
      "ranking" : {
        "SINGLE_SMOOP" : 3.0,
        "SINGLE_SMOOP_po" : 3.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.jose4j.base64url.internal.apache.commons.codec.binary.Base64",
      "uri" : "org.bitbucket.b_c:jose4j:0.4.4"
    }, {
      "id" : "ac17b1f3-cd86-4d5a-b937-4e571fde5a69",
      "groupId" : "biz.aQute",
      "artifactId" : "bnd",
      "version" : "1.50.0",
      "name" : "Base64",
      "packagename" : "aQute.lib.base64",
      "score" : 4.798713,
      "hash" : "fc69b5e56678996542a6035ed3e03263",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 4.798713207244873
      },
      "ranking" : {
        "SINGLE_SMOOP" : 4.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "aQute.lib.base64.Base64",
      "uri" : "biz.aQute:bnd:1.50.0"
    }, {
      "id" : "fc59bdde-992c-4774-b1dd-6ca21375f758",
      "groupId" : "biz.aQute.bnd",
      "artifactId" : "bndlib",
      "version" : "2.4.0",
      "name" : "Base64",
      "packagename" : "aQute.lib.base64",
      "score" : 4.796496,
      "hash" : "3117c167085d33cd6702941294260cb0",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 4.7964959144592285
      },
      "ranking" : {
        "SINGLE_SMOOP" : 5.0,
        "SINGLE_SMOOP_po" : 5.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "aQute.lib.base64.Base64",
      "uri" : "biz.aQute.bnd:bndlib:2.4.0"
    } ],
    "start" : 0,
    "rows" : 5,
    "total" : 113506
  },
  "jobId" : null,
  "jobStartDate" : null,
  "jobEndDate" : null,
  "jobStatusType" : null,
  "rankingPerformance" : null,
  "criteriaStats" : null
}

Use the following for a keyword-based candidate search.

A POST request using a JSON document as method body will return component candidates found. The input parameter (here set to Base64) denotes the keyword to search for. See Candidate Search Request for further request options.

Request structure
POST /v1/candidates/search HTTP/1.1
Content-Type: application/json;charset=UTF-8
Accept: application/json;charset=UTF-8
Host: localhost
Content-Length: 580

{
  "input" : "Base64",
  "testDrivenSearch" : false,
  "queryParams" : {
    "start" : 0,
    "rows" : 5,
    "content" : false,
    "artifactInformation" : false,
    "performanceEvaluation" : false,
    "rankingPerformanceMeasurement" : false,
    "filters" : [ "hashcodeclone", "noabstractclass", "nointerface", "latestversion" ],
    "rankingStrategy" : "SINGLE_SMOOP",
    "rankingCriteria" : [ {
      "name" : "luceneScore",
      "objective" : true,
      "weight" : 0.0,
      "priority" : 0.0
    } ],
    "constraints" : null
  },
  "notificationEmailAddress" : null
}
Example request
$ curl 'http://localhost:8080/v1/candidates/search' -i -X POST -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept: application/json;charset=UTF-8' -d '{
  "input" : "Base64",
  "testDrivenSearch" : false,
  "queryParams" : {
    "start" : 0,
    "rows" : 5,
    "content" : false,
    "artifactInformation" : false,
    "performanceEvaluation" : false,
    "rankingPerformanceMeasurement" : false,
    "filters" : [ "hashcodeclone", "noabstractclass", "nointerface", "latestversion" ],
    "rankingStrategy" : "SINGLE_SMOOP",
    "rankingCriteria" : [ {
      "name" : "luceneScore",
      "objective" : true,
      "weight" : 0.0,
      "priority" : 0.0
    } ],
    "constraints" : null
  },
  "notificationEmailAddress" : null
}'
Example response
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 4645

{
  "methods" : null,
  "testSubjectName" : null,
  "testClassName" : null,
  "testClassSource" : null,
  "constraints" : null,
  "testable" : false,
  "candidates" : {
    "candidates" : [ {
      "id" : "ea44f2e0-6173-4dd7-9622-e654e185a56a",
      "groupId" : "com.paypal.sdk",
      "artifactId" : "rest-api-sdk",
      "version" : "1.3.0",
      "name" : "Base64",
      "packagename" : "com.paypal.base.codec.binary",
      "score" : 6.2676773,
      "hash" : "90988444a193ab5b66bc250b1e368c24",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 6.267677307128906
      },
      "ranking" : {
        "SINGLE_SMOOP" : 1.0,
        "SINGLE_SMOOP_po" : 1.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.paypal.base.codec.binary.Base64",
      "uri" : "com.paypal.sdk:rest-api-sdk:1.3.0"
    }, {
      "id" : "af9f43b3-8669-4bf9-8ba4-1f71efe2f755",
      "groupId" : "net.java.dev.ajax4jsf",
      "artifactId" : "ajax4jsf",
      "version" : "1.0.6",
      "name" : "Base64",
      "packagename" : "org.ajax4jsf.framework.util.base64",
      "score" : 6.249564,
      "hash" : "2785c533738229066becc89214a46417",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 6.249564170837402
      },
      "ranking" : {
        "SINGLE_SMOOP" : 2.0,
        "SINGLE_SMOOP_po" : 2.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.ajax4jsf.framework.util.base64.Base64",
      "uri" : "net.java.dev.ajax4jsf:ajax4jsf:1.0.6"
    }, {
      "id" : "046815e2-1291-4a58-9d2c-953a3ef14fe8",
      "groupId" : "org.bitbucket.b_c",
      "artifactId" : "jose4j",
      "version" : "0.4.4",
      "name" : "Base64",
      "packagename" : "org.jose4j.base64url.internal.apache.commons.codec.binary",
      "score" : 5.9445486,
      "hash" : "7a20d45855f942c7b751b8a7c5b2435a",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 5.944548606872559
      },
      "ranking" : {
        "SINGLE_SMOOP" : 3.0,
        "SINGLE_SMOOP_po" : 3.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.jose4j.base64url.internal.apache.commons.codec.binary.Base64",
      "uri" : "org.bitbucket.b_c:jose4j:0.4.4"
    }, {
      "id" : "ac17b1f3-cd86-4d5a-b937-4e571fde5a69",
      "groupId" : "biz.aQute",
      "artifactId" : "bnd",
      "version" : "1.50.0",
      "name" : "Base64",
      "packagename" : "aQute.lib.base64",
      "score" : 4.798713,
      "hash" : "fc69b5e56678996542a6035ed3e03263",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 4.798713207244873
      },
      "ranking" : {
        "SINGLE_SMOOP" : 4.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "aQute.lib.base64.Base64",
      "uri" : "biz.aQute:bnd:1.50.0"
    }, {
      "id" : "fc59bdde-992c-4774-b1dd-6ca21375f758",
      "groupId" : "biz.aQute.bnd",
      "artifactId" : "bndlib",
      "version" : "2.4.0",
      "name" : "Base64",
      "packagename" : "aQute.lib.base64",
      "score" : 4.796496,
      "hash" : "3117c167085d33cd6702941294260cb0",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 4.7964959144592285
      },
      "ranking" : {
        "SINGLE_SMOOP" : 5.0,
        "SINGLE_SMOOP_po" : 5.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "aQute.lib.base64.Base64",
      "uri" : "biz.aQute.bnd:bndlib:2.4.0"
    } ],
    "start" : 0,
    "rows" : 5,
    "total" : 113506
  },
  "jobId" : null,
  "jobStartDate" : null,
  "jobEndDate" : null,
  "jobStatusType" : null,
  "rankingPerformance" : null,
  "criteriaStats" : null
}

See Candidate Search Response for general information about returned candidate responses.

Use the following for an interface signature-based candidate search.

A POST request using a JSON document as method body will return component candidates found. The input parameter denotes the (MQL)-compliant interface signatures to search for (here set to Base64(encode(byte[]):String;)). See Candidate Search Request for further request options.

Request structure
POST /v1/candidates/search HTTP/1.1
Content-Type: application/json;charset=UTF-8
Accept: application/json;charset=UTF-8
Host: localhost
Content-Length: 604

{
  "input" : "Base64(encode(byte[]):String;)",
  "testDrivenSearch" : false,
  "queryParams" : {
    "start" : 0,
    "rows" : 5,
    "content" : false,
    "artifactInformation" : false,
    "performanceEvaluation" : false,
    "rankingPerformanceMeasurement" : false,
    "filters" : [ "hashcodeclone", "noabstractclass", "nointerface", "latestversion" ],
    "rankingStrategy" : "SINGLE_SMOOP",
    "rankingCriteria" : [ {
      "name" : "luceneScore",
      "objective" : true,
      "weight" : 0.0,
      "priority" : 0.0
    } ],
    "constraints" : null
  },
  "notificationEmailAddress" : null
}
Example request
$ curl 'http://localhost:8080/v1/candidates/search' -i -X POST -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept: application/json;charset=UTF-8' -d '{
  "input" : "Base64(encode(byte[]):String;)",
  "testDrivenSearch" : false,
  "queryParams" : {
    "start" : 0,
    "rows" : 5,
    "content" : false,
    "artifactInformation" : false,
    "performanceEvaluation" : false,
    "rankingPerformanceMeasurement" : false,
    "filters" : [ "hashcodeclone", "noabstractclass", "nointerface", "latestversion" ],
    "rankingStrategy" : "SINGLE_SMOOP",
    "rankingCriteria" : [ {
      "name" : "luceneScore",
      "objective" : true,
      "weight" : 0.0,
      "priority" : 0.0
    } ],
    "constraints" : null
  },
  "notificationEmailAddress" : null
}'
Example response
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 4915

{
  "methods" : null,
  "testSubjectName" : null,
  "testClassName" : null,
  "testClassSource" : null,
  "constraints" : null,
  "testable" : false,
  "candidates" : {
    "candidates" : [ {
      "id" : "ea44f2e0-6173-4dd7-9622-e654e185a56a",
      "groupId" : "com.paypal.sdk",
      "artifactId" : "rest-api-sdk",
      "version" : "1.3.0",
      "name" : "Base64",
      "packagename" : "com.paypal.base.codec.binary",
      "score" : 5.7153645,
      "hash" : "90988444a193ab5b66bc250b1e368c24",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 5.715364456176758
      },
      "ranking" : {
        "SINGLE_SMOOP" : 1.0,
        "SINGLE_SMOOP_po" : 1.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.paypal.base.codec.binary.Base64",
      "uri" : "com.paypal.sdk:rest-api-sdk:1.3.0"
    }, {
      "id" : "459b61b6-4517-431c-9794-9da8607e8f2c",
      "groupId" : "org.apache.tuscany.sca.aggregation",
      "artifactId" : "tuscany-binding-ws-runtime-axis2-aggregation",
      "version" : "2.0.1",
      "name" : "Base64",
      "packagename" : "org.apache.axiom.om.util",
      "score" : 5.4650044,
      "hash" : "5a8d7c952a685d9adc81f3bef26f90a0",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 5.4650044441223145
      },
      "ranking" : {
        "SINGLE_SMOOP" : 2.0,
        "SINGLE_SMOOP_po" : 2.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.apache.axiom.om.util.Base64",
      "uri" : "org.apache.tuscany.sca.aggregation:tuscany-binding-ws-runtime-axis2-aggregation:2.0.1"
    }, {
      "id" : "226d6ddd-81c7-4515-a0e4-8d92b088c12c",
      "groupId" : "org.apache.servicemix.bundles",
      "artifactId" : "org.apache.servicemix.bundles.axiom-api",
      "version" : "1.2.13-1",
      "name" : "Base64",
      "packagename" : "org.apache.axiom.om.util",
      "score" : 5.4650044,
      "hash" : "5a8d7c952a685d9adc81f3bef26f90a0",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 5.4650044441223145
      },
      "ranking" : {
        "SINGLE_SMOOP" : 3.0,
        "SINGLE_SMOOP_po" : 2.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.apache.axiom.om.util.Base64",
      "uri" : "org.apache.servicemix.bundles:org.apache.servicemix.bundles.axiom-api:1.2.13-1"
    }, {
      "id" : "af9f43b3-8669-4bf9-8ba4-1f71efe2f755",
      "groupId" : "net.java.dev.ajax4jsf",
      "artifactId" : "ajax4jsf",
      "version" : "1.0.6",
      "name" : "Base64",
      "packagename" : "org.ajax4jsf.framework.util.base64",
      "score" : 5.060299,
      "hash" : "2785c533738229066becc89214a46417",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 5.060298919677734
      },
      "ranking" : {
        "SINGLE_SMOOP" : 4.0,
        "SINGLE_SMOOP_po" : 3.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.ajax4jsf.framework.util.base64.Base64",
      "uri" : "net.java.dev.ajax4jsf:ajax4jsf:1.0.6"
    }, {
      "id" : "046815e2-1291-4a58-9d2c-953a3ef14fe8",
      "groupId" : "org.bitbucket.b_c",
      "artifactId" : "jose4j",
      "version" : "0.4.4",
      "name" : "Base64",
      "packagename" : "org.jose4j.base64url.internal.apache.commons.codec.binary",
      "score" : 4.8985868,
      "hash" : "7a20d45855f942c7b751b8a7c5b2435a",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 4.898586750030518
      },
      "ranking" : {
        "SINGLE_SMOOP" : 5.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.jose4j.base64url.internal.apache.commons.codec.binary.Base64",
      "uri" : "org.bitbucket.b_c:jose4j:0.4.4"
    } ],
    "start" : 0,
    "rows" : 5,
    "total" : 1134565
  },
  "jobId" : null,
  "jobStartDate" : null,
  "jobEndDate" : null,
  "jobStatusType" : null,
  "rankingPerformance" : null,
  "criteriaStats" : null
}

See Candidate Search Response for general information about returned candidate responses.

At time of writing, only JUnit 4 is supported for test specification search.

Use the following for a test specification-based candidate search (NO test-driven search evaluation, only textual matching!).

A POST request using a JSON document as method body will return component candidates found. The input parameter the entire JUnit 4 test class (here see input value in Request structure). See Candidate Search Request for further request options.

Request structure
POST /v1/candidates/search HTTP/1.1
Content-Type: application/json;charset=UTF-8
Accept: application/json;charset=UTF-8
Host: localhost
Content-Length: 996

{
  "input" : "public class Base64Test {\n\n    @Test\n    public void testEncode() {\n        Base64 b = new Base64();\n\n        String basicAuth = \"Authorization: Basic \";\n        String userPassPlain = \"user:password\";\n        byte[] encodeBytes = userPassPlain.getBytes();\n\n        // encode\n        String userPassBase64 = b.encode(encodeBytes);\n\n        assertEquals(\"dXNlcjpwYXNzd29yZA==\", userPassBase64);\n    }\n}",
  "testDrivenSearch" : false,
  "queryParams" : {
    "start" : 0,
    "rows" : 5,
    "content" : false,
    "artifactInformation" : false,
    "performanceEvaluation" : false,
    "rankingPerformanceMeasurement" : false,
    "filters" : [ "hashcodeclone", "noabstractclass", "nointerface", "latestversion" ],
    "rankingStrategy" : "SINGLE_SMOOP",
    "rankingCriteria" : [ {
      "name" : "luceneScore",
      "objective" : true,
      "weight" : 0.0,
      "priority" : 0.0
    } ],
    "constraints" : null
  },
  "notificationEmailAddress" : null
}
Example request
$ curl 'http://localhost:8080/v1/candidates/search' -i -X POST -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept: application/json;charset=UTF-8' -d '{
  "input" : "public class Base64Test {\n\n    @Test\n    public void testEncode() {\n        Base64 b = new Base64();\n\n        String basicAuth = \"Authorization: Basic \";\n        String userPassPlain = \"user:password\";\n        byte[] encodeBytes = userPassPlain.getBytes();\n\n        // encode\n        String userPassBase64 = b.encode(encodeBytes);\n\n        assertEquals(\"dXNlcjpwYXNzd29yZA==\", userPassBase64);\n    }\n}",
  "testDrivenSearch" : false,
  "queryParams" : {
    "start" : 0,
    "rows" : 5,
    "content" : false,
    "artifactInformation" : false,
    "performanceEvaluation" : false,
    "rankingPerformanceMeasurement" : false,
    "filters" : [ "hashcodeclone", "noabstractclass", "nointerface", "latestversion" ],
    "rankingStrategy" : "SINGLE_SMOOP",
    "rankingCriteria" : [ {
      "name" : "luceneScore",
      "objective" : true,
      "weight" : 0.0,
      "priority" : 0.0
    } ],
    "constraints" : null
  },
  "notificationEmailAddress" : null
}'
Example response
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 5369

{
  "methods" : [ "encode(byte[]):String" ],
  "testSubjectName" : "Base64",
  "testClassName" : "Base64Test",
  "testClassSource" : "public class Base64Test {\n\n    @Test\n    public void testEncode() {\n        Base64 b = new Base64();\n\n        String basicAuth = \"Authorization: Basic \";\n        String userPassPlain = \"user:password\";\n        byte[] encodeBytes = userPassPlain.getBytes();\n\n        // encode\n        String userPassBase64 = b.encode(encodeBytes);\n\n        assertEquals(\"dXNlcjpwYXNzd29yZA==\", userPassBase64);\n    }\n}",
  "constraints" : null,
  "testable" : true,
  "candidates" : {
    "candidates" : [ {
      "id" : "ea44f2e0-6173-4dd7-9622-e654e185a56a",
      "groupId" : "com.paypal.sdk",
      "artifactId" : "rest-api-sdk",
      "version" : "1.3.0",
      "name" : "Base64",
      "packagename" : "com.paypal.base.codec.binary",
      "score" : 5.7153645,
      "hash" : "90988444a193ab5b66bc250b1e368c24",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 5.715364456176758
      },
      "ranking" : {
        "SINGLE_SMOOP" : 1.0,
        "SINGLE_SMOOP_po" : 1.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.paypal.base.codec.binary.Base64",
      "uri" : "com.paypal.sdk:rest-api-sdk:1.3.0"
    }, {
      "id" : "459b61b6-4517-431c-9794-9da8607e8f2c",
      "groupId" : "org.apache.tuscany.sca.aggregation",
      "artifactId" : "tuscany-binding-ws-runtime-axis2-aggregation",
      "version" : "2.0.1",
      "name" : "Base64",
      "packagename" : "org.apache.axiom.om.util",
      "score" : 5.4650044,
      "hash" : "5a8d7c952a685d9adc81f3bef26f90a0",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 5.4650044441223145
      },
      "ranking" : {
        "SINGLE_SMOOP" : 2.0,
        "SINGLE_SMOOP_po" : 2.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.apache.axiom.om.util.Base64",
      "uri" : "org.apache.tuscany.sca.aggregation:tuscany-binding-ws-runtime-axis2-aggregation:2.0.1"
    }, {
      "id" : "226d6ddd-81c7-4515-a0e4-8d92b088c12c",
      "groupId" : "org.apache.servicemix.bundles",
      "artifactId" : "org.apache.servicemix.bundles.axiom-api",
      "version" : "1.2.13-1",
      "name" : "Base64",
      "packagename" : "org.apache.axiom.om.util",
      "score" : 5.4650044,
      "hash" : "5a8d7c952a685d9adc81f3bef26f90a0",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 5.4650044441223145
      },
      "ranking" : {
        "SINGLE_SMOOP" : 3.0,
        "SINGLE_SMOOP_po" : 2.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.apache.axiom.om.util.Base64",
      "uri" : "org.apache.servicemix.bundles:org.apache.servicemix.bundles.axiom-api:1.2.13-1"
    }, {
      "id" : "af9f43b3-8669-4bf9-8ba4-1f71efe2f755",
      "groupId" : "net.java.dev.ajax4jsf",
      "artifactId" : "ajax4jsf",
      "version" : "1.0.6",
      "name" : "Base64",
      "packagename" : "org.ajax4jsf.framework.util.base64",
      "score" : 5.060299,
      "hash" : "2785c533738229066becc89214a46417",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 5.060298919677734
      },
      "ranking" : {
        "SINGLE_SMOOP" : 4.0,
        "SINGLE_SMOOP_po" : 3.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.ajax4jsf.framework.util.base64.Base64",
      "uri" : "net.java.dev.ajax4jsf:ajax4jsf:1.0.6"
    }, {
      "id" : "046815e2-1291-4a58-9d2c-953a3ef14fe8",
      "groupId" : "org.bitbucket.b_c",
      "artifactId" : "jose4j",
      "version" : "0.4.4",
      "name" : "Base64",
      "packagename" : "org.jose4j.base64url.internal.apache.commons.codec.binary",
      "score" : 4.8985868,
      "hash" : "7a20d45855f942c7b751b8a7c5b2435a",
      "content" : null,
      "methods" : null,
      "successMethods" : null,
      "failedMethods" : null,
      "artifactInfo" : null,
      "values" : null,
      "metrics" : {
        "luceneScore" : 4.898586750030518
      },
      "ranking" : {
        "SINGLE_SMOOP" : 5.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.jose4j.base64url.internal.apache.commons.codec.binary.Base64",
      "uri" : "org.bitbucket.b_c:jose4j:0.4.4"
    } ],
    "start" : 0,
    "rows" : 5,
    "total" : 1134565
  },
  "jobId" : null,
  "jobStartDate" : null,
  "jobEndDate" : null,
  "jobStatusType" : null,
  "rankingPerformance" : null,
  "criteriaStats" : null
}

See Candidate Search Response for general information about returned candidate responses.

Run new Test-Driven Search Evaluation Job

Use the following for running test-driven search evaluation.

A POST request using a JSON document as method body will return component candidates found. Use the start and rows parameter for pagination. The input parameter the entire JUnit 4 test class (here see input value in Request structure). The parameter testDrivenSearch must be set to true.

Request structure

POST /v1/candidates/search HTTP/1.1
Content-Type: application/json;charset=UTF-8
Accept: application/json;charset=UTF-8
Host: localhost
Content-Length: 877

{
  "input" : "public class Base64Test {\n\n    @Test\n    public void testEncode() {\n        Base64 b = new Base64();\n\n        String basicAuth = \"Authorization: Basic \";\n        String userPassPlain = \"user:password\";\n        byte[] encodeBytes = userPassPlain.getBytes();\n\n        // encode\n        String userPassBase64 = b.encode(encodeBytes);\n\n        assertEquals(\"dXNlcjpwYXNzd29yZA==\", userPassBase64);\n    }\n}",
  "testDrivenSearch" : true,
  "queryParams" : {
    "start" : 0,
    "rows" : 5,
    "content" : false,
    "artifactInformation" : false,
    "performanceEvaluation" : false,
    "rankingPerformanceMeasurement" : false,
    "filters" : [ "hashcodeclone", "noabstractclass", "nointerface", "latestversion" ],
    "rankingStrategy" : null,
    "rankingCriteria" : null,
    "constraints" : null
  },
  "notificationEmailAddress" : null
}

Example request

$ curl 'http://localhost:8080/v1/candidates/search' -i -X POST -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept: application/json;charset=UTF-8' -d '{
  "input" : "public class Base64Test {\n\n    @Test\n    public void testEncode() {\n        Base64 b = new Base64();\n\n        String basicAuth = \"Authorization: Basic \";\n        String userPassPlain = \"user:password\";\n        byte[] encodeBytes = userPassPlain.getBytes();\n\n        // encode\n        String userPassBase64 = b.encode(encodeBytes);\n\n        assertEquals(\"dXNlcjpwYXNzd29yZA==\", userPassBase64);\n    }\n}",
  "testDrivenSearch" : true,
  "queryParams" : {
    "start" : 0,
    "rows" : 5,
    "content" : false,
    "artifactInformation" : false,
    "performanceEvaluation" : false,
    "rankingPerformanceMeasurement" : false,
    "filters" : [ "hashcodeclone", "noabstractclass", "nointerface", "latestversion" ],
    "rankingStrategy" : null,
    "rankingCriteria" : null,
    "constraints" : null
  },
  "notificationEmailAddress" : null
}'

Example response

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 810

{
  "methods" : [ "encode(byte[]):String" ],
  "testSubjectName" : "Base64",
  "testClassName" : "Base64Test",
  "testClassSource" : "public class Base64Test {\n\n    @Test\n    public void testEncode() {\n        Base64 b = new Base64();\n\n        String basicAuth = \"Authorization: Basic \";\n        String userPassPlain = \"user:password\";\n        byte[] encodeBytes = userPassPlain.getBytes();\n\n        // encode\n        String userPassBase64 = b.encode(encodeBytes);\n\n        assertEquals(\"dXNlcjpwYXNzd29yZA==\", userPassBase64);\n    }\n}",
  "constraints" : null,
  "testable" : true,
  "candidates" : null,
  "jobId" : "f216a412-4dbe-4b28-8e9a-56b1114c6cd7",
  "jobStartDate" : null,
  "jobEndDate" : null,
  "jobStatusType" : null,
  "rankingPerformance" : null,
  "criteriaStats" : null
}

The important parameter part of the result is the jobId parameter. This value is supposed to be used to query the current job status as well as to get (intermediate) results (see below). Apart from this, the response contains information about the extracted interface signatures etc.

Query Job Status

A GET request will return the job status for given job id.

Request structure

GET /v1/candidates/jobs/0508e01e-27f4-4488-8b55-4a7d01832e5d HTTP/1.1
Accept: application/json;charset=UTF-8
Host: localhost

Example request

$ curl 'http://localhost:8080/v1/candidates/jobs/0508e01e-27f4-4488-8b55-4a7d01832e5d' -i -H 'Accept: application/json;charset=UTF-8'

Example response

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 174

{
  "jobId" : "0508e01e-27f4-4488-8b55-4a7d01832e5d",
  "startDate" : 1451381159893,
  "endDate" : 1451387470178,
  "statusType" : "FINISHED",
  "noOfPassedCandidates" : 67
}

Available fields:

  • statusType may be RUNNING or FINISHED

Get (Instant) Results

Use the following you are going to get intermediate component candidate results (if any).

A POST request using the previously returned jobId is used to fetch a list of (intermediate) results independent of the job status (if already started!). Use the start and rows query parameter for pagination (similar to Candidate Search Request).

Request structure

POST /v1/candidates/0508e01e-27f4-4488-8b55-4a7d01832e5d HTTP/1.1
Content-Type: application/json;charset=UTF-8
Accept: application/json;charset=UTF-8
Host: localhost
Content-Length: 369

{
  "start" : 0,
  "rows" : 5,
  "content" : true,
  "artifactInformation" : true,
  "performanceEvaluation" : false,
  "rankingPerformanceMeasurement" : false,
  "filters" : null,
  "rankingStrategy" : "SINGLE_SMOOP",
  "rankingCriteria" : [ {
    "name" : "luceneScore",
    "objective" : true,
    "weight" : 0.0,
    "priority" : 0.0
  } ],
  "constraints" : null
}

Example request

$ curl 'http://localhost:8080/v1/candidates/0508e01e-27f4-4488-8b55-4a7d01832e5d' -i -X POST -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept: application/json;charset=UTF-8' -d '{
  "start" : 0,
  "rows" : 5,
  "content" : true,
  "artifactInformation" : true,
  "performanceEvaluation" : false,
  "rankingPerformanceMeasurement" : false,
  "filters" : null,
  "rankingStrategy" : "SINGLE_SMOOP",
  "rankingCriteria" : [ {
    "name" : "luceneScore",
    "objective" : true,
    "weight" : 0.0,
    "priority" : 0.0
  } ],
  "constraints" : null
}'

Example response

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 2207315

{
  "methods" : [ "encode(byte[]):char[]", "decode(char[]):byte[]" ],
  "testSubjectName" : "Base64",
  "testClassName" : "Base64Test",
  "testClassSource" : "public class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}",
  "constraints" : [ ],
  "testable" : true,
  "candidates" : {
    "candidates" : [ {
      "id" : "f97b7730-b49a-487c-a1e3-71db742901d8",
      "groupId" : "com.lambdaworks",
      "artifactId" : "scrypt",
      "version" : "1.4.0",
      "name" : "Base64",
      "packagename" : "com.lambdaworks.codec",
      "score" : 7.033302,
      "hash" : "b2e7dec2dd384c2ab81882c69fa30b7f",
      "content" : "// Copyright (C) 2011 - Will Glozer.  All rights reserved.\n\npackage com.lambdaworks.codec;\n\nimport java.util.Arrays;\n\n/**\n * High-performance base64 codec based on the algorithm used in Mikael Grev's MiG Base64.\n * This implementation is designed to handle base64 without line splitting and with\n * optional padding. Alternative character tables may be supplied to the {@code encode}\n * and {@code decode} methods to implement modified base64 schemes.\n *\n * Decoding assumes correct input, the caller is responsible for ensuring that the input\n * contains no invalid characters.\n *\n * @author Will Glozer\n */\npublic class Base64 {\n    private static final char[] encode = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".toCharArray();\n    private static final int[]  decode = new int[128];\n    private static final char   pad    = '=';\n\n    static {\n        Arrays.fill(decode, -1);\n        for (int i = 0; i < encode.length; i++) {\n            decode[encode[i]] = i;\n        }\n        decode[pad] = 0;\n    }\n\n    /**\n     * Decode base64 chars to bytes.\n     *\n     * @param chars Chars to encode.\n     *\n     * @return Decoded bytes.\n     */\n    public static byte[] decode(char[] chars) {\n        return decode(chars, decode, pad);\n    }\n\n    /**\n     * Encode bytes to base64 chars, with padding.\n     *\n     * @param bytes Bytes to encode.\n     *\n     * @return Encoded chars.\n     */\n    public static char[] encode(byte[] bytes) {\n        return encode(bytes, encode, pad);\n    }\n\n    /**\n     * Encode bytes to base64 chars, with optional padding.\n     *\n     * @param bytes     Bytes to encode.\n     * @param padded    Add padding to output.\n     *\n     * @return Encoded chars.\n     */\n    public static char[] encode(byte[] bytes, boolean padded) {\n        return encode(bytes, encode, padded ? pad : 0);\n    }\n\n    /**\n     * Decode base64 chars to bytes using the supplied decode table and padding\n     * character.\n     *\n     * @param src   Base64 encoded data.\n     * @param table Decode table.\n     * @param pad   Padding character.\n     *\n     * @return Decoded bytes.\n     */\n    public static byte[] decode(char[] src, int[] table, char pad) {\n        int len = src.length;\n\n        if (len == 0) return new byte[0];\n\n        int padCount = (src[len - 1] == pad ? (src[len - 2] == pad ? 2 : 1) : 0);\n        int bytes    = (len * 6 >> 3) - padCount;\n        int blocks   = (bytes / 3) * 3;\n\n        byte[] dst = new byte[bytes];\n        int si = 0, di = 0;\n\n        while (di < blocks) {\n            int n = table[src[si++]] << 18 | table[src[si++]] << 12 | table[src[si++]] << 6 | table[src[si++]];\n            dst[di++] = (byte) (n >> 16);\n            dst[di++] = (byte) (n >>  8);\n            dst[di++] = (byte) n;\n        }\n\n        if (di < bytes) {\n            int n = 0;\n            switch (len - si) {\n                case 4: n |= table[src[si+3]];\n                case 3: n |= table[src[si+2]] <<  6;\n                case 2: n |= table[src[si+1]] << 12;\n                case 1: n |= table[src[si]]   << 18;\n            }\n            for (int r = 16; di < bytes; r -= 8) {\n                dst[di++] = (byte) (n >> r);\n            }\n        }\n\n        return dst;\n    }\n\n    /**\n     * Encode bytes to base64 chars using the supplied encode table and with\n     * optional padding.\n     *\n     * @param src   Bytes to encode.\n     * @param table Encoding table.\n     * @param pad   Padding character, or 0 for no padding.\n     *\n     * @return Encoded chars.\n     */\n    public static char[] encode(byte[] src, char[] table, char pad) {\n        int len = src.length;\n\n        if (len == 0) return new char[0];\n\n        int blocks = (len / 3) * 3;\n        int chars  = ((len - 1) / 3 + 1) << 2;\n        int tail   = len - blocks;\n        if (pad == 0 && tail > 0) chars -= 3 - tail;\n\n        char[] dst = new char[chars];\n        int si = 0, di = 0;\n\n        while (si < blocks) {\n            int n = (src[si++] & 0xff) << 16 | (src[si++] & 0xff) << 8 | (src[si++] & 0xff);\n            dst[di++] = table[(n >>> 18) & 0x3f];\n            dst[di++] = table[(n >>> 12) & 0x3f];\n            dst[di++] = table[(n >>>  6) & 0x3f];\n            dst[di++] = table[n          & 0x3f];\n        }\n\n        if (tail > 0) {\n            int n = (src[si] & 0xff) << 10;\n            if (tail == 2) n |= (src[++si] & 0xff) << 2;\n\n            dst[di++] = table[(n >>> 12) & 0x3f];\n            dst[di++] = table[(n >>> 6)  & 0x3f];\n            if (tail == 2) dst[di++] = table[n & 0x3f];\n\n            if (pad != 0) {\n                if (tail == 1) dst[di++] = pad;\n                dst[di] = pad;\n            }\n        }\n\n        return dst;\n    }\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 38,
          "lineEnd" : 40,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 49,
          "lineEnd" : 51,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], boolean):char[]",
          "lineStart" : 61,
          "lineEnd" : 63,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int[]", "char" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], int[], char):byte[]",
          "lineStart" : 75,
          "lineEnd" : 108,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "char[]", "char" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], char[], char):char[]",
          "lineStart" : 120,
          "lineEnd" : 156,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 49,
        "lineEnd" : 51,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 38,
        "lineEnd" : 40,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "scrypt",
        "description" : "Java implementation of scrypt",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "b1e1d0af-709a-4e8c-add5-93a5cdc005ab" ],
        "_version_" : [ 1521883735495016448 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] com.lambdaworks.codec.Base64.encode(byte[])|com.lambdaworks.codec.Base64.encode([B)[C|[0]", "false|public static byte[] com.lambdaworks.codec.Base64.decode(char[])|com.lambdaworks.codec.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public com.lambdaworks.codec.Base64()|com.lambdaworks.codec.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.3055555555555556,
        "sf_complexity_necf" : 26.0,
        "calledClasses_ckjm_ext_ca_max" : 1.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.8888888888888888,
        "jmh_thrpt_score_sum" : 225279.52094871766,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 24.0,
        "sf_line_balance" : 0.0196078431372549,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 59.857142857142854,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 10.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 13.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 6.999999999999999,
        "entryClass_ckjm_ext_loc" : 429.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 225279.52094871775,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 51.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 59.85714285714283,
        "calledClasses_ckjm_ext_cbo_mean" : 1.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 7.0,
        "calledClasses_ckjm_ext_rfc_sum" : 10.0,
        "sf_instruction_necf" : 391.0,
        "calledClasses_ckjm_ext_npm_sum" : 6.0,
        "calledClasses_ckjm_ext_loc_geomean" : 429.0,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 13.0,
        "calledClasses_ckjm_ext_loc_min" : 429.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 391.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 10.000000000000002,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.2,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 52.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 1.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 7.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3055555555555556,
        "sf_line_leanmetric" : 51.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.3055555555555556,
        "calledClasses_ckjm_ext_lcom_sum" : 13.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 13.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 2.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 1.0,
        "calledClasses_ckjm_ext_loc_sum" : 429.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.3055555555555556,
        "calledClasses_ckjm_ext_lcom3_max" : 0.8888888888888888,
        "entryClass_ckjm_ext_amc" : 59.857142857142854,
        "sf_method_sf" : 1.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 59.857142857142854,
        "calledClasses_ckjm_ext_npm_max" : 6.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 1.0,
        "calledClasses_ckjm_ext_ca_sum" : 1.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.02356020942408377,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.3055555555555556,
        "jmh_thrpt_score_quadmean" : 225279.52094871766,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 24.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 13.0,
        "sf_line_total" : 52.0,
        "entryClass_ckjm_ext_lcom" : 13.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 382.0,
        "sf_line_sf" : 1.0,
        "hashCodeCloneCountGlobal" : 2.0,
        "luceneScore" : 7.033301830291748,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 6.0,
        "sf_instruction_covered" : 382.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 10.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.8888888888888888,
        "entryClass_ckjm_ext_lcom3" : 0.8888888888888888,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 1.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 1.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 2.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 429.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 382.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 6.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 1.0,
        "calledClasses_ckjm_ext_amc_max" : 59.857142857142854,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 1.0,
        "calledClasses_ckjm_ext_lcom_min" : 13.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 5.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 59.857142857142854,
        "jmh_thrpt_score_mean" : 225279.52094871766,
        "sf_line_missed" : 1.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 24.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 1.0,
        "sf_line_leanness" : 0.9807692307692307,
        "calledUncalledMethodRatio" : 0.8571428571428571,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 9.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 429.0,
        "calledClasses_ckjm_ext_wmc_mean" : 7.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 2.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.3055555555555556,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.8888888888888888,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.3055555555555556,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 6.0,
        "sf_line_nf" : 51.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 9.0,
        "sf_method_covered" : 5.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.8888888888888888,
        "sf_complexity_leanness" : 0.9230769230769231,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 6.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 26.0,
        "noCalledMethods" : 6.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.08333333333333333,
        "calledClasses_ckjm_ext_npm_min" : 6.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.9769820971867008,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.8333333333333334,
        "calledClasses_ckjm_ext_lcom3_min" : 0.8888888888888888,
        "calledClasses_ckjm_ext_wmc_max" : 7.0,
        "calledClasses_ckjm_ext_rfc_mean" : 10.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 1.0,
        "sf_method_nf" : 5.0,
        "calledClasses_ckjm_ext_npm_geomean" : 6.0,
        "calledClasses_ckjm_ext_amc_min" : 59.857142857142854,
        "calledClasses_ckjm_ext_wmc_sum" : 7.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 10.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 429.0,
        "calledClasses_ckjm_ext_ca_mean" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 6.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 10.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 225279.52094871766,
        "entryClass_ckjm_ext_wmc" : 7.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 1.0,
        "SINGLE_SMOOP_po" : 1.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.lambdaworks.codec.Base64",
      "uri" : "com.lambdaworks:scrypt:1.4.0"
    }, {
      "id" : "a8333464-f9c1-4a4f-9082-3952355a3ac7",
      "groupId" : "com.lambdaworks",
      "artifactId" : "codec",
      "version" : "1.0.0",
      "name" : "Base64",
      "packagename" : "com.lambdaworks.codec",
      "score" : 7.033302,
      "hash" : "0061bebd6f83f9552c5863c161567b7b",
      "content" : "// Copyright (C) 2011 - Will Glozer.  All rights reserved.\n\npackage com.lambdaworks.codec;\n\nimport java.util.Arrays;\n\n/**\n * High-performance base64 codec based on the algorithm used in Mikael Grev's MiG Base64.\n * This implementation is designed to handle base64 without line splitting and with\n * optional padding. Alternative character tables may be supplied to the {@code encode}\n * and {@code decode} methods to implement modified base64 schemes.\n *\n * Decoding assumes correct input, the caller is responsible for ensuring that the input\n * contains only ASCII characters.\n *\n * @author Will Glozer\n */\npublic class Base64 {\n    private static final char[] encode = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".toCharArray();\n    private static final int[]  decode = new int[128];\n    private static final char   pad    = '=';\n\n    static {\n        Arrays.fill(decode, -1);\n        for (int i = 0; i < encode.length; i++) {\n            decode[encode[i]] = i;\n        }\n        decode[pad] = 0;\n    }\n\n    /**\n     * Decode base64 chars to bytes.\n     *\n     * @param chars Chars to encode.\n     *\n     * @return Decoded bytes.\n     */\n    public static byte[] decode(char[] chars) {\n        return decode(chars, decode, pad);\n    }\n\n    /**\n     * Encode bytes to base64 chars, with padding.\n     *\n     * @param bytes Bytes to encode.\n     *\n     * @return Encoded chars.\n     */\n    public static char[] encode(byte[] bytes) {\n        return encode(bytes, encode, pad);\n    }\n\n    /**\n     * Encode bytes to base64 chars, with optional padding.\n     *\n     * @param bytes     Bytes to encode.\n     * @param padded    Add padding to output.\n     *\n     * @return Encoded chars.\n     */\n    public static char[] encode(byte[] bytes, boolean padded) {\n        return encode(bytes, encode, padded ? pad : 0);\n    }\n\n    /**\n     * Decode base64 chars to bytes using the supplied decode table and padding\n     * character.\n     *\n     * @param src   Base64 encoded data.\n     * @param table Decode table.\n     * @param pad   Padding character.\n     *\n     * @return Decoded bytes.\n     */\n    public static byte[] decode(char[] src, int[] table, char pad) {\n        int len = src.length;\n\n        if (len == 0) return new byte[0];\n\n        int padding = (src[len - 1] == pad ? (src[len - 2] == pad ? 2 : 1) : 0);\n        int bytes   = (len * 6 >> 3) - padding;\n        int blocks  = (bytes / 3) * 3;\n\n        byte[] dst = new byte[bytes];\n        int si = 0, di = 0;\n\n        while (di < blocks) {\n            int n = table[src[si++]] << 18 | table[src[si++]] << 12 | table[src[si++]] << 6 | table[src[si++]];\n            dst[di++] = (byte) (n >> 16);\n            dst[di++] = (byte) (n >>  8);\n            dst[di++] = (byte) n;\n        }\n\n        if (di < bytes) {\n            int n = 0;\n            switch (len - si) {\n                case 4: n |= table[src[si+3]];\n                case 3: n |= table[src[si+2]] <<  6;\n                case 2: n |= table[src[si+1]] << 12;\n                case 1: n |= table[src[si]]   << 18;\n            }\n            for (int r = 16; di < bytes; r -= 8) {\n                dst[di++] = (byte) (n >> r);\n            }\n        }\n\n        return dst;\n    }\n\n    /**\n     * Encode bytes to base64 chars using the supplied encode table and with\n     * optional padding.\n     *\n     * @param src   Bytes to encode.\n     * @param table Encoding table.\n     * @param pad   Padding character, or 0 for no padding.\n     *\n     * @return Encoded chars.\n     */\n    public static char[] encode(byte[] src, char[] table, char pad) {\n        int len = src.length;\n\n        if (len == 0) return new char[0];\n\n        int blocks = (len / 3) * 3;\n        int chars  = ((len - 1) / 3 + 1) << 2;\n        int tail   = len - blocks;\n        if (pad == 0 && tail > 0) chars -= 3 - tail;\n\n        char[] dst = new char[chars];\n        int si = 0, di = 0;\n\n        while (si < blocks) {\n            int n = (src[si++] & 0xff) << 16 | (src[si++] & 0xff) << 8 | (src[si++] & 0xff);\n            dst[di++] = table[(n >>> 18) & 0x3f];\n            dst[di++] = table[(n >>> 12) & 0x3f];\n            dst[di++] = table[(n >>>  6) & 0x3f];\n            dst[di++] = table[n          & 0x3f];\n        }\n\n        if (tail > 0) {\n            int n = (src[si] & 0xff) << 10;\n            if (tail == 2) n |= (src[++si] & 0xff) << 2;\n\n            dst[di++] = table[(n >>> 12) & 0x3f];\n            dst[di++] = table[(n >>>  6) & 0x3f];\n            if (tail == 2) dst[di++] = table[n & 0x3f];\n\n            if (pad != 0) {\n                if (tail == 1) dst[di++] = pad;\n                dst[di] = pad;\n            }\n        }\n\n        return dst;\n    }\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 38,
          "lineEnd" : 40,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 49,
          "lineEnd" : 51,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], boolean):char[]",
          "lineStart" : 61,
          "lineEnd" : 63,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int[]", "char" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], int[], char):byte[]",
          "lineStart" : 75,
          "lineEnd" : 108,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "char[]", "char" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], char[], char):char[]",
          "lineStart" : 120,
          "lineEnd" : 156,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 49,
        "lineEnd" : 51,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 38,
        "lineEnd" : 40,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "codec",
        "description" : "Java binary data codecs",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "5513c1ca-7545-4947-ac86-d119ea404e51" ],
        "_version_" : [ 1521883735548493824 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] com.lambdaworks.codec.Base64.encode(byte[])|com.lambdaworks.codec.Base64.encode([B)[C|[0]", "false|public static byte[] com.lambdaworks.codec.Base64.decode(char[])|com.lambdaworks.codec.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public com.lambdaworks.codec.Base64()|com.lambdaworks.codec.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.3055555555555556,
        "sf_complexity_necf" : 26.0,
        "calledClasses_ckjm_ext_ca_max" : 1.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.8888888888888888,
        "jmh_thrpt_score_sum" : 232460.14809341534,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 24.0,
        "sf_line_balance" : 0.0196078431372549,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 59.857142857142854,
        "calledClasses_ckjm_ext_noc_max" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 10.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 13.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 6.999999999999999,
        "entryClass_ckjm_ext_loc" : 429.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 232460.14809341534,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 51.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 59.85714285714283,
        "calledClasses_ckjm_ext_cbo_mean" : 1.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 7.0,
        "calledClasses_ckjm_ext_rfc_sum" : 10.0,
        "sf_instruction_necf" : 391.0,
        "calledClasses_ckjm_ext_npm_sum" : 6.0,
        "calledClasses_ckjm_ext_loc_geomean" : 429.0,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 13.0,
        "calledClasses_ckjm_ext_loc_min" : 429.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 391.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 10.000000000000002,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.2,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 52.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 1.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 7.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3055555555555556,
        "sf_line_leanmetric" : 51.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.3055555555555556,
        "calledClasses_ckjm_ext_lcom_sum" : 13.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 13.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 2.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 1.0,
        "calledClasses_ckjm_ext_loc_sum" : 429.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.3055555555555556,
        "calledClasses_ckjm_ext_lcom3_max" : 0.8888888888888888,
        "entryClass_ckjm_ext_amc" : 59.857142857142854,
        "sf_method_sf" : 1.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 1.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 59.857142857142854,
        "calledClasses_ckjm_ext_npm_max" : 6.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 1.0,
        "calledClasses_ckjm_ext_ca_sum" : 1.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.02356020942408377,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.3055555555555556,
        "jmh_thrpt_score_quadmean" : 232460.14809341534,
        "calledClasses_ckjm_ext_noc_geomean" : 1.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 24.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 13.0,
        "sf_line_total" : 52.0,
        "entryClass_ckjm_ext_lcom" : 13.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 382.0,
        "sf_line_sf" : 1.0,
        "hashCodeCloneCountGlobal" : 1.0,
        "luceneScore" : 7.033301830291748,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 6.0,
        "sf_instruction_covered" : 382.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 10.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.8888888888888888,
        "entryClass_ckjm_ext_lcom3" : 0.8888888888888888,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 1.0,
        "calledClasses_ckjm_ext_noc_min" : 1.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 1.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 2.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 429.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 382.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 6.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 1.0,
        "calledClasses_ckjm_ext_amc_max" : 59.857142857142854,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 1.0,
        "calledClasses_ckjm_ext_lcom_min" : 13.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 5.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 59.857142857142854,
        "jmh_thrpt_score_mean" : 232460.14809341534,
        "sf_line_missed" : 1.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 24.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 1.0,
        "sf_line_leanness" : 0.9807692307692307,
        "calledUncalledMethodRatio" : 0.8571428571428571,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 9.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 1.0,
        "calledClasses_ckjm_ext_loc_mean" : 429.0,
        "calledClasses_ckjm_ext_wmc_mean" : 7.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 1.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.3055555555555556,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.8888888888888888,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.3055555555555556,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 6.0,
        "sf_line_nf" : 51.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 9.0,
        "sf_method_covered" : 5.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.8888888888888888,
        "sf_complexity_leanness" : 0.9230769230769231,
        "calledClasses_ckjm_ext_noc_mean" : 1.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 6.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 26.0,
        "noCalledMethods" : 6.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.08333333333333333,
        "calledClasses_ckjm_ext_npm_min" : 6.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.9769820971867008,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.8333333333333334,
        "calledClasses_ckjm_ext_lcom3_min" : 0.8888888888888888,
        "calledClasses_ckjm_ext_wmc_max" : 7.0,
        "calledClasses_ckjm_ext_rfc_mean" : 10.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 1.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 1.0,
        "sf_method_nf" : 5.0,
        "calledClasses_ckjm_ext_npm_geomean" : 6.0,
        "calledClasses_ckjm_ext_amc_min" : 59.857142857142854,
        "calledClasses_ckjm_ext_wmc_sum" : 7.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 10.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 429.0,
        "calledClasses_ckjm_ext_ca_mean" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 6.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 10.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 232460.14809341534,
        "entryClass_ckjm_ext_wmc" : 7.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 2.0,
        "SINGLE_SMOOP_po" : 1.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.lambdaworks.codec.Base64",
      "uri" : "com.lambdaworks:codec:1.0.0"
    }, {
      "id" : "8f3def1a-1332-4d04-83b4-f92c10f721b0",
      "groupId" : "org.ow2.jasmine.rules",
      "artifactId" : "jasmine-selfmanagement-rules-cluster-jk-common",
      "version" : "1.3.7",
      "name" : "Base64",
      "packagename" : "org.ow2.jasmine.rules.cluster.jk",
      "score" : 6.8252535,
      "hash" : "7c357b5b4ad08a9615e8581a076fe175",
      "content" : "/**\n * Base64 - encode/decode data using the Base64 encoding scheme\n * Copyright (c) 1998 by Kevin Kelley\n * Contact: Kevin Kelley <kelley@ruralnet.net>\n * 30718 Rd. 28, La Junta, CO, 81050  USA.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307\n * USA\n *\n */\n\npackage org.ow2.jasmine.rules.cluster.jk;\n\n/**\n * Provides encoding of raw bytes to base64-encoded characters, and\n * decoding of base64 characters to raw bytes.\n *\n * @author Kevin Kelley (kelley@ruralnet.net)\n * @version 1.3\n */\npublic final class Base64 {\n\n    /**\n     * Default empty constructor for utility class.\n     */\n    private Base64() {}\n\n    /**\n     * code characters for values 0..63.\n     */\n    private static char[] alphabet =\n        \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"\n        .toCharArray();\n\n    /**\n     * lookup table for converting base64 characters to value in range 0..63.\n     */\n    private static byte[] codes = new byte[256];\n\n    static {\n        for (int i = 0; i < 256; i++) {\n            codes[i] = -1;\n        }\n        for (int i = 'A'; i <= 'Z'; i++) {\n            codes[i] = (byte) (i - 'A');\n        }\n        for (int i = 'a'; i <= 'z'; i++) {\n            codes[i] = (byte) (26 + i - 'a');\n        }\n        for (int i = '0'; i <= '9'; i++) {\n            codes[i] = (byte) (52 + i - '0');\n        }\n        codes['+'] = 62;\n        codes['/'] = 63;\n    }\n\n\n\n    /**\n     * returns an array of base64-encoded characters to represent the\n     * passed data array.\n     *\n     * @param data the array of bytes to encode\n     * @return base64-coded character array.\n     */\n    public static char[] encode(final byte[] data) {\n        char[] out = new char[((data.length + 2) / 3) * 4];\n\n        //\n        // 3 bytes encode to 4 chars.  Output is always an even\n        // multiple of 4 characters.\n        //\n        for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {\n            boolean quad = false;\n            boolean trip = false;\n\n            int val = (0xFF & (int) data[i]);\n            val <<= 8;\n            if ((i + 1) < data.length) {\n                val |= (0xFF & (int) data[i + 1]);\n                trip = true;\n            }\n            val <<= 8;\n            if ((i + 2) < data.length) {\n                val |= (0xFF & (int) data[i + 2]);\n                quad = true;\n            }\n            out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 1] = alphabet[val & 0x3F];\n            val >>= 6;\n            out[index + 0] = alphabet[val & 0x3F];\n        }\n        return out;\n    }\n\n    /**\n     * Decodes a BASE-64 encoded stream to recover the original\n     * data. White space before and after will be trimmed away,\n     * but no other manipulation of the input will be performed.\n     *\n     * As of version 1.2 this method will properly handle input\n     * containing junk characters (newlines and the like) rather\n     * than throwing an error. It does this by pre-parsing the\n     * input and generating from that a count of VALID input\n     * characters.\n     * @param data BASE-64 encoded stream\n     * @return original data\n     **/\n    public static byte[] decode(final char[] data) {\n        // as our input could contain non-BASE64 data (newlines,\n        // whitespace of any sort, whatever) we must first adjust\n        // our count of USABLE data so that...\n        // (a) we don't misallocate the output array, and\n        // (b) think that we miscalculated our data length\n        //     just because of extraneous throw-away junk\n\n        int tempLen = data.length;\n        for (int ix = 0; ix < data.length; ix++) {\n            if ((data[ix] > 255) || codes[ data[ix] ] < 0) {\n                --tempLen;  // ignore non-valid chars and padding\n            }\n        }\n        // calculate required length:\n        //  -- 3 bytes for every 4 valid base64 chars\n        //  -- plus 2 bytes if there are 3 extra base64 chars,\n        //     or plus 1 byte if there are 2 extra.\n\n        int len = (tempLen / 4) * 3;\n        if ((tempLen % 4) == 3) {\n            len += 2;\n        }\n        if ((tempLen % 4) == 2) {\n            len += 1;\n        }\n\n        byte[] out = new byte[len];\n\n\n\n        int shift = 0;   // # of excess bits stored in accum\n        int accum = 0;   // excess bits\n        int index = 0;\n\n        // we now go through the entire array (NOT using the 'tempLen' value)\n        for (int ix = 0; ix < data.length; ix++) {\n            int value = (data[ix] > 255) ? -1 : codes[ data[ix] ];\n\n            if (value >= 0) {           // skip over non-code\n                accum <<= 6;            // bits shift up by 6 each time thru\n                shift += 6;             // loop, with new bits being put in\n                accum |= value;         // at the bottom.\n                if (shift >= 8) {       // whenever there are 8 or more shifted in,\n                    shift -= 8;         // write them out (from the top, leaving any\n                    out[index++] =      // excess at the bottom for next iteration.\n                        (byte) ((accum >> shift) & 0xff);\n                }\n            }\n            // we will also have skipped processing a padding null byte ('=') here;\n            // these are used ONLY for padding to an even length and do not legally\n            // occur as encoded data. for this reason we can ignore the fact that\n            // no index++ operation occurs in that special case: the out[] array is\n            // initialized to all-zero bytes to start with and that works to our\n            // advantage in this combination.\n        }\n\n        // if there is STILL something wrong we just have to throw up now!\n        if (index != out.length) {\n            throw new Error(\"Miscalculated data length (wrote \" + index + \" instead of \" + out.length + \")\");\n        }\n\n        return out;\n    }\n\n\n\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "Base64",
          "returnParam" : null,
          "params" : [ ],
          "visibility" : "private",
          "descriptor" : "-Base64()",
          "lineStart" : 38,
          "lineEnd" : 38,
          "columnStart" : 5,
          "columnEnd" : 23,
          "initializer" : true
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 78,
          "lineEnd" : 109,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 124,
          "lineEnd" : 187,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : [ ],
        "visibility" : "private",
        "descriptor" : "-Base64()",
        "lineStart" : 38,
        "lineEnd" : 38,
        "columnStart" : 5,
        "columnEnd" : 23,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 78,
        "lineEnd" : 109,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 124,
        "lineEnd" : 187,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "JASMINe :: Self management :: Rules :: Cluster :: JK :: Common",
        "description" : null,
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "c0aa917a-0da4-4868-9be1-7dc7424ec0c1" ],
        "_version_" : [ 1521884075687673856 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "org.ow2.jasmine.rules:jasmine-selfmanagement-rules-cluster-api:1.3.7", "org.ow2.util.log:log-api:2.0.0", "org.ow2.util.i18n:i18n:2.0.0" ] ],
        "method" : [ [ "false|public static char[] org.ow2.jasmine.rules.cluster.jk.Base64.encode(byte[])|org.ow2.jasmine.rules.cluster.jk.Base64.encode([B)[C|[0]", "false|public static byte[] org.ow2.jasmine.rules.cluster.jk.Base64.decode(char[])|org.ow2.jasmine.rules.cluster.jk.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|private org.ow2.jasmine.rules.cluster.jk.Base64()|org.ow2.jasmine.rules.cluster.jk.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.3333333333333333,
        "sf_complexity_necf" : 18.0,
        "calledClasses_ckjm_ext_ca_max" : 1.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6666666666666666,
        "jmh_thrpt_score_sum" : 226632.39162311208,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 18.0,
        "sf_line_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 83.25,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 11.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 2.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 4.0,
        "entryClass_ckjm_ext_loc" : 339.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 226632.39162311226,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 47.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 83.24999999999999,
        "calledClasses_ckjm_ext_cbo_mean" : 1.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 4.0,
        "calledClasses_ckjm_ext_rfc_sum" : 11.0,
        "sf_instruction_necf" : 261.0,
        "calledClasses_ckjm_ext_npm_sum" : 2.0,
        "calledClasses_ckjm_ext_loc_geomean" : 338.9999999999999,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 2.0,
        "calledClasses_ckjm_ext_loc_min" : 339.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 261.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 11.000000000000002,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 47.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 0.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 4.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3333333333333333,
        "sf_line_leanmetric" : 47.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom_sum" : 2.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 2.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 0.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 1.0,
        "calledClasses_ckjm_ext_loc_sum" : 339.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6666666666666666,
        "entryClass_ckjm_ext_amc" : 83.25,
        "sf_method_sf" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 83.25,
        "calledClasses_ckjm_ext_npm_max" : 2.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 1.0,
        "calledClasses_ckjm_ext_ca_sum" : 1.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.0,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.3333333333333333,
        "jmh_thrpt_score_quadmean" : 226632.39162311208,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 18.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 2.0,
        "sf_line_total" : 47.0,
        "entryClass_ckjm_ext_lcom" : 2.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 261.0,
        "sf_line_sf" : 0.0,
        "hashCodeCloneCountGlobal" : 5.0,
        "luceneScore" : 6.825253486633301,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 3.0,
        "sf_instruction_covered" : 261.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 11.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.6666666666666666,
        "entryClass_ckjm_ext_lcom3" : 0.6666666666666666,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 1.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 1.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 0.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 339.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 261.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 2.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 1.0,
        "calledClasses_ckjm_ext_amc_max" : 83.25,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 1.0,
        "calledClasses_ckjm_ext_lcom_min" : 2.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 83.25,
        "jmh_thrpt_score_mean" : 226632.39162311208,
        "sf_line_missed" : 0.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 18.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 1.0,
        "sf_line_leanness" : 1.0,
        "calledUncalledMethodRatio" : 1.0,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 0.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 339.0,
        "calledClasses_ckjm_ext_wmc_mean" : 4.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 5.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.6666666666666666,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 2.0,
        "sf_line_nf" : 47.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 0.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.6666666666666666,
        "sf_complexity_leanness" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 3.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 18.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.0,
        "calledClasses_ckjm_ext_npm_min" : 2.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 1.0,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 1.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.6666666666666666,
        "calledClasses_ckjm_ext_wmc_max" : 4.0,
        "calledClasses_ckjm_ext_rfc_mean" : 11.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 0.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 2.0,
        "calledClasses_ckjm_ext_amc_min" : 83.25,
        "calledClasses_ckjm_ext_wmc_sum" : 4.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 11.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 339.0,
        "calledClasses_ckjm_ext_ca_mean" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 2.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 11.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 3.0,
        "jmh_thrpt_score_0" : 226632.39162311208,
        "entryClass_ckjm_ext_wmc" : 4.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 5.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.ow2.jasmine.rules.cluster.jk.Base64",
      "uri" : "org.ow2.jasmine.rules:jasmine-selfmanagement-rules-cluster-jk-common:1.3.7"
    }, {
      "id" : "19739217-a677-4c80-b0a9-3a2617015d69",
      "groupId" : "com.github.to2mbn",
      "artifactId" : "jyal",
      "version" : "1.3",
      "name" : "Base64",
      "packagename" : "com.github.to2mbn.jyal.util",
      "score" : 6.8285766,
      "hash" : "957c494f0553f1ad30de915e51a6db0b",
      "content" : "package com.github.to2mbn.jyal.util;\n\npublic final class Base64 {\n\n\tprivate static final char[] ENCODE_TABLE = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '=' };\n\n\tprivate static final byte[] DECODE_TABLE = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 };\n\n\tpublic static byte[] decode(char[] data) {\n\t\tdata = deleteLineChars(data);\n\t\tint length = ((data.length + 3) / 4) * 3;\n\t\tif (data.length > 0 && data[data.length - 1] == '=') {\n\t\t\tlength--;\n\t\t}\n\t\tif (data.length > 1 && data[data.length - 2] == '=') {\n\t\t\tlength--;\n\t\t}\n\t\tbyte[] out = new byte[length];\n\t\tint shift = 0;\n\t\tint accum = 0;\n\t\tint index = 0;\n\t\tfor (int ix = 0; ix < data.length; ix++) {\n\t\t\tint value = DECODE_TABLE[data[ix] & 0xff];\n\t\t\tif (value >= 0) {\n\t\t\t\taccum <<= 6;\n\t\t\t\tshift += 6;\n\t\t\t\taccum |= value;\n\t\t\t\tif (shift >= 8) {\n\t\t\t\t\tshift -= 8;\n\t\t\t\t\tout[index++] = (byte) ((accum >> shift) & 0xff);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\tstatic public char[] encode(byte[] data) {\n\t\tchar[] out = new char[((data.length + 2) / 3) * 4];\n\n\t\tfor (int i = 0, index = 0; i < data.length; i += 3, index += 4) {\n\t\t\tboolean quad = false;\n\t\t\tboolean trip = false;\n\t\t\tint val = (0xff & data[i]);\n\t\t\tval <<= 8;\n\t\t\tif ((i + 1) < data.length) {\n\t\t\t\tval |= (0xff & data[i + 1]);\n\t\t\t\ttrip = true;\n\t\t\t}\n\t\t\tval <<= 8;\n\t\t\tif ((i + 2) < data.length) {\n\t\t\t\tval |= (0xff & data[i + 2]);\n\t\t\t\tquad = true;\n\t\t\t}\n\t\t\tout[index + 3] = ENCODE_TABLE[(quad ? (val & 0x3f) : 63)];\n\t\t\tval >>= 6;\n\t\t\tout[index + 2] = ENCODE_TABLE[(trip ? (val & 0x3f) : 63)];\n\t\t\tval >>= 6;\n\t\t\tout[index + 1] = ENCODE_TABLE[val & 0x3f];\n\t\t\tval >>= 6;\n\t\t\tout[index + 0] = ENCODE_TABLE[val & 0x3f];\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate static char[] deleteLineChars(char[] in) {\n\t\tint length = 0;\n\t\tfor (int i = 0; i < in.length; i++) {\n\t\t\tif (in[i] != '\\n' && in[i] != '\\r') {\n\t\t\t\tlength++;\n\t\t\t}\n\t\t}\n\t\tif (length == in.length) {\n\t\t\treturn in;\n\t\t}\n\t\tchar[] out = new char[length];\n\t\tint l = 0;\n\t\tfor (int i = 0; i < in.length; i++) {\n\t\t\tif (in[i] != '\\n' && in[i] != '\\r') {\n\t\t\t\tout[l++] = in[i];\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate Base64() {\n\t}\n\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 9,
          "lineEnd" : 35,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 37,
          "lineEnd" : 63,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "deleteLineChars",
          "returnParam" : "char[]",
          "params" : [ "char[]" ],
          "visibility" : "private",
          "descriptor" : "-deleteLineChars(char[]):char[]",
          "lineStart" : 65,
          "lineEnd" : 83,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "Base64",
          "returnParam" : null,
          "params" : [ ],
          "visibility" : "private",
          "descriptor" : "-Base64()",
          "lineStart" : 85,
          "lineEnd" : 86,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : true
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : [ ],
        "visibility" : "private",
        "descriptor" : "-Base64()",
        "lineStart" : 85,
        "lineEnd" : 86,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 37,
        "lineEnd" : 63,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 9,
        "lineEnd" : 35,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "jyal",
        "description" : "Java Yggdrasil Authentication Library",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "0deb302d-9364-4ffc-83c1-7f29d7a803bf" ],
        "_version_" : [ 1521883786785062912 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "org.json:json:20140107" ] ],
        "method" : [ [ "false|public static char[] com.github.to2mbn.jyal.util.Base64.encode(byte[])|com.github.to2mbn.jyal.util.Base64.encode([B)[C|[0]", "false|public static byte[] com.github.to2mbn.jyal.util.Base64.decode(char[])|com.github.to2mbn.jyal.util.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|private com.github.to2mbn.jyal.util.Base64()|com.github.to2mbn.jyal.util.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.3333333333333333,
        "sf_complexity_necf" : 23.0,
        "calledClasses_ckjm_ext_ca_max" : 2.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.75,
        "jmh_thrpt_score_sum" : 226556.9034644485,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 23.0,
        "sf_line_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 208.6,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 6.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 6.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 4.999999999999999,
        "entryClass_ckjm_ext_loc" : 1050.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 226556.90346444855,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 55.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 208.60000000000002,
        "calledClasses_ckjm_ext_cbo_mean" : 2.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 5.0,
        "calledClasses_ckjm_ext_rfc_sum" : 6.0,
        "sf_instruction_necf" : 288.0,
        "calledClasses_ckjm_ext_npm_sum" : 2.0,
        "calledClasses_ckjm_ext_loc_geomean" : 1050.0,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 6.0,
        "calledClasses_ckjm_ext_loc_min" : 1050.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 288.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 6.0,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 55.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 0.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 5.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3333333333333333,
        "sf_line_leanmetric" : 55.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom_sum" : 6.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 6.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 0.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 2.0,
        "calledClasses_ckjm_ext_loc_sum" : 1050.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_max" : 0.75,
        "entryClass_ckjm_ext_amc" : 208.6,
        "sf_method_sf" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 208.6,
        "calledClasses_ckjm_ext_npm_max" : 2.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 2.0,
        "calledClasses_ckjm_ext_ca_sum" : 2.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.0,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.3333333333333333,
        "jmh_thrpt_score_quadmean" : 226556.9034644485,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 23.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 6.0,
        "sf_line_total" : 55.0,
        "entryClass_ckjm_ext_lcom" : 6.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 288.0,
        "sf_line_sf" : 0.0,
        "hashCodeCloneCountGlobal" : 2.0,
        "luceneScore" : 6.828576564788818,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 4.0,
        "sf_instruction_covered" : 288.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 6.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.75,
        "entryClass_ckjm_ext_lcom3" : 0.75,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 2.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 2.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 0.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 1050.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 288.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 2.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 2.0,
        "calledClasses_ckjm_ext_amc_max" : 208.6,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 2.0,
        "calledClasses_ckjm_ext_lcom_min" : 6.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 4.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 208.6,
        "jmh_thrpt_score_mean" : 226556.9034644485,
        "sf_line_missed" : 0.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 2.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 23.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 2.0,
        "sf_line_leanness" : 1.0,
        "calledUncalledMethodRatio" : 1.0,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 0.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 1050.0,
        "calledClasses_ckjm_ext_wmc_mean" : 5.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 2.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.75,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 2.0,
        "sf_line_nf" : 55.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 0.0,
        "sf_method_covered" : 4.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 2.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.75,
        "sf_complexity_leanness" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 2.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 4.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 23.0,
        "noCalledMethods" : 5.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.0,
        "calledClasses_ckjm_ext_npm_min" : 2.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 1.0,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 1.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.75,
        "calledClasses_ckjm_ext_wmc_max" : 5.0,
        "calledClasses_ckjm_ext_rfc_mean" : 6.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 0.0,
        "sf_method_nf" : 4.0,
        "calledClasses_ckjm_ext_npm_geomean" : 2.0,
        "calledClasses_ckjm_ext_amc_min" : 208.6,
        "calledClasses_ckjm_ext_wmc_sum" : 5.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 6.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 1050.0,
        "calledClasses_ckjm_ext_ca_mean" : 2.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 2.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 6.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 1.0,
        "jmh_thrpt_score_0" : 226556.9034644485,
        "entryClass_ckjm_ext_wmc" : 5.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 4.0,
        "SINGLE_SMOOP_po" : 3.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.github.to2mbn.jyal.util.Base64",
      "uri" : "com.github.to2mbn:jyal:1.3"
    }, {
      "id" : "a3798c72-6761-4de4-abcc-6000506876b8",
      "groupId" : "com.skynav.ttt",
      "artifactId" : "ttt-ttv",
      "version" : "2.0",
      "name" : "Base64",
      "packagename" : "com.skynav.ttv.util",
      "score" : 6.8475137,
      "hash" : "4ddf594ad4ad1fb38f1b83f054daa050",
      "content" : "/*\n * Copyright 2015 Skynav, Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY SKYNAV, INC. AND ITS CONTRIBUTORS “AS IS” AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL SKYNAV, INC. OR ITS CONTRIBUTORS BE LIABLE FOR\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\npackage com.skynav.ttv.util;\n\npublic class Base64 {\n\n    private static final char[] map1 = new char[64];\n    static {\n        int i = 0;\n        for (char c = 'A'; c <= 'Z'; c++)\n            map1[i++] = c;\n        for (char c = 'a'; c <= 'z'; c++)\n            map1[i++] = c;\n        for (char c = '0'; c <= '9'; c++)\n            map1[i++] = c;\n        map1[i++] = '+';\n        map1[i++] = '/';\n    }\n\n    private static final byte[] map2 = new byte[128];\n    static {\n        for (int i = 0; i < map2.length; i++)\n            map2[i] = -1;\n        for (int i = 0; i < 64; i++)\n            map2[map1[i]] = (byte) i;\n    }\n\n    public static char[] encode(byte[] in) {\n        return encode(in, 0, in.length);\n    }\n\n    public static char[] encode(byte[] in, int iOffset, int iLength) {\n        int oDataLen = (4 * iLength + 2) / 3;\n        int oLength = ((iLength + 2) / 3) * 4;\n        char[] out = new char[oLength];\n        int iIndex = iOffset;\n        int iEnd = iOffset + iLength;\n        int oIndex = 0;\n        while (iIndex < iEnd) {\n            int i0 = in[iIndex++] & 0xff;\n            int i1 = iIndex < iEnd ? in[iIndex++] & 0xff : 0;\n            int i2 = iIndex < iEnd ? in[iIndex++] & 0xff : 0;\n            int o0 = i0 >>> 2;\n            int o1 = ((i0 &   3) << 4) | (i1 >>> 4);\n            int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);\n            int o3 =   i2 & 0x3f;\n            out[oIndex] = map1[o0];\n            ++oIndex;\n            out[oIndex] = map1[o1];\n            ++oIndex;\n            out[oIndex] = oIndex < oDataLen ? map1[o2] : '=';\n            ++oIndex;\n            out[oIndex] = oIndex < oDataLen ? map1[o3] : '=';\n            ++oIndex;\n        }\n        return out;\n    }\n\n    public static byte[] decode (char[] in) {\n        return decode(in, 0, in.length);\n    }\n\n    public static byte[] decode (char[] in, int iOffset, int iLength) {\n        if ((iLength % 4) != 0)\n            throw new IllegalArgumentException(\"length of base64 encoded input string is not a multiple of 4.\");\n        while ((iLength > 0) && (in[iOffset + iLength - 1] == '='))\n            iLength--;\n        int oLength = (3 * iLength) / 4;\n        byte[] out = new byte[oLength];\n        int iIndex = iOffset;\n        int iEnd = iOffset + iLength;\n        int oIndex = 0;\n        while (iIndex < iEnd) {\n            int i0 = in[iIndex++];\n            int i1 = in[iIndex++];\n            int i2 = iIndex < iEnd ? in[iIndex++] : 'A';\n            int i3 = iIndex < iEnd ? in[iIndex++] : 'A';\n            if ((i0 > 127) || (i1 > 127) || (i2 > 127) || (i3 > 127))\n                throw new IllegalArgumentException(\"illegal character in base64 encoded data.\");\n            int b0 = map2[i0];\n            int b1 = map2[i1];\n            int b2 = map2[i2];\n            int b3 = map2[i3];\n            if ((b0 < 0) || (b1 < 0) || (b2 < 0) || (b3 < 0))\n                throw new IllegalArgumentException(\"illegal character in base64 encoded data.\");\n            int o0 = ( b0        << 2) | (b1 >>> 4);\n            int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2);\n            int o2 = ((b2 &   3) << 6) |  b3;\n            out[oIndex++] = (byte) o0;\n            if (oIndex < oLength) {\n                out[oIndex++] = (byte) o1;\n                out[oIndex++] = (byte) o2;\n            }\n        }\n        return out;\n    }\n\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 51,
          "lineEnd" : 53,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int):char[]",
          "lineStart" : 55,
          "lineEnd" : 80,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 82,
          "lineEnd" : 84,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], int, int):byte[]",
          "lineStart" : 86,
          "lineEnd" : 119,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 51,
        "lineEnd" : 53,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 82,
        "lineEnd" : 84,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "${project.groupId}:${project.artifactId}",
        "description" : "Timed Text Verifier",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "28fba961-8fed-4ff2-923b-b480b941ca85" ],
        "_version_" : [ 1521883786732634112 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] com.skynav.ttv.util.Base64.encode(byte[])|com.skynav.ttv.util.Base64.encode([B)[C|[0]", "false|public static byte[] com.skynav.ttv.util.Base64.decode(char[])|com.skynav.ttv.util.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])|java.lang.AssertionError|actual array was null", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])|java.lang.AssertionError|actual array was null", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public com.skynav.ttv.util.Base64()|com.skynav.ttv.util.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.35,
        "sf_complexity_necf" : 25.0,
        "calledClasses_ckjm_ext_ca_max" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6,
        "jmh_thrpt_score_sum" : 87155.40977196404,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 0.8571428571428571,
        "sf_complexity_covered" : 25.0,
        "sf_line_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 67.66666666666667,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 8.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 11.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 6.0,
        "entryClass_ckjm_ext_loc" : 414.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 87155.40977196411,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 58.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 67.6666666666667,
        "calledClasses_ckjm_ext_cbo_mean" : 0.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 6.0,
        "calledClasses_ckjm_ext_rfc_sum" : 8.0,
        "sf_instruction_necf" : 313.0,
        "calledClasses_ckjm_ext_npm_sum" : 5.0,
        "calledClasses_ckjm_ext_loc_geomean" : 413.99999999999994,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 11.0,
        "calledClasses_ckjm_ext_loc_min" : 414.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 313.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 7.999999999999998,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 58.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 0.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 6.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3499999999999999,
        "sf_line_leanmetric" : 58.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.35,
        "calledClasses_ckjm_ext_lcom_sum" : 11.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 11.000000000000002,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 0.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 0.0,
        "calledClasses_ckjm_ext_loc_sum" : 414.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.35,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6,
        "entryClass_ckjm_ext_amc" : 67.66666666666667,
        "sf_method_sf" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 67.66666666666667,
        "calledClasses_ckjm_ext_npm_max" : 5.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 0.0,
        "calledClasses_ckjm_ext_ca_sum" : 0.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.0,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.35,
        "jmh_thrpt_score_quadmean" : 87155.40977196404,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 25.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 11.0,
        "sf_line_total" : 58.0,
        "entryClass_ckjm_ext_lcom" : 11.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 313.0,
        "sf_line_sf" : 0.0,
        "hashCodeCloneCountGlobal" : 2.0,
        "luceneScore" : 6.847513675689697,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 5.0,
        "sf_instruction_covered" : 313.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 8.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.6,
        "entryClass_ckjm_ext_lcom3" : 0.6,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 0.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 0.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 0.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 414.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 313.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 5.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_max" : 67.66666666666667,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 0.0,
        "calledClasses_ckjm_ext_lcom_min" : 11.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 5.0,
        "fs_unique" : 0.8571428571428571,
        "calledClasses_ckjm_ext_amc_quadmean" : 67.66666666666667,
        "jmh_thrpt_score_mean" : 87155.40977196404,
        "sf_line_missed" : 0.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 0.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 25.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 0.0,
        "sf_line_leanness" : 1.0,
        "calledUncalledMethodRatio" : 1.0,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 0.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 414.0,
        "calledClasses_ckjm_ext_wmc_mean" : 6.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 2.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.35,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.6,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.35,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 5.0,
        "sf_line_nf" : 58.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 0.0,
        "sf_method_covered" : 5.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.6,
        "sf_complexity_leanness" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 5.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 25.0,
        "noCalledMethods" : 6.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.0,
        "calledClasses_ckjm_ext_npm_min" : 5.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 1.0,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 1.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.6,
        "calledClasses_ckjm_ext_wmc_max" : 6.0,
        "calledClasses_ckjm_ext_rfc_mean" : 8.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 0.0,
        "sf_method_nf" : 5.0,
        "calledClasses_ckjm_ext_npm_geomean" : 4.999999999999999,
        "calledClasses_ckjm_ext_amc_min" : 67.66666666666667,
        "calledClasses_ckjm_ext_wmc_sum" : 6.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 8.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 414.0,
        "calledClasses_ckjm_ext_ca_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 5.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 8.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 87155.40977196404,
        "entryClass_ckjm_ext_wmc" : 6.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 3.0,
        "SINGLE_SMOOP_po" : 2.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.skynav.ttv.util.Base64",
      "uri" : "com.skynav.ttt:ttt-ttv:2.0"
    }, {
      "id" : "dff5b754-3da8-4a9c-94da-4904cad029c9",
      "groupId" : "org.objectweb.jonas",
      "artifactId" : "jonas-commons",
      "version" : "5.0-M1",
      "name" : "Base64",
      "packagename" : "org.objectweb.jonas.common.encoding",
      "score" : 6.8252535,
      "hash" : "3402632f9ca154fa2d8b9b9639fbfd3f",
      "content" : "/**\n * Base64 - encode/decode data using the Base64 encoding scheme\n * Copyright (c) 1998 by Kevin Kelley\n * Contact: Kevin Kelley <kelley@ruralnet.net>\n * 30718 Rd. 28, La Junta, CO, 81050  USA.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or 1any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307\n * USA\n *\n */\n\npackage org.objectweb.jonas.common.encoding;\n\n/**\n *   Provides encoding of raw bytes to base64-encoded characters, and\n *  decoding of base64 characters to raw bytes.\n *\n * @author Kevin Kelley (kelley@ruralnet.net)\n * @version 1.3\n * @date 06 August 1998\n * @modified 14 February 2000\n * @modified 22 September 2000\n */\npublic class Base64 {\n\n    /**\n     * code characters for values 0..63\n     */\n    private static char[] alphabet =\n        \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"\n        .toCharArray();\n\n    /**\n     * lookup table for converting base64 characters to value in range 0..63\n     */\n    private static byte[] codes = new byte[256];\n\n    static {\n        for (int i = 0; i < 256; i++) {\n            codes[i] = -1;\n        }\n        for (int i = 'A'; i <= 'Z'; i++) {\n            codes[i] = (byte) (i - 'A');\n        }\n        for (int i = 'a'; i <= 'z'; i++) {\n            codes[i] = (byte) (26 + i - 'a');\n        }\n        for (int i = '0'; i <= '9'; i++) {\n            codes[i] = (byte) (52 + i - '0');\n        }\n        codes['+'] = 62;\n        codes['/'] = 63;\n    }\n\n\n\n    /**\n     * returns an array of base64-encoded characters to represent the\n     * passed data array.\n     *\n     * @param data the array of bytes to encode\n     * @return base64-coded character array.\n     */\n    public static char[] encode(byte[] data) {\n        char[] out = new char[((data.length + 2) / 3) * 4];\n\n        //\n        // 3 bytes encode to 4 chars.  Output is always an even\n        // multiple of 4 characters.\n        //\n        for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {\n            boolean quad = false;\n            boolean trip = false;\n\n            int val = (0xFF & (int) data[i]);\n            val <<= 8;\n            if ((i + 1) < data.length) {\n                val |= (0xFF & (int) data[i + 1]);\n                trip = true;\n            }\n            val <<= 8;\n            if ((i + 2) < data.length) {\n                val |= (0xFF & (int) data[i + 2]);\n                quad = true;\n            }\n            out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 1] = alphabet[val & 0x3F];\n            val >>= 6;\n            out[index + 0] = alphabet[val & 0x3F];\n        }\n        return out;\n    }\n\n    /**\n     * Decodes a BASE-64 encoded stream to recover the original\n     * data. White space before and after will be trimmed away,\n     * but no other manipulation of the input will be performed.\n     *\n     * As of version 1.2 this method will properly handle input\n     * containing junk characters (newlines and the like) rather\n     * than throwing an error. It does this by pre-parsing the\n     * input and generating from that a count of VALID input\n     * characters.\n     * @param data BASE-64 encoded stream\n     * @return original data\n     **/\n    public static byte[] decode(char[] data) {\n        // as our input could contain non-BASE64 data (newlines,\n        // whitespace of any sort, whatever) we must first adjust\n        // our count of USABLE data so that...\n        // (a) we don't misallocate the output array, and\n        // (b) think that we miscalculated our data length\n        //     just because of extraneous throw-away junk\n\n        int tempLen = data.length;\n        for (int ix = 0; ix < data.length; ix++) {\n            if ((data[ix] > 255) || codes[ data[ix] ] < 0) {\n                --tempLen;  // ignore non-valid chars and padding\n            }\n        }\n        // calculate required length:\n        //  -- 3 bytes for every 4 valid base64 chars\n        //  -- plus 2 bytes if there are 3 extra base64 chars,\n        //     or plus 1 byte if there are 2 extra.\n\n        int len = (tempLen / 4) * 3;\n        if ((tempLen % 4) == 3) {\n            len += 2;\n        }\n        if ((tempLen % 4) == 2) {\n            len += 1;\n        }\n\n        byte[] out = new byte[len];\n\n\n\n        int shift = 0;   // # of excess bits stored in accum\n        int accum = 0;   // excess bits\n        int index = 0;\n\n        // we now go through the entire array (NOT using the 'tempLen' value)\n        for (int ix = 0; ix < data.length; ix++) {\n            int value = (data[ix] > 255) ? -1 : codes[ data[ix] ];\n\n            if (value >= 0) {           // skip over non-code\n                accum <<= 6;            // bits shift up by 6 each time thru\n                shift += 6;             // loop, with new bits being put in\n                accum |= value;         // at the bottom.\n                if (shift >= 8) {       // whenever there are 8 or more shifted in,\n                    shift -= 8;         // write them out (from the top, leaving any\n                    out[index++] =      // excess at the bottom for next iteration.\n                        (byte) ((accum >> shift) & 0xff);\n                }\n            }\n            // we will also have skipped processing a padding null byte ('=') here;\n            // these are used ONLY for padding to an even length and do not legally\n            // occur as encoded data. for this reason we can ignore the fact that\n            // no index++ operation occurs in that special case: the out[] array is\n            // initialized to all-zero bytes to start with and that works to our\n            // advantage in this combination.\n        }\n\n        // if there is STILL something wrong we just have to throw up now!\n        if (index != out.length) {\n            throw new Error(\"Miscalculated data length (wrote \" + index + \" instead of \" + out.length + \")\");\n        }\n\n        return out;\n    }\n\n\n\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 76,
          "lineEnd" : 107,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 122,
          "lineEnd" : 185,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 76,
        "lineEnd" : 107,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 122,
        "lineEnd" : 185,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "JOnAS :: Libraries :: Commons",
        "description" : null,
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "91fb07b3-7934-4a58-a9a7-dc32191f951e" ],
        "_version_" : [ 1521883745593851904 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "org.objectweb.jonas:bootstrap:5.0-M1", "org.objectweb.jonas:jonas-version:5.0-M1", "org.objectweb.jonas:jonas-services-api:5.0-M1", "org.objectweb.jonas:jonas-deployment-api:5.0-M1", "geronimo-spec:geronimo-spec-jms:1.1-rc4", "org.objectweb.monolog:monolog-api:2.1.8", "org.objectweb.monolog:monolog-core:2.1.8", "org.objectweb.monolog:monolog-wrapper-p6spy:2.1.8", "geronimo-spec:geronimo-spec-j2ee-jacc:1.0-rc4", "xerces:xercesImpl:2.7.1" ] ],
        "method" : [ [ "false|public static char[] org.objectweb.jonas.common.encoding.Base64.encode(byte[])|org.objectweb.jonas.common.encoding.Base64.encode([B)[C|[0]", "false|public static byte[] org.objectweb.jonas.common.encoding.Base64.decode(char[])|org.objectweb.jonas.common.encoding.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public org.objectweb.jonas.common.encoding.Base64()|org.objectweb.jonas.common.encoding.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.3333333333333333,
        "sf_complexity_necf" : 18.0,
        "calledClasses_ckjm_ext_ca_max" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6666666666666666,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 18.0,
        "sf_line_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 83.25,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 11.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 2.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 4.0,
        "entryClass_ckjm_ext_loc" : 339.0,
        "sf_method_error_prop" : 0.0,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 47.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 83.24999999999999,
        "calledClasses_ckjm_ext_cbo_mean" : 0.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 4.0,
        "calledClasses_ckjm_ext_rfc_sum" : 11.0,
        "sf_instruction_necf" : 261.0,
        "calledClasses_ckjm_ext_npm_sum" : 3.0,
        "calledClasses_ckjm_ext_loc_geomean" : 338.9999999999999,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 2.0,
        "calledClasses_ckjm_ext_loc_min" : 339.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 261.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 11.000000000000002,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 47.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 0.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 4.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3333333333333333,
        "sf_line_leanmetric" : 47.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom_sum" : 2.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 2.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 0.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 0.0,
        "calledClasses_ckjm_ext_loc_sum" : 339.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6666666666666666,
        "entryClass_ckjm_ext_amc" : 83.25,
        "sf_method_sf" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 83.25,
        "calledClasses_ckjm_ext_npm_max" : 3.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 0.0,
        "calledClasses_ckjm_ext_ca_sum" : 0.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.0,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.3333333333333333,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 18.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 2.0,
        "sf_line_total" : 47.0,
        "entryClass_ckjm_ext_lcom" : 2.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_line_sf" : 0.0,
        "sf_instruction_nf" : 261.0,
        "hashCodeCloneCountGlobal" : 1.0,
        "luceneScore" : 6.825253486633301,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 3.0,
        "sf_instruction_covered" : 261.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 11.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.6666666666666666,
        "entryClass_ckjm_ext_lcom3" : 0.6666666666666666,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 0.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 0.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 0.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 339.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 261.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_max" : 83.25,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 0.0,
        "calledClasses_ckjm_ext_lcom_min" : 2.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 83.25,
        "sf_line_missed" : 0.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 0.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 18.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 0.0,
        "sf_line_leanness" : 1.0,
        "calledUncalledMethodRatio" : 1.0,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 0.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 339.0,
        "calledClasses_ckjm_ext_wmc_mean" : 4.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 1.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.6666666666666666,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 3.0,
        "sf_line_nf" : 47.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 0.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.6666666666666666,
        "sf_complexity_leanness" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 3.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 18.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.0,
        "calledClasses_ckjm_ext_npm_min" : 3.0,
        "sf_instruction_leanness" : 1.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 1.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.6666666666666666,
        "calledClasses_ckjm_ext_wmc_max" : 4.0,
        "calledClasses_ckjm_ext_rfc_mean" : 11.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 0.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_amc_min" : 83.25,
        "calledClasses_ckjm_ext_wmc_sum" : 4.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 11.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 339.0,
        "calledClasses_ckjm_ext_ca_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 3.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 11.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 10.0,
        "entryClass_ckjm_ext_wmc" : 4.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 6.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.objectweb.jonas.common.encoding.Base64",
      "uri" : "org.objectweb.jonas:jonas-commons:5.0-M1"
    }, {
      "id" : "6dfcfe97-4b69-4649-bf8e-b4f80aeb8215",
      "groupId" : "org.jvnet.hudson",
      "artifactId" : "trilead-ssh2",
      "version" : "build212-hudson-6",
      "name" : "Base64",
      "packagename" : "com.trilead.ssh2.crypto",
      "score" : 6.8252535,
      "hash" : "e17382fd7c3c33744d1cf22791e9d506",
      "content" : "\npackage com.trilead.ssh2.crypto;\n\nimport java.io.CharArrayWriter;\nimport java.io.IOException;\n\n/**\n * Basic Base64 Support.\n * \n * @author Christian Plattner, plattner@trilead.com\n * @version $Id: Base64.java,v 1.1 2007/10/15 12:49:56 cplattne Exp $\n */\npublic class Base64\n{\n\tstatic final char[] alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".toCharArray();\n\t\n\tpublic static char[] encode(byte[] content)\n\t{\n\t\tCharArrayWriter cw = new CharArrayWriter((4 * content.length) / 3);\n\n\t\tint idx = 0;\n\t\t\t\t\t\n\t\tint x = 0;\n\n\t\tfor (int i = 0; i < content.length; i++)\n\t\t{\n\t\t\tif (idx == 0)\n\t\t\t\tx = (content[i] & 0xff) << 16;\n\t\t\telse if (idx == 1)\n\t\t\t\tx = x | ((content[i] & 0xff) << 8);\n\t\t\telse\n\t\t\t\tx = x | (content[i] & 0xff);\n\n\t\t\tidx++;\n\n\t\t\tif (idx == 3)\n\t\t\t{\n\t\t\t\tcw.write(alphabet[x >> 18]);\n\t\t\t\tcw.write(alphabet[(x >> 12) & 0x3f]);\n\t\t\t\tcw.write(alphabet[(x >> 6) & 0x3f]);\n\t\t\t\tcw.write(alphabet[x & 0x3f]);\n\n\t\t\t\tidx = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (idx == 1)\n\t\t{\n\t\t\tcw.write(alphabet[x >> 18]);\n\t\t\tcw.write(alphabet[(x >> 12) & 0x3f]);\n\t\t\tcw.write('=');\n\t\t\tcw.write('=');\n\t\t}\n\n\t\tif (idx == 2)\n\t\t{\n\t\t\tcw.write(alphabet[x >> 18]);\n\t\t\tcw.write(alphabet[(x >> 12) & 0x3f]);\n\t\t\tcw.write(alphabet[(x >> 6) & 0x3f]);\n\t\t\tcw.write('=');\n\t\t}\n\n\t\treturn cw.toCharArray();\n\t}\n\n\tpublic static byte[] decode(char[] message) throws IOException\n\t{\n\t\tbyte buff[] = new byte[4];\n\t\tbyte dest[] = new byte[message.length];\n\n\t\tint bpos = 0;\n\t\tint destpos = 0;\n\n\t\tfor (int i = 0; i < message.length; i++)\n\t\t{\n\t\t\tint c = message[i];\n\n\t\t\tif ((c == '\\n') || (c == '\\r') || (c == ' ') || (c == '\\t'))\n\t\t\t\tcontinue;\n\n\t\t\tif ((c >= 'A') && (c <= 'Z'))\n\t\t\t{\n\t\t\t\tbuff[bpos++] = (byte) (c - 'A');\n\t\t\t}\n\t\t\telse if ((c >= 'a') && (c <= 'z'))\n\t\t\t{\n\t\t\t\tbuff[bpos++] = (byte) ((c - 'a') + 26);\n\t\t\t}\n\t\t\telse if ((c >= '0') && (c <= '9'))\n\t\t\t{\n\t\t\t\tbuff[bpos++] = (byte) ((c - '0') + 52);\n\t\t\t}\n\t\t\telse if (c == '+')\n\t\t\t{\n\t\t\t\tbuff[bpos++] = 62;\n\t\t\t}\n\t\t\telse if (c == '/')\n\t\t\t{\n\t\t\t\tbuff[bpos++] = 63;\n\t\t\t}\n\t\t\telse if (c == '=')\n\t\t\t{\n\t\t\t\tbuff[bpos++] = 64;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow new IOException(\"Illegal char in base64 code.\");\n\t\t\t}\n\n\t\t\tif (bpos == 4)\n\t\t\t{\n\t\t\t\tbpos = 0;\n\n\t\t\t\tif (buff[0] == 64)\n\t\t\t\t\tbreak;\n\n\t\t\t\tif (buff[1] == 64)\n\t\t\t\t\tthrow new IOException(\"Unexpected '=' in base64 code.\");\n\n\t\t\t\tif (buff[2] == 64)\n\t\t\t\t{\n\t\t\t\t\tint v = (((buff[0] & 0x3f) << 6) | ((buff[1] & 0x3f)));\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 4);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse if (buff[3] == 64)\n\t\t\t\t{\n\t\t\t\t\tint v = (((buff[0] & 0x3f) << 12) | ((buff[1] & 0x3f) << 6) | ((buff[2] & 0x3f)));\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 10);\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 2);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tint v = (((buff[0] & 0x3f) << 18) | ((buff[1] & 0x3f) << 12) | ((buff[2] & 0x3f) << 6) | ((buff[3] & 0x3f)));\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 16);\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 8);\n\t\t\t\t\tdest[destpos++] = (byte) (v);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbyte[] res = new byte[destpos];\n\t\tSystem.arraycopy(dest, 0, res, 0, destpos);\n\n\t\treturn res;\n\t}\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 17,
          "lineEnd" : 64,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 66,
          "lineEnd" : 147,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 17,
        "lineEnd" : 64,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 66,
        "lineEnd" : 147,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "Ganymed SSH2 for Java",
        "description" : "Ganymed SSH2 for Java is a library which implements the SSH-2 protocol in pure Java",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : false
      },
      "values" : {
        "id" : [ "0569738b-fea9-49d0-9400-46afe32330bc" ],
        "_version_" : [ 1521883930285834240 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] com.trilead.ssh2.crypto.Base64.encode(byte[])|com.trilead.ssh2.crypto.Base64.encode([B)[C|[0]", "false|public static byte[] com.trilead.ssh2.crypto.Base64.decode(char[]) throws java.io.IOException|com.trilead.ssh2.crypto.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public com.trilead.ssh2.crypto.Base64()|com.trilead.ssh2.crypto.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.3333333333333333,
        "sf_complexity_necf" : 28.0,
        "calledClasses_ckjm_ext_ca_max" : 3.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6666666666666666,
        "jmh_thrpt_score_sum" : 204754.73542760377,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 28.0,
        "sf_line_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 108.0,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 11.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 4.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 4.0,
        "entryClass_ckjm_ext_loc" : 437.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 204754.7354276038,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 71.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 108.00000000000003,
        "calledClasses_ckjm_ext_cbo_mean" : 3.0,
        "entryClass_ckjm_ext_dam" : 0.0,
        "calledClasses_ckjm_ext_wmc_min" : 4.0,
        "calledClasses_ckjm_ext_rfc_sum" : 11.0,
        "sf_instruction_necf" : 428.0,
        "calledClasses_ckjm_ext_npm_sum" : 3.0,
        "calledClasses_ckjm_ext_loc_geomean" : 436.9999999999999,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 4.0,
        "calledClasses_ckjm_ext_loc_min" : 437.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 428.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 11.000000000000002,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 71.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 0.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 4.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3333333333333333,
        "sf_line_leanmetric" : 71.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom_sum" : 4.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 4.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 0.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 3.0,
        "calledClasses_ckjm_ext_loc_sum" : 437.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6666666666666666,
        "entryClass_ckjm_ext_amc" : 108.0,
        "sf_method_sf" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 0.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 108.0,
        "calledClasses_ckjm_ext_npm_max" : 3.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 3.0,
        "calledClasses_ckjm_ext_ca_sum" : 3.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.0,
        "calledClasses_ckjm_ext_dam_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.3333333333333333,
        "jmh_thrpt_score_quadmean" : 204754.73542760377,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 28.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 4.0,
        "sf_line_total" : 71.0,
        "entryClass_ckjm_ext_lcom" : 4.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 428.0,
        "sf_line_sf" : 0.0,
        "hashCodeCloneCountGlobal" : 12.0,
        "luceneScore" : 6.825253486633301,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 0.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 3.0,
        "sf_instruction_covered" : 428.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 11.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.6666666666666666,
        "entryClass_ckjm_ext_lcom3" : 0.6666666666666666,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 3.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_dam_sum" : 0.0,
        "sf_complexity_missed" : 0.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 437.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 428.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 3.0,
        "calledClasses_ckjm_ext_amc_max" : 108.0,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 3.0,
        "calledClasses_ckjm_ext_lcom_min" : 4.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 108.0,
        "jmh_thrpt_score_mean" : 204754.73542760377,
        "sf_line_missed" : 0.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 3.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 28.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 3.0,
        "sf_line_leanness" : 1.0,
        "calledUncalledMethodRatio" : 1.0,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 0.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 437.0,
        "calledClasses_ckjm_ext_wmc_mean" : 4.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 5.0,
        "calledClasses_ckjm_ext_dam_max" : 0.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.6666666666666666,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 3.0,
        "sf_line_nf" : 71.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 0.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.6666666666666666,
        "sf_complexity_leanness" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 3.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 28.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 0.0,
        "sf_complexity_balance" : 0.0,
        "calledClasses_ckjm_ext_npm_min" : 3.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 1.0,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 1.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.6666666666666666,
        "calledClasses_ckjm_ext_wmc_max" : 4.0,
        "calledClasses_ckjm_ext_rfc_mean" : 11.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 0.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_amc_min" : 108.0,
        "calledClasses_ckjm_ext_wmc_sum" : 4.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 11.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 437.0,
        "calledClasses_ckjm_ext_ca_mean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 3.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 11.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 204754.73542760377,
        "entryClass_ckjm_ext_wmc" : 4.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 7.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.trilead.ssh2.crypto.Base64",
      "uri" : "org.jvnet.hudson:trilead-ssh2:build212-hudson-6"
    }, {
      "id" : "91957617-81b2-4b7c-a7a1-12dfee7fa703",
      "groupId" : "ch.ethz.ganymed",
      "artifactId" : "ganymed-ssh2",
      "version" : "262",
      "name" : "Base64",
      "packagename" : "ch.ethz.ssh2.crypto",
      "score" : 6.8252535,
      "hash" : "1d82e5684511eba0b056fae7a986eed2",
      "content" : "/*\n * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.\n * Please refer to the LICENSE.txt for licensing details.\n */\npackage ch.ethz.ssh2.crypto;\n\nimport java.io.CharArrayWriter;\nimport java.io.IOException;\n\n/**\n * Basic Base64 Support.\n * \n * @author Christian Plattner\n * @version 2.50, 03/15/10\n */\npublic class Base64\n{\n\tstatic final char[] alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".toCharArray();\n\t\n\tpublic static char[] encode(byte[] content)\n\t{\n\t\tCharArrayWriter cw = new CharArrayWriter((4 * content.length) / 3);\n\n\t\tint idx = 0;\n\t\t\t\t\t\n\t\tint x = 0;\n\n\t\tfor (int i = 0; i < content.length; i++)\n\t\t{\n\t\t\tif (idx == 0)\n\t\t\t\tx = (content[i] & 0xff) << 16;\n\t\t\telse if (idx == 1)\n\t\t\t\tx = x | ((content[i] & 0xff) << 8);\n\t\t\telse\n\t\t\t\tx = x | (content[i] & 0xff);\n\n\t\t\tidx++;\n\n\t\t\tif (idx == 3)\n\t\t\t{\n\t\t\t\tcw.write(alphabet[x >> 18]);\n\t\t\t\tcw.write(alphabet[(x >> 12) & 0x3f]);\n\t\t\t\tcw.write(alphabet[(x >> 6) & 0x3f]);\n\t\t\t\tcw.write(alphabet[x & 0x3f]);\n\n\t\t\t\tidx = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (idx == 1)\n\t\t{\n\t\t\tcw.write(alphabet[x >> 18]);\n\t\t\tcw.write(alphabet[(x >> 12) & 0x3f]);\n\t\t\tcw.write('=');\n\t\t\tcw.write('=');\n\t\t}\n\n\t\tif (idx == 2)\n\t\t{\n\t\t\tcw.write(alphabet[x >> 18]);\n\t\t\tcw.write(alphabet[(x >> 12) & 0x3f]);\n\t\t\tcw.write(alphabet[(x >> 6) & 0x3f]);\n\t\t\tcw.write('=');\n\t\t}\n\n\t\treturn cw.toCharArray();\n\t}\n\n\tpublic static byte[] decode(char[] message) throws IOException\n\t{\n\t\tbyte buff[] = new byte[4];\n\t\tbyte dest[] = new byte[message.length];\n\n\t\tint bpos = 0;\n\t\tint destpos = 0;\n\n\t\tfor (int i = 0; i < message.length; i++)\n\t\t{\n\t\t\tint c = message[i];\n\n\t\t\tif ((c == '\\n') || (c == '\\r') || (c == ' ') || (c == '\\t'))\n\t\t\t\tcontinue;\n\n\t\t\tif ((c >= 'A') && (c <= 'Z'))\n\t\t\t{\n\t\t\t\tbuff[bpos++] = (byte) (c - 'A');\n\t\t\t}\n\t\t\telse if ((c >= 'a') && (c <= 'z'))\n\t\t\t{\n\t\t\t\tbuff[bpos++] = (byte) ((c - 'a') + 26);\n\t\t\t}\n\t\t\telse if ((c >= '0') && (c <= '9'))\n\t\t\t{\n\t\t\t\tbuff[bpos++] = (byte) ((c - '0') + 52);\n\t\t\t}\n\t\t\telse if (c == '+')\n\t\t\t{\n\t\t\t\tbuff[bpos++] = 62;\n\t\t\t}\n\t\t\telse if (c == '/')\n\t\t\t{\n\t\t\t\tbuff[bpos++] = 63;\n\t\t\t}\n\t\t\telse if (c == '=')\n\t\t\t{\n\t\t\t\tbuff[bpos++] = 64;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow new IOException(\"Illegal char in base64 code.\");\n\t\t\t}\n\n\t\t\tif (bpos == 4)\n\t\t\t{\n\t\t\t\tbpos = 0;\n\n\t\t\t\tif (buff[0] == 64)\n\t\t\t\t\tbreak;\n\n\t\t\t\tif (buff[1] == 64)\n\t\t\t\t\tthrow new IOException(\"Unexpected '=' in base64 code.\");\n\n\t\t\t\tif (buff[2] == 64)\n\t\t\t\t{\n\t\t\t\t\tint v = (((buff[0] & 0x3f) << 6) | ((buff[1] & 0x3f)));\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 4);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse if (buff[3] == 64)\n\t\t\t\t{\n\t\t\t\t\tint v = (((buff[0] & 0x3f) << 12) | ((buff[1] & 0x3f) << 6) | ((buff[2] & 0x3f)));\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 10);\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 2);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tint v = (((buff[0] & 0x3f) << 18) | ((buff[1] & 0x3f) << 12) | ((buff[2] & 0x3f) << 6) | ((buff[3] & 0x3f)));\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 16);\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 8);\n\t\t\t\t\tdest[destpos++] = (byte) (v);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbyte[] res = new byte[destpos];\n\t\tSystem.arraycopy(dest, 0, res, 0, destpos);\n\n\t\treturn res;\n\t}\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 20,
          "lineEnd" : 67,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 69,
          "lineEnd" : 150,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 20,
        "lineEnd" : 67,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 69,
        "lineEnd" : 150,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "ganymed-ssh-2",
        "description" : "Ganymed SSH-2: Java based SSH-2 Protocol Implementation",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "b64982bd-485a-43e3-8d25-bcf315ad1eb5" ],
        "_version_" : [ 1521884075617419264 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] ch.ethz.ssh2.crypto.Base64.encode(byte[])|ch.ethz.ssh2.crypto.Base64.encode([B)[C|[0]", "false|public static byte[] ch.ethz.ssh2.crypto.Base64.decode(char[]) throws java.io.IOException|ch.ethz.ssh2.crypto.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public ch.ethz.ssh2.crypto.Base64()|ch.ethz.ssh2.crypto.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.3333333333333333,
        "sf_complexity_necf" : 28.0,
        "calledClasses_ckjm_ext_ca_max" : 3.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6666666666666666,
        "jmh_thrpt_score_sum" : 201007.93406610927,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 28.0,
        "sf_line_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 108.0,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 11.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 4.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 4.0,
        "entryClass_ckjm_ext_loc" : 437.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 201007.93406610945,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 71.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 108.00000000000003,
        "calledClasses_ckjm_ext_cbo_mean" : 3.0,
        "entryClass_ckjm_ext_dam" : 0.0,
        "calledClasses_ckjm_ext_wmc_min" : 4.0,
        "calledClasses_ckjm_ext_rfc_sum" : 11.0,
        "sf_instruction_necf" : 428.0,
        "calledClasses_ckjm_ext_npm_sum" : 3.0,
        "calledClasses_ckjm_ext_loc_geomean" : 436.9999999999999,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 4.0,
        "calledClasses_ckjm_ext_loc_min" : 437.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 428.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 11.000000000000002,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 71.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 0.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 4.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3333333333333333,
        "sf_line_leanmetric" : 71.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom_sum" : 4.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 4.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 0.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 3.0,
        "calledClasses_ckjm_ext_loc_sum" : 437.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6666666666666666,
        "entryClass_ckjm_ext_amc" : 108.0,
        "sf_method_sf" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 0.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 108.0,
        "calledClasses_ckjm_ext_npm_max" : 3.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 3.0,
        "calledClasses_ckjm_ext_ca_sum" : 3.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.0,
        "calledClasses_ckjm_ext_dam_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.3333333333333333,
        "jmh_thrpt_score_quadmean" : 201007.93406610927,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 28.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 4.0,
        "sf_line_total" : 71.0,
        "entryClass_ckjm_ext_lcom" : 4.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 428.0,
        "sf_line_sf" : 0.0,
        "hashCodeCloneCountGlobal" : 8.0,
        "luceneScore" : 6.825253486633301,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 0.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 3.0,
        "sf_instruction_covered" : 428.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 11.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.6666666666666666,
        "entryClass_ckjm_ext_lcom3" : 0.6666666666666666,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 3.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_dam_sum" : 0.0,
        "sf_complexity_missed" : 0.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 437.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 428.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 3.0,
        "calledClasses_ckjm_ext_amc_max" : 108.0,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 3.0,
        "calledClasses_ckjm_ext_lcom_min" : 4.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 108.0,
        "jmh_thrpt_score_mean" : 201007.93406610927,
        "sf_line_missed" : 0.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 3.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 28.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 3.0,
        "sf_line_leanness" : 1.0,
        "calledUncalledMethodRatio" : 1.0,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 0.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 437.0,
        "calledClasses_ckjm_ext_wmc_mean" : 4.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 2.0,
        "calledClasses_ckjm_ext_dam_max" : 0.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.6666666666666666,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 3.0,
        "sf_line_nf" : 71.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 0.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.6666666666666666,
        "sf_complexity_leanness" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 3.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 28.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 0.0,
        "sf_complexity_balance" : 0.0,
        "calledClasses_ckjm_ext_npm_min" : 3.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 1.0,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 1.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.6666666666666666,
        "calledClasses_ckjm_ext_wmc_max" : 4.0,
        "calledClasses_ckjm_ext_rfc_mean" : 11.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 0.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_amc_min" : 108.0,
        "calledClasses_ckjm_ext_wmc_sum" : 4.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 11.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 437.0,
        "calledClasses_ckjm_ext_ca_mean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 3.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 11.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 201007.93406610927,
        "entryClass_ckjm_ext_wmc" : 4.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 8.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "ch.ethz.ssh2.crypto.Base64",
      "uri" : "ch.ethz.ganymed:ganymed-ssh2:262"
    }, {
      "id" : "d6c26c67-da4c-4573-a349-7d885dfdbe03",
      "groupId" : "org.jvnet.hudson",
      "artifactId" : "ganymed-ssh2",
      "version" : "build210-hudson-1",
      "name" : "Base64",
      "packagename" : "ch.ethz.ssh2.crypto",
      "score" : 6.8252535,
      "hash" : "c5f3ec41a2fd18394744dac1fa8d8e59",
      "content" : "\npackage ch.ethz.ssh2.crypto;\n\nimport java.io.CharArrayWriter;\nimport java.io.IOException;\n\n/**\n * Basic Base64 Support.\n * \n * @author Christian Plattner, plattner@inf.ethz.ch\n * @version $Id: Base64.java,v 1.4 2005/08/11 12:47:31 cplattne Exp $\n */\npublic class Base64\n{\n\tstatic final char[] alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".toCharArray();\n\t\n\tpublic static char[] encode(byte[] content)\n\t{\n\t\tCharArrayWriter cw = new CharArrayWriter((4 * content.length) / 3);\n\n\t\tint idx = 0;\n\t\t\t\t\t\n\t\tint x = 0;\n\n\t\tfor (int i = 0; i < content.length; i++)\n\t\t{\n\t\t\tif (idx == 0)\n\t\t\t\tx = (content[i] & 0xff) << 16;\n\t\t\telse if (idx == 1)\n\t\t\t\tx = x | ((content[i] & 0xff) << 8);\n\t\t\telse\n\t\t\t\tx = x | (content[i] & 0xff);\n\n\t\t\tidx++;\n\n\t\t\tif (idx == 3)\n\t\t\t{\n\t\t\t\tcw.write(alphabet[x >> 18]);\n\t\t\t\tcw.write(alphabet[(x >> 12) & 0x3f]);\n\t\t\t\tcw.write(alphabet[(x >> 6) & 0x3f]);\n\t\t\t\tcw.write(alphabet[x & 0x3f]);\n\n\t\t\t\tidx = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (idx == 1)\n\t\t{\n\t\t\tcw.write(alphabet[x >> 18]);\n\t\t\tcw.write(alphabet[(x >> 12) & 0x3f]);\n\t\t\tcw.write('=');\n\t\t\tcw.write('=');\n\t\t}\n\n\t\tif (idx == 2)\n\t\t{\n\t\t\tcw.write(alphabet[x >> 18]);\n\t\t\tcw.write(alphabet[(x >> 12) & 0x3f]);\n\t\t\tcw.write(alphabet[(x >> 6) & 0x3f]);\n\t\t\tcw.write('=');\n\t\t}\n\n\t\treturn cw.toCharArray();\n\t}\n\n\tpublic static byte[] decode(char[] message) throws IOException\n\t{\n\t\tbyte buff[] = new byte[4];\n\t\tbyte dest[] = new byte[message.length];\n\n\t\tint bpos = 0;\n\t\tint destpos = 0;\n\n\t\tfor (int i = 0; i < message.length; i++)\n\t\t{\n\t\t\tint c = message[i];\n\n\t\t\tif ((c == '\\n') || (c == '\\r') || (c == ' ') || (c == '\\t'))\n\t\t\t\tcontinue;\n\n\t\t\tif ((c >= 'A') && (c <= 'Z'))\n\t\t\t{\n\t\t\t\tbuff[bpos++] = (byte) (c - 'A');\n\t\t\t}\n\t\t\telse if ((c >= 'a') && (c <= 'z'))\n\t\t\t{\n\t\t\t\tbuff[bpos++] = (byte) ((c - 'a') + 26);\n\t\t\t}\n\t\t\telse if ((c >= '0') && (c <= '9'))\n\t\t\t{\n\t\t\t\tbuff[bpos++] = (byte) ((c - '0') + 52);\n\t\t\t}\n\t\t\telse if (c == '+')\n\t\t\t{\n\t\t\t\tbuff[bpos++] = 62;\n\t\t\t}\n\t\t\telse if (c == '/')\n\t\t\t{\n\t\t\t\tbuff[bpos++] = 63;\n\t\t\t}\n\t\t\telse if (c == '=')\n\t\t\t{\n\t\t\t\tbuff[bpos++] = 64;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow new IOException(\"Illegal char in base64 code.\");\n\t\t\t}\n\n\t\t\tif (bpos == 4)\n\t\t\t{\n\t\t\t\tbpos = 0;\n\n\t\t\t\tif (buff[0] == 64)\n\t\t\t\t\tbreak;\n\n\t\t\t\tif (buff[1] == 64)\n\t\t\t\t\tthrow new IOException(\"Unexpected '=' in base64 code.\");\n\n\t\t\t\tif (buff[2] == 64)\n\t\t\t\t{\n\t\t\t\t\tint v = (((buff[0] & 0x3f) << 6) | ((buff[1] & 0x3f)));\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 4);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse if (buff[3] == 64)\n\t\t\t\t{\n\t\t\t\t\tint v = (((buff[0] & 0x3f) << 12) | ((buff[1] & 0x3f) << 6) | ((buff[2] & 0x3f)));\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 10);\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 2);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tint v = (((buff[0] & 0x3f) << 18) | ((buff[1] & 0x3f) << 12) | ((buff[2] & 0x3f) << 6) | ((buff[3] & 0x3f)));\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 16);\n\t\t\t\t\tdest[destpos++] = (byte) (v >> 8);\n\t\t\t\t\tdest[destpos++] = (byte) (v);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbyte[] res = new byte[destpos];\n\t\tSystem.arraycopy(dest, 0, res, 0, destpos);\n\n\t\treturn res;\n\t}\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 17,
          "lineEnd" : 64,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 66,
          "lineEnd" : 147,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 17,
        "lineEnd" : 64,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 66,
        "lineEnd" : 147,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "Ganymed SSH2 for Java",
        "description" : "Ganymed SSH2 for Java is a library which implements the SSH-2 protocol in pure Java",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : false
      },
      "values" : {
        "id" : [ "91d4a55a-65f6-47f0-a870-677dc9557e73" ],
        "_version_" : [ 1521884029061693440 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] ch.ethz.ssh2.crypto.Base64.encode(byte[])|ch.ethz.ssh2.crypto.Base64.encode([B)[C|[0]", "false|public static byte[] ch.ethz.ssh2.crypto.Base64.decode(char[]) throws java.io.IOException|ch.ethz.ssh2.crypto.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public ch.ethz.ssh2.crypto.Base64()|ch.ethz.ssh2.crypto.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.3333333333333333,
        "sf_complexity_necf" : 28.0,
        "calledClasses_ckjm_ext_ca_max" : 3.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6666666666666666,
        "jmh_thrpt_score_sum" : 198497.60981769377,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 28.0,
        "sf_line_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 108.0,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 11.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 4.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 4.0,
        "entryClass_ckjm_ext_loc" : 437.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 198497.60981769382,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 71.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 108.00000000000003,
        "calledClasses_ckjm_ext_cbo_mean" : 3.0,
        "entryClass_ckjm_ext_dam" : 0.0,
        "calledClasses_ckjm_ext_wmc_min" : 4.0,
        "calledClasses_ckjm_ext_rfc_sum" : 11.0,
        "sf_instruction_necf" : 428.0,
        "calledClasses_ckjm_ext_npm_sum" : 3.0,
        "calledClasses_ckjm_ext_loc_geomean" : 436.9999999999999,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 4.0,
        "calledClasses_ckjm_ext_loc_min" : 437.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 428.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 11.000000000000002,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 71.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 0.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 4.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3333333333333333,
        "sf_line_leanmetric" : 71.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom_sum" : 4.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 4.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 0.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 3.0,
        "calledClasses_ckjm_ext_loc_sum" : 437.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6666666666666666,
        "entryClass_ckjm_ext_amc" : 108.0,
        "sf_method_sf" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 0.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 108.0,
        "calledClasses_ckjm_ext_npm_max" : 3.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 3.0,
        "calledClasses_ckjm_ext_ca_sum" : 3.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.0,
        "calledClasses_ckjm_ext_dam_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.3333333333333333,
        "jmh_thrpt_score_quadmean" : 198497.60981769377,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 28.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 4.0,
        "sf_line_total" : 71.0,
        "entryClass_ckjm_ext_lcom" : 4.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 428.0,
        "sf_line_sf" : 0.0,
        "hashCodeCloneCountGlobal" : 3.0,
        "luceneScore" : 6.825253486633301,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 0.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 3.0,
        "sf_instruction_covered" : 428.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 11.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.6666666666666666,
        "entryClass_ckjm_ext_lcom3" : 0.6666666666666666,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 3.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_dam_sum" : 0.0,
        "sf_complexity_missed" : 0.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 437.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 428.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 3.0,
        "calledClasses_ckjm_ext_amc_max" : 108.0,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 3.0,
        "calledClasses_ckjm_ext_lcom_min" : 4.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 108.0,
        "jmh_thrpt_score_mean" : 198497.60981769377,
        "sf_line_missed" : 0.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 3.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 28.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 3.0,
        "sf_line_leanness" : 1.0,
        "calledUncalledMethodRatio" : 1.0,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 0.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 437.0,
        "calledClasses_ckjm_ext_wmc_mean" : 4.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 1.0,
        "calledClasses_ckjm_ext_dam_max" : 0.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.6666666666666666,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 3.0,
        "sf_line_nf" : 71.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 0.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.6666666666666666,
        "sf_complexity_leanness" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 3.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 28.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 0.0,
        "sf_complexity_balance" : 0.0,
        "calledClasses_ckjm_ext_npm_min" : 3.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 1.0,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 1.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.6666666666666666,
        "calledClasses_ckjm_ext_wmc_max" : 4.0,
        "calledClasses_ckjm_ext_rfc_mean" : 11.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 0.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_amc_min" : 108.0,
        "calledClasses_ckjm_ext_wmc_sum" : 4.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 11.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 437.0,
        "calledClasses_ckjm_ext_ca_mean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 3.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 11.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 198497.60981769377,
        "entryClass_ckjm_ext_wmc" : 4.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 9.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "ch.ethz.ssh2.crypto.Base64",
      "uri" : "org.jvnet.hudson:ganymed-ssh2:build210-hudson-1"
    }, {
      "id" : "ffe33146-774d-4836-947c-3c5eab854b40",
      "groupId" : "org.ow2.util",
      "artifactId" : "util-base64",
      "version" : "1.0.37",
      "name" : "Base64",
      "packagename" : "org.ow2.util.base64",
      "score" : 6.8252535,
      "hash" : "2447dbcf7381fec09363788bad39aca0",
      "content" : "/**\n * Base64 - encode/decode data using the Base64 encoding scheme\n * Copyright (c) 1998 by Kevin Kelley\n * Contact: Kevin Kelley <kelley@ruralnet.net>\n * 30718 Rd. 28, La Junta, CO, 81050  USA.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or 1any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307\n * USA\n *\n */\n\npackage org.ow2.util.base64;\n\n/**\n *   Provides encoding of raw bytes to base64-encoded characters, and\n *  decoding of base64 characters to raw bytes.\n *\n * @author Kevin Kelley (kelley@ruralnet.net)\n * @version 1.3\n * @date 06 August 1998\n * @modified 14 February 2000\n * @modified 22 September 2000\n */\npublic class Base64 {\n\n    /**\n     * code characters for values 0..63\n     */\n    private static char[] alphabet =\n        \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"\n        .toCharArray();\n\n    /**\n     * lookup table for converting base64 characters to value in range 0..63\n     */\n    private static byte[] codes = new byte[256];\n\n    static {\n        for (int i = 0; i < 256; i++) {\n            codes[i] = -1;\n        }\n        for (int i = 'A'; i <= 'Z'; i++) {\n            codes[i] = (byte) (i - 'A');\n        }\n        for (int i = 'a'; i <= 'z'; i++) {\n            codes[i] = (byte) (26 + i - 'a');\n        }\n        for (int i = '0'; i <= '9'; i++) {\n            codes[i] = (byte) (52 + i - '0');\n        }\n        codes['+'] = 62;\n        codes['/'] = 63;\n    }\n\n\n\n    /**\n     * returns an array of base64-encoded characters to represent the\n     * passed data array.\n     *\n     * @param data the array of bytes to encode\n     * @return base64-coded character array.\n     */\n    public static char[] encode(byte[] data) {\n        char[] out = new char[((data.length + 2) / 3) * 4];\n\n        //\n        // 3 bytes encode to 4 chars.  Output is always an even\n        // multiple of 4 characters.\n        //\n        for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {\n            boolean quad = false;\n            boolean trip = false;\n\n            int val = (0xFF & (int) data[i]);\n            val <<= 8;\n            if ((i + 1) < data.length) {\n                val |= (0xFF & (int) data[i + 1]);\n                trip = true;\n            }\n            val <<= 8;\n            if ((i + 2) < data.length) {\n                val |= (0xFF & (int) data[i + 2]);\n                quad = true;\n            }\n            out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 1] = alphabet[val & 0x3F];\n            val >>= 6;\n            out[index + 0] = alphabet[val & 0x3F];\n        }\n        return out;\n    }\n\n    /**\n     * Decodes a BASE-64 encoded stream to recover the original\n     * data. White space before and after will be trimmed away,\n     * but no other manipulation of the input will be performed.\n     *\n     * As of version 1.2 this method will properly handle input\n     * containing junk characters (newlines and the like) rather\n     * than throwing an error. It does this by pre-parsing the\n     * input and generating from that a count of VALID input\n     * characters.\n     * @param data BASE-64 encoded stream\n     * @return original data\n     **/\n    public static byte[] decode(char[] data) {\n        // as our input could contain non-BASE64 data (newlines,\n        // whitespace of any sort, whatever) we must first adjust\n        // our count of USABLE data so that...\n        // (a) we don't misallocate the output array, and\n        // (b) think that we miscalculated our data length\n        //     just because of extraneous throw-away junk\n\n        int tempLen = data.length;\n        for (int ix = 0; ix < data.length; ix++) {\n            if ((data[ix] > 255) || codes[ data[ix] ] < 0) {\n                --tempLen;  // ignore non-valid chars and padding\n            }\n        }\n        // calculate required length:\n        //  -- 3 bytes for every 4 valid base64 chars\n        //  -- plus 2 bytes if there are 3 extra base64 chars,\n        //     or plus 1 byte if there are 2 extra.\n\n        int len = (tempLen / 4) * 3;\n        if ((tempLen % 4) == 3) {\n            len += 2;\n        }\n        if ((tempLen % 4) == 2) {\n            len += 1;\n        }\n\n        byte[] out = new byte[len];\n\n\n\n        int shift = 0;   // # of excess bits stored in accum\n        int accum = 0;   // excess bits\n        int index = 0;\n\n        // we now go through the entire array (NOT using the 'tempLen' value)\n        for (int ix = 0; ix < data.length; ix++) {\n            int value = (data[ix] > 255) ? -1 : codes[ data[ix] ];\n\n            if (value >= 0) {           // skip over non-code\n                accum <<= 6;            // bits shift up by 6 each time thru\n                shift += 6;             // loop, with new bits being put in\n                accum |= value;         // at the bottom.\n                if (shift >= 8) {       // whenever there are 8 or more shifted in,\n                    shift -= 8;         // write them out (from the top, leaving any\n                    out[index++] =      // excess at the bottom for next iteration.\n                        (byte) ((accum >> shift) & 0xff);\n                }\n            }\n            // we will also have skipped processing a padding null byte ('=') here;\n            // these are used ONLY for padding to an even length and do not legally\n            // occur as encoded data. for this reason we can ignore the fact that\n            // no index++ operation occurs in that special case: the out[] array is\n            // initialized to all-zero bytes to start with and that works to our\n            // advantage in this combination.\n        }\n\n        // if there is STILL something wrong we just have to throw up now!\n        if (index != out.length) {\n            throw new Error(\"Miscalculated data length (wrote \" + index + \" instead of \" + out.length + \")\");\n        }\n\n        return out;\n    }\n\n\n\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 76,
          "lineEnd" : 107,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 122,
          "lineEnd" : 185,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 76,
        "lineEnd" : 107,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 122,
        "lineEnd" : 185,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "OW2 Util :: Base64",
        "description" : "Base64 implementation",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "bca62c01-9d02-42b0-9409-03e429f5b080" ],
        "_version_" : [ 1521883980766380032 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] org.ow2.util.base64.Base64.encode(byte[])|org.ow2.util.base64.Base64.encode([B)[C|[0]", "false|public static byte[] org.ow2.util.base64.Base64.decode(char[])|org.ow2.util.base64.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public org.ow2.util.base64.Base64()|org.ow2.util.base64.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.3333333333333333,
        "sf_complexity_necf" : 18.0,
        "calledClasses_ckjm_ext_ca_max" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6666666666666666,
        "jmh_thrpt_score_sum" : 226823.94473262248,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 18.0,
        "sf_line_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 83.25,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 11.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 2.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 4.0,
        "entryClass_ckjm_ext_loc" : 339.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 226823.94473262256,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 47.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 83.24999999999999,
        "calledClasses_ckjm_ext_cbo_mean" : 0.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 4.0,
        "calledClasses_ckjm_ext_rfc_sum" : 11.0,
        "sf_instruction_necf" : 261.0,
        "calledClasses_ckjm_ext_npm_sum" : 3.0,
        "calledClasses_ckjm_ext_loc_geomean" : 338.9999999999999,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 2.0,
        "calledClasses_ckjm_ext_loc_min" : 339.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 261.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 11.000000000000002,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 47.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 0.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 4.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3333333333333333,
        "sf_line_leanmetric" : 47.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom_sum" : 2.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 2.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 0.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 0.0,
        "calledClasses_ckjm_ext_loc_sum" : 339.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6666666666666666,
        "entryClass_ckjm_ext_amc" : 83.25,
        "sf_method_sf" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 83.25,
        "calledClasses_ckjm_ext_npm_max" : 3.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 0.0,
        "calledClasses_ckjm_ext_ca_sum" : 0.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.0,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.3333333333333333,
        "jmh_thrpt_score_quadmean" : 226823.94473262248,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 18.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 2.0,
        "sf_line_total" : 47.0,
        "entryClass_ckjm_ext_lcom" : 2.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 261.0,
        "sf_line_sf" : 0.0,
        "hashCodeCloneCountGlobal" : 5.0,
        "luceneScore" : 6.825253486633301,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 3.0,
        "sf_instruction_covered" : 261.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 11.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.6666666666666666,
        "entryClass_ckjm_ext_lcom3" : 0.6666666666666666,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 0.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 0.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 0.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 339.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 261.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_max" : 83.25,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 0.0,
        "calledClasses_ckjm_ext_lcom_min" : 2.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 83.25,
        "jmh_thrpt_score_mean" : 226823.94473262248,
        "sf_line_missed" : 0.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 0.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 18.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 0.0,
        "sf_line_leanness" : 1.0,
        "calledUncalledMethodRatio" : 1.0,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 0.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 339.0,
        "calledClasses_ckjm_ext_wmc_mean" : 4.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 5.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.6666666666666666,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 3.0,
        "sf_line_nf" : 47.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 0.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.6666666666666666,
        "sf_complexity_leanness" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 3.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 18.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.0,
        "calledClasses_ckjm_ext_npm_min" : 3.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 1.0,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 1.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.6666666666666666,
        "calledClasses_ckjm_ext_wmc_max" : 4.0,
        "calledClasses_ckjm_ext_rfc_mean" : 11.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 0.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_amc_min" : 83.25,
        "calledClasses_ckjm_ext_wmc_sum" : 4.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 11.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 339.0,
        "calledClasses_ckjm_ext_ca_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 3.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 11.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 226823.94473262248,
        "entryClass_ckjm_ext_wmc" : 4.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 10.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.ow2.util.base64.Base64",
      "uri" : "org.ow2.util:util-base64:1.0.37"
    }, {
      "id" : "d9458864-9e7f-4646-bf56-2a423955027a",
      "groupId" : "org.ow2.util.base64",
      "artifactId" : "base64",
      "version" : "2.0.0",
      "name" : "Base64",
      "packagename" : "org.ow2.util.base64",
      "score" : 6.8252535,
      "hash" : "a7cf473efa9baf4687ecc7ead7c15311",
      "content" : "/**\n * Copyright 2011-2012 Bull S.A.S.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage org.ow2.util.base64;\n\n/**\n *   Provides encoding of raw bytes to base64-encoded characters, and\n *  decoding of base64 characters to raw bytes.\n *\n * @author Kevin Kelley (kelley@ruralnet.net)\n * @version 1.3\n * @date 06 August 1998\n * @modified 14 February 2000\n * @modified 22 September 2000\n */\npublic class Base64 {\n\n    /**\n     * code characters for values 0..63\n     */\n    private static char[] alphabet =\n        \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"\n        .toCharArray();\n\n    /**\n     * lookup table for converting base64 characters to value in range 0..63\n     */\n    private static byte[] codes = new byte[256];\n\n    static {\n        for (int i = 0; i < 256; i++) {\n            codes[i] = -1;\n        }\n        for (int i = 'A'; i <= 'Z'; i++) {\n            codes[i] = (byte) (i - 'A');\n        }\n        for (int i = 'a'; i <= 'z'; i++) {\n            codes[i] = (byte) (26 + i - 'a');\n        }\n        for (int i = '0'; i <= '9'; i++) {\n            codes[i] = (byte) (52 + i - '0');\n        }\n        codes['+'] = 62;\n        codes['/'] = 63;\n    }\n\n\n\n    /**\n     * returns an array of base64-encoded characters to represent the\n     * passed data array.\n     *\n     * @param data the array of bytes to encode\n     * @return base64-coded character array.\n     */\n    public static char[] encode(byte[] data) {\n        char[] out = new char[((data.length + 2) / 3) * 4];\n\n        //\n        // 3 bytes encode to 4 chars.  Output is always an even\n        // multiple of 4 characters.\n        //\n        for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {\n            boolean quad = false;\n            boolean trip = false;\n\n            int val = (0xFF & (int) data[i]);\n            val <<= 8;\n            if ((i + 1) < data.length) {\n                val |= (0xFF & (int) data[i + 1]);\n                trip = true;\n            }\n            val <<= 8;\n            if ((i + 2) < data.length) {\n                val |= (0xFF & (int) data[i + 2]);\n                quad = true;\n            }\n            out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 1] = alphabet[val & 0x3F];\n            val >>= 6;\n            out[index + 0] = alphabet[val & 0x3F];\n        }\n        return out;\n    }\n\n    /**\n     * Decodes a BASE-64 encoded stream to recover the original\n     * data. White space before and after will be trimmed away,\n     * but no other manipulation of the input will be performed.\n     *\n     * As of version 1.2 this method will properly handle input\n     * containing junk characters (newlines and the like) rather\n     * than throwing an error. It does this by pre-parsing the\n     * input and generating from that a count of VALID input\n     * characters.\n     * @param data BASE-64 encoded stream\n     * @return original data\n     **/\n    public static byte[] decode(char[] data) {\n        // as our input could contain non-BASE64 data (newlines,\n        // whitespace of any sort, whatever) we must first adjust\n        // our count of USABLE data so that...\n        // (a) we don't misallocate the output array, and\n        // (b) think that we miscalculated our data length\n        //     just because of extraneous throw-away junk\n\n        int tempLen = data.length;\n        for (int ix = 0; ix < data.length; ix++) {\n            if ((data[ix] > 255) || codes[ data[ix] ] < 0) {\n                --tempLen;  // ignore non-valid chars and padding\n            }\n        }\n        // calculate required length:\n        //  -- 3 bytes for every 4 valid base64 chars\n        //  -- plus 2 bytes if there are 3 extra base64 chars,\n        //     or plus 1 byte if there are 2 extra.\n\n        int len = (tempLen / 4) * 3;\n        if ((tempLen % 4) == 3) {\n            len += 2;\n        }\n        if ((tempLen % 4) == 2) {\n            len += 1;\n        }\n\n        byte[] out = new byte[len];\n\n\n\n        int shift = 0;   // # of excess bits stored in accum\n        int accum = 0;   // excess bits\n        int index = 0;\n\n        // we now go through the entire array (NOT using the 'tempLen' value)\n        for (int ix = 0; ix < data.length; ix++) {\n            int value = (data[ix] > 255) ? -1 : codes[ data[ix] ];\n\n            if (value >= 0) {           // skip over non-code\n                accum <<= 6;            // bits shift up by 6 each time thru\n                shift += 6;             // loop, with new bits being put in\n                accum |= value;         // at the bottom.\n                if (shift >= 8) {       // whenever there are 8 or more shifted in,\n                    shift -= 8;         // write them out (from the top, leaving any\n                    out[index++] =      // excess at the bottom for next iteration.\n                        (byte) ((accum >> shift) & 0xff);\n                }\n            }\n            // we will also have skipped processing a padding null byte ('=') here;\n            // these are used ONLY for padding to an even length and do not legally\n            // occur as encoded data. for this reason we can ignore the fact that\n            // no index++ operation occurs in that special case: the out[] array is\n            // initialized to all-zero bytes to start with and that works to our\n            // advantage in this combination.\n        }\n\n        // if there is STILL something wrong we just have to throw up now!\n        if (index != out.length) {\n            throw new Error(\"Miscalculated data length (wrote \" + index + \" instead of \" + out.length + \")\");\n        }\n\n        return out;\n    }\n\n\n\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 69,
          "lineEnd" : 100,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 115,
          "lineEnd" : 178,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 69,
        "lineEnd" : 100,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 115,
        "lineEnd" : 178,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "OW2 Utilities :: Base64",
        "description" : "Base64 implementation",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "bd4b8531-472e-4949-9e86-9eb551996b40" ],
        "_version_" : [ 1521884028898115584 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] org.ow2.util.base64.Base64.encode(byte[])|org.ow2.util.base64.Base64.encode([B)[C|[0]", "false|public static byte[] org.ow2.util.base64.Base64.decode(char[])|org.ow2.util.base64.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public org.ow2.util.base64.Base64()|org.ow2.util.base64.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.3333333333333333,
        "sf_complexity_necf" : 18.0,
        "calledClasses_ckjm_ext_ca_max" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6666666666666666,
        "jmh_thrpt_score_sum" : 228280.70522361397,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 18.0,
        "sf_line_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 83.25,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 11.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 2.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 4.0,
        "entryClass_ckjm_ext_loc" : 339.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 228280.705223614,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 47.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 83.24999999999999,
        "calledClasses_ckjm_ext_cbo_mean" : 0.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 4.0,
        "calledClasses_ckjm_ext_rfc_sum" : 11.0,
        "sf_instruction_necf" : 261.0,
        "calledClasses_ckjm_ext_npm_sum" : 3.0,
        "calledClasses_ckjm_ext_loc_geomean" : 338.9999999999999,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 2.0,
        "calledClasses_ckjm_ext_loc_min" : 339.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 261.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 11.000000000000002,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 47.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 0.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 4.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3333333333333333,
        "sf_line_leanmetric" : 47.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom_sum" : 2.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 2.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 0.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 0.0,
        "calledClasses_ckjm_ext_loc_sum" : 339.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6666666666666666,
        "entryClass_ckjm_ext_amc" : 83.25,
        "sf_method_sf" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 83.25,
        "calledClasses_ckjm_ext_npm_max" : 3.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 0.0,
        "calledClasses_ckjm_ext_ca_sum" : 0.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.0,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.3333333333333333,
        "jmh_thrpt_score_quadmean" : 228280.70522361397,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 18.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 2.0,
        "sf_line_total" : 47.0,
        "entryClass_ckjm_ext_lcom" : 2.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 261.0,
        "sf_line_sf" : 0.0,
        "hashCodeCloneCountGlobal" : 1.0,
        "luceneScore" : 6.825253486633301,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 3.0,
        "sf_instruction_covered" : 261.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 11.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.6666666666666666,
        "entryClass_ckjm_ext_lcom3" : 0.6666666666666666,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 0.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 0.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 0.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 339.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 261.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_max" : 83.25,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 0.0,
        "calledClasses_ckjm_ext_lcom_min" : 2.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 83.25,
        "jmh_thrpt_score_mean" : 228280.70522361397,
        "sf_line_missed" : 0.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 0.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 18.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 0.0,
        "sf_line_leanness" : 1.0,
        "calledUncalledMethodRatio" : 1.0,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 0.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 339.0,
        "calledClasses_ckjm_ext_wmc_mean" : 4.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 1.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.6666666666666666,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 3.0,
        "sf_line_nf" : 47.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 0.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.6666666666666666,
        "sf_complexity_leanness" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 3.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 18.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.0,
        "calledClasses_ckjm_ext_npm_min" : 3.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 1.0,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 1.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.6666666666666666,
        "calledClasses_ckjm_ext_wmc_max" : 4.0,
        "calledClasses_ckjm_ext_rfc_mean" : 11.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 0.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_amc_min" : 83.25,
        "calledClasses_ckjm_ext_wmc_sum" : 4.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 11.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 339.0,
        "calledClasses_ckjm_ext_ca_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 3.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 11.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 228280.70522361397,
        "entryClass_ckjm_ext_wmc" : 4.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 11.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.ow2.util.base64.Base64",
      "uri" : "org.ow2.util.base64:base64:2.0.0"
    }, {
      "id" : "41d1fa9b-b8a9-4929-bb73-d23baea5bf38",
      "groupId" : "com.ericsson.research.trap",
      "artifactId" : "trap-utils-api",
      "version" : "1.4.1",
      "name" : "Base64",
      "packagename" : "com.ericsson.research.trap.utils",
      "score" : 6.6355453,
      "hash" : "8a412eb9a831604d18385f1a5c1b9037",
      "content" : "package com.ericsson.research.trap.utils;\n\n// %%Ignore-License\n//Copyright 2003-2010 Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland\n//www.source-code.biz, www.inventec.ch/chdh\n//\n//This module is multi-licensed and may be used under the terms\n//of any of the following licenses:\n//\n//EPL, Eclipse Public License, V1.0 or later, http://www.eclipse.org/legal\n//LGPL, GNU Lesser General Public License, V2.1 or later, http://www.gnu.org/licenses/lgpl.html\n//GPL, GNU General Public License, V2 or later, http://www.gnu.org/licenses/gpl.html\n//AL, Apache License, V2.0 or later, http://www.apache.org/licenses\n//BSD, BSD License, http://www.opensource.org/licenses/bsd-license.php\n//MIT, MIT License, http://www.opensource.org/licenses/MIT\n//\n//Please contact the author if you need another license.\n//This module is provided \"as is\", without warranties of any kind.\n\n/**\n* A Base64 encoder/decoder.\n*\n* <p>\n* This class is used to encode and decode data in Base64 format as described in RFC 1521.\n*\n* <p>\n* Project home page: <a href=\"http://www.source-code.biz/base64coder/java/\">www.source-code.biz/base64coder/java</a><br>\n* Author: Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland<br>\n* Multi-licensed: EPL / LGPL / GPL / AL / BSD / MIT.\n*/\npublic class Base64 {\n\n//The line separator string of the operating system.\nprivate static final String systemLineSeparator = System.getProperty(\"line.separator\");\n\n//Mapping table from 6-bit nibbles to Base64 characters.\nprivate static final char[] map1 = new char[64];\nstatic {\n   int i=0;\n   for (char c='A'; c<='Z'; c++) map1[i++] = c;\n   for (char c='a'; c<='z'; c++) map1[i++] = c;\n   for (char c='0'; c<='9'; c++) map1[i++] = c;\n   map1[i++] = '+'; map1[i++] = '/'; }\n\n//Mapping table from Base64 characters to 6-bit nibbles.\nprivate static final byte[] map2 = new byte[128];\nstatic {\n   for (int i=0; i<map2.length; i++) map2[i] = -1;\n   for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; }\n\n/**\n* Encodes a string into Base64 format.\n* No blanks or line breaks are inserted.\n* @param s  A String to be encoded.\n* @return   A String containing the Base64 encoded data.\n*/\npublic static String encodeString (String s) {\nreturn StringUtil.toUtfString(encode(StringUtil.toUtfBytes(s))); }\n\n/**\n* Encodes a byte array into Base 64 format and breaks the output into lines of 76 characters.\n* This method is compatible with <code>sun.misc.BASE64Encoder.encodeBuffer(byte[])</code>.\n* @param in  An array containing the data bytes to be encoded.\n* @return    A String containing the Base64 encoded data, broken into lines.\n*/\npublic static String encodeLines (byte[] in) {\nreturn encodeLines(in, 0, in.length, 76, systemLineSeparator); }\n\n/**\n* Encodes a byte array into Base 64 format and breaks the output into lines.\n* @param in            An array containing the data bytes to be encoded.\n* @param iOff          Offset of the first byte in <code>in</code> to be processed.\n* @param iLen          Number of bytes to be processed in <code>in</code>, starting at <code>iOff</code>.\n* @param lineLen       Line length for the output data. Should be a multiple of 4.\n* @param lineSeparator The line separator to be used to separate the output lines.\n* @return              A String containing the Base64 encoded data, broken into lines.\n*/\npublic static String encodeLines (byte[] in, int iOff, int iLen, int lineLen, String lineSeparator) {\nint blockLen = (lineLen*3) / 4;\nif (blockLen <= 0) throw new IllegalArgumentException();\nint lines = ((iLen+blockLen)-1) / blockLen;\nint bufLen = (((iLen+2)/3)*4) + (lines*lineSeparator.length());\nStringBuilder buf = new StringBuilder(bufLen);\nint ip = 0;\nwhile (ip < iLen) {\n   int l = Math.min(iLen-ip, blockLen);\n   buf.append (encode(in, iOff+ip, l));\n   buf.append (lineSeparator);\n   ip += l; }\nreturn buf.toString(); }\n\n/**\n* Encodes a byte array into Base64 format.\n* No blanks or line breaks are inserted in the output.\n* @param in  An array containing the data bytes to be encoded.\n* @return    A character array containing the Base64 encoded data.\n*/\npublic static char[] encode (byte[] in) {\nreturn encode(in, 0, in.length); }\n\n/**\n* Encodes a byte array into Base64 format.\n* No blanks or line breaks are inserted in the output.\n* @param in    An array containing the data bytes to be encoded.\n* @param iLen  Number of bytes to process in <code>in</code>.\n* @return      A character array containing the Base64 encoded data.\n*/\npublic static char[] encode (byte[] in, int iLen) {\nreturn encode(in, 0, iLen); }\n\n/**\n* Encodes a byte array into Base64 format.\n* No blanks or line breaks are inserted in the output.\n* @param in    An array containing the data bytes to be encoded.\n* @param iOff  Offset of the first byte in <code>in</code> to be processed.\n* @param iLen  Number of bytes to process in <code>in</code>, starting at <code>iOff</code>.\n* @return      A character array containing the Base64 encoded data.\n*/\npublic static char[] encode (byte[] in, int iOff, int iLen) {\nint oDataLen = ((iLen*4)+2)/3;       // output length without padding\nint oLen = ((iLen+2)/3)*4;         // output length including padding\nchar[] out = new char[oLen];\nint ip = iOff;\nint iEnd = iOff + iLen;\nint op = 0;\nwhile (ip < iEnd) {\n   int i0 = in[ip++] & 0xff;\n   int i1 = ip < iEnd ? in[ip++] & 0xff : 0;\n   int i2 = ip < iEnd ? in[ip++] & 0xff : 0;\n   int o0 = i0 >>> 2;\n   int o1 = ((i0 &   3) << 4) | (i1 >>> 4);\n   int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);\n   int o3 = i2 & 0x3F;\n   out[op++] = map1[o0];\n   out[op++] = map1[o1];\n   out[op] = op < oDataLen ? map1[o2] : '='; op++;\n   out[op] = op < oDataLen ? map1[o3] : '='; op++; }\nreturn out; }\n\n\t/**\n\t * Encodes a byte array into Base64 format. No blanks or line breaks are\n\t * inserted in the output.\n\t * \n\t * @param in\n\t *            An array containing the data bytes to be encoded.\n\t * @param iOff\n\t *            Offset of the first byte in <code>in</code> to be processed.\n\t * @param iLen\n\t *            Number of bytes to process in <code>in</code>, starting at\n\t *            <code>iOff</code>.\n\t * @return A character array containing the Base64 encoded data.\n\t */\n\tpublic static byte[] encodeToByteArray(byte[] in, int iOff, int iLen)\n\t{\n\t\tint oDataLen = ((iLen * 4) + 2) / 3;       // output length without padding\n\t\tint oLen = ((iLen + 2) / 3) * 4;         // output length including padding\n\t\tbyte[] out = new byte[oLen];\n\t\tint ip = iOff;\n\t\tint iEnd = iOff + iLen;\n\t\tint op = 0;\n\t\twhile (ip < iEnd)\n\t\t{\n\t\t\tint i0 = in[ip++] & 0xff;\n\t\t\tint i1 = ip < iEnd ? in[ip++] & 0xff : 0;\n\t\t\tint i2 = ip < iEnd ? in[ip++] & 0xff : 0;\n\t\t\tint o0 = i0 >>> 2;\n\t\t\tint o1 = ((i0 & 3) << 4) | (i1 >>> 4);\n\t\t\tint o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);\n\t\t\tint o3 = i2 & 0x3F;\n\t\t\tout[op++] = (byte) map1[o0];\n\t\t\tout[op++] = (byte) map1[o1];\n\t\t\tout[op] = (byte) (op < oDataLen ? map1[o2] : '=');\n\t\t\top++;\n\t\t\tout[op] = (byte) (op < oDataLen ? map1[o3] : '=');\n\t\t\top++;\n\t\t}\n\t\treturn out;\n\t}\n\t\n\t/**\n\t * Decodes a string from Base64 format. No blanks or line breaks are allowed\n\t * within the Base64 encoded input data.\n\t * \n\t * @param s\n\t *            A Base64 String to be decoded.\n\t * @return A String containing the decoded data.\n\t * @throws IllegalArgumentException\n\t *             If the input is not valid Base64 encoded data.\n\t */\npublic static String decodeString (String s) {\nreturn StringUtil.toUtfString(decode(s)); }\n\n/**\n* Decodes a byte array from Base64 format and ignores line separators, tabs and blanks.\n* CR, LF, Tab and Space characters are ignored in the input data.\n* This method is compatible with <code>sun.misc.BASE64Decoder.decodeBuffer(String)</code>.\n* @param s  A Base64 String to be decoded.\n* @return   An array containing the decoded data bytes.\n* @throws   IllegalArgumentException If the input is not valid Base64 encoded data.\n*/\npublic static byte[] decodeLines (String s) {\nchar[] buf = new char[s.length()];\nint p = 0;\nfor (int ip = 0; ip < s.length(); ip++) {\n   char c = s.charAt(ip);\n   if ((c != ' ') && (c != '\\r') && (c != '\\n') && (c != '\\t'))\n      buf[p++] = c; }\nreturn decode(buf, 0, p); }\n\n/**\n* Decodes a byte array from Base64 format.\n* No blanks or line breaks are allowed within the Base64 encoded input data.\n* @param s  A Base64 String to be decoded.\n* @return   An array containing the decoded data bytes.\n* @throws   IllegalArgumentException If the input is not valid Base64 encoded data.\n*/\npublic static byte[] decode (String s) {\nreturn decode(s.toCharArray()); }\n\n/**\n* Decodes a byte array from Base64 format.\n* No blanks or line breaks are allowed within the Base64 encoded input data.\n* @param in  A character array containing the Base64 encoded data.\n* @return    An array containing the decoded data bytes.\n* @throws    IllegalArgumentException If the input is not valid Base64 encoded data.\n*/\npublic static byte[] decode (char[] in) {\nreturn decode(in, 0, in.length); }\n\n/**\n* Decodes a byte array from Base64 format.\n* No blanks or line breaks are allowed within the Base64 encoded input data.\n* @param in    A character array containing the Base64 encoded data.\n* @param iOff  Offset of the first character in <code>in</code> to be processed.\n* @param iLen  Number of characters to process in <code>in</code>, starting at <code>iOff</code>.\n* @return      An array containing the decoded data bytes.\n* @throws      IllegalArgumentException If the input is not valid Base64 encoded data.\n*/\npublic static byte[] decode (char[] in, int iOff, int iLen) {\nif ((iLen%4) != 0) throw new IllegalArgumentException (\"Length of Base64 encoded input string is not a multiple of 4.\");\nwhile ((iLen > 0) && (in[(iOff+iLen)-1] == '=')) iLen--;\nint oLen = (iLen*3) / 4;\nbyte[] out = new byte[oLen];\nint ip = iOff;\nint iEnd = iOff + iLen;\nint op = 0;\nwhile (ip < iEnd) {\n   int i0 = in[ip++];\n   int i1 = in[ip++];\n   int i2 = ip < iEnd ? in[ip++] : 'A';\n   int i3 = ip < iEnd ? in[ip++] : 'A';\n   if ((i0 > 127) || (i1 > 127) || (i2 > 127) || (i3 > 127))\n      throw new IllegalArgumentException (\"Illegal character in Base64 encoded data.\");\n   int b0 = map2[i0];\n   int b1 = map2[i1];\n   int b2 = map2[i2];\n   int b3 = map2[i3];\n   if ((b0 < 0) || (b1 < 0) || (b2 < 0) || (b3 < 0))\n      throw new IllegalArgumentException (\"Illegal character in Base64 encoded data.\");\n   int o0 = ( b0       <<2) | (b1>>>4);\n   int o1 = ((b1 & 0xf)<<4) | (b2>>>2);\n   int o2 = ((b2 &   3)<<6) |  b3;\n   out[op++] = (byte)o0;\n   if (op<oLen) out[op++] = (byte)o1;\n   if (op<oLen) out[op++] = (byte)o2; }\nreturn out; }\n\nprivate Base64() {}\n\n} // end class Base64Coder",
      "methods" : {
        "Base64" : [ {
          "name" : "encodeString",
          "returnParam" : "String",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+encodeString(String):String",
          "lineStart" : 57,
          "lineEnd" : 58,
          "columnStart" : 1,
          "columnEnd" : 66,
          "initializer" : false
        }, {
          "name" : "encodeLines",
          "returnParam" : "String",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encodeLines(byte[]):String",
          "lineStart" : 66,
          "lineEnd" : 67,
          "columnStart" : 1,
          "columnEnd" : 64,
          "initializer" : false
        }, {
          "name" : "encodeLines",
          "returnParam" : "String",
          "params" : [ "byte[]", "int", "int", "int", "String" ],
          "visibility" : "public",
          "descriptor" : "+encodeLines(byte[], int, int, int, String):String",
          "lineStart" : 78,
          "lineEnd" : 90,
          "columnStart" : 1,
          "columnEnd" : 24,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 98,
          "lineEnd" : 99,
          "columnStart" : 1,
          "columnEnd" : 34,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int):char[]",
          "lineStart" : 108,
          "lineEnd" : 109,
          "columnStart" : 1,
          "columnEnd" : 29,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int):char[]",
          "lineStart" : 119,
          "lineEnd" : 138,
          "columnStart" : 1,
          "columnEnd" : 13,
          "initializer" : false
        }, {
          "name" : "encodeToByteArray",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+encodeToByteArray(byte[], int, int):byte[]",
          "lineStart" : 153,
          "lineEnd" : 178,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decodeString",
          "returnParam" : "String",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decodeString(String):String",
          "lineStart" : 190,
          "lineEnd" : 191,
          "columnStart" : 1,
          "columnEnd" : 43,
          "initializer" : false
        }, {
          "name" : "decodeLines",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decodeLines(String):byte[]",
          "lineStart" : 201,
          "lineEnd" : 208,
          "columnStart" : 1,
          "columnEnd" : 27,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):byte[]",
          "lineStart" : 217,
          "lineEnd" : 218,
          "columnStart" : 1,
          "columnEnd" : 33,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 227,
          "lineEnd" : 228,
          "columnStart" : 1,
          "columnEnd" : 34,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], int, int):byte[]",
          "lineStart" : 239,
          "lineEnd" : 266,
          "columnStart" : 1,
          "columnEnd" : 13,
          "initializer" : false
        }, {
          "name" : "Base64",
          "returnParam" : null,
          "params" : [ ],
          "visibility" : "private",
          "descriptor" : "-Base64()",
          "lineStart" : 268,
          "lineEnd" : 268,
          "columnStart" : 1,
          "columnEnd" : 19,
          "initializer" : true
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : [ ],
        "visibility" : "private",
        "descriptor" : "-Base64()",
        "lineStart" : 268,
        "lineEnd" : 268,
        "columnStart" : 1,
        "columnEnd" : 19,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 98,
        "lineEnd" : 99,
        "columnStart" : 1,
        "columnEnd" : 34,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 227,
        "lineEnd" : 228,
        "columnStart" : 1,
        "columnEnd" : 34,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "TrAP Utils API",
        "description" : null,
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "f059061b-2a93-4549-9f96-726149ff2a77" ],
        "_version_" : [ 1521884264005632000 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] com.ericsson.research.trap.utils.Base64.encode(byte[])|com.ericsson.research.trap.utils.Base64.encode([B)[C|[0]", "false|public static byte[] com.ericsson.research.trap.utils.Base64.decode(char[])|com.ericsson.research.trap.utils.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|private com.ericsson.research.trap.utils.Base64()|com.ericsson.research.trap.utils.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "uncalledClasses_ckjm_ext_loc_sum" : 131.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.2923076923076923,
        "uncalledClasses_ckjm_ext_wmc_min" : 9.0,
        "uncalledClasses_ckjm_ext_cbo_sum" : 3.0,
        "sf_complexity_necf" : 57.0,
        "calledClasses_ckjm_ext_ca_max" : 0.0,
        "uncalledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.7692307692307693,
        "uncalledClasses_ckjm_ext_npm_quadmean" : 6.0,
        "uncalledClasses_ckjm_ext_moa_safe" : 1.0,
        "jmh_thrpt_score_sum" : 229360.55599195248,
        "uncalledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "uncalledClasses_ckjm_ext_rfc_N" : 1.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 26.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 48.714285714285715,
        "sf_line_balance" : 1.489795918367347,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "uncalledClasses_ckjm_ext_rfc_min" : 28.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_cam_geomean" : 0.21428571428571425,
        "uncalledClasses_ckjm_ext_dam_sum" : 1.0,
        "entryClass_ckjm_ext_rfc" : 29.0,
        "uncalledClasses_ckjm_ext_dam_mean" : 1.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 81.0,
        "uncalledClasses_ckjm_ext_npm_safe" : 1.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 13.999999999999996,
        "uncalledClasses_ckjm_ext_ce_sum" : 0.0,
        "sf_method_error_prop" : 0.0,
        "entryClass_ckjm_ext_loc" : 699.0,
        "jmh_thrpt_score_geomean" : 229360.55599195234,
        "uncalledClasses_ckjm_ext_cbm_mean" : 0.0,
        "uncalledClasses_ckjm_ext_loc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_rfc_max" : 28.0,
        "calledUncalledMethodRatioJava" : 0.5,
        "sf_line_covered" : 49.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "uncalledClasses_ckjm_ext_dit_mean" : 1.0,
        "uncalledClasses_ckjm_ext_ce_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_mean" : 1.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 48.714285714285715,
        "calledClasses_ckjm_ext_rfc_sum" : 29.0,
        "calledClasses_ckjm_ext_wmc_min" : 14.0,
        "uncalledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_dit_geomean" : 1.0,
        "sf_instruction_necf" : 684.0,
        "calledClasses_ckjm_ext_npm_sum" : 12.0,
        "uncalledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_loc_geomean" : 698.9999999999999,
        "uncalledClasses_ckjm_ext_mfa_safe" : 1.0,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 81.0,
        "calledClasses_ckjm_ext_loc_min" : 699.0,
        "uncalledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 684.0,
        "uncalledClasses_ckjm_ext_cam_quadmean" : 0.21428571428571427,
        "uncalledClasses_ckjm_ext_lcom3_mean" : 0.875,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "uncalledClasses_ckjm_ext_dit_safe" : 1.0,
        "uncalledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 29.000000000000004,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 3.0,
        "uncalledClasses_ckjm_ext_amc_quadmean" : 13.444444444444445,
        "uncalledClasses_ckjm_ext_cbm_sum" : 0.0,
        "uncalledClasses_ckjm_ext_dit_sum" : 1.0,
        "uncalledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "uncalledClasses_ckjm_ext_moa_mean" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "uncalledClasses_ckjm_ext_moa_sum" : 1.0,
        "uncalledClasses_ckjm_ext_cam_sum" : 0.21428571428571427,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 122.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_mfa_N" : 1.0,
        "uncalledClasses_ckjm_ext_lcom_max" : 34.0,
        "uncalledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 14.0,
        "noUncalledMethods" : 16.0,
        "uncalledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.2923076923076923,
        "uncalledClasses_ckjm_ext_dit_max" : 1.0,
        "uncalledClasses_ckjm_ext_ca_min" : 3.0,
        "sf_line_leanmetric" : 49.0,
        "uncalledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.2923076923076923,
        "uncalledClasses_ckjm_ext_npm_min" : 6.0,
        "uncalledClasses_ckjm_ext_loc_quadmean" : 131.0,
        "calledClasses_ckjm_ext_lcom_sum" : 81.0,
        "uncalledClasses_ckjm_ext_lcom_quadmean" : 34.0,
        "uncalledClasses_ckjm_ext_moa_max" : 1.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 81.00000000000003,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "uncalledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "sf_complexity_sf" : 31.0,
        "uncalledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 1.0,
        "calledClasses_ckjm_ext_loc_sum" : 699.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_lcom3_max" : 0.7692307692307693,
        "calledClasses_ckjm_ext_cam_min" : 0.2923076923076923,
        "sf_method_sf" : 15.0,
        "entryClass_ckjm_ext_amc" : 48.714285714285715,
        "uncalledClasses_ckjm_ext_cbo_min" : 3.0,
        "uncalledClasses_ckjm_ext_wmc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "uncalledClasses_ckjm_ext_wmc_quadmean" : 9.0,
        "uncalledClasses_ckjm_ext_cbo_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 48.714285714285715,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "uncalledClasses_ckjm_ext_mfa_sum" : 0.0,
        "uncalledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_npm_max" : 12.0,
        "calledClasses_ckjm_ext_ce_sum" : 1.0,
        "calledClasses_ckjm_ext_ca_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 1.0,
        "sf_instruction_balance" : 1.1645569620253164,
        "entryClass_ckjm_ext_dit" : 1.0,
        "uncalledClasses_ckjm_ext_ce_max" : 0.0,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.2923076923076923,
        "jmh_thrpt_score_quadmean" : 229360.55599195248,
        "uncalledClasses_ckjm_ext_lcom_safe" : 1.0,
        "uncalledClasses_ckjm_ext_lcom3_geomean" : 0.875,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "uncalledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "uncalledClasses_ckjm_ext_amc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "uncalledClasses_ckjm_ext_cbo_mean" : 3.0,
        "sf_complexity_leanmetric" : 26.0,
        "uncalledClasses_ckjm_ext_loc_min" : 131.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 81.0,
        "sf_line_total" : 122.0,
        "uncalledClasses_ckjm_ext_amc_N" : 1.0,
        "uncalledClasses_ckjm_ext_rfc_safe" : 1.0,
        "entryClass_ckjm_ext_lcom" : 81.0,
        "uncalledClasses_ckjm_ext_amc_max" : 13.444444444444445,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "uncalledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 1.0,
        "uncalledClasses_ckjm_ext_lcom3_quadmean" : 0.875,
        "uncalledClasses_ckjm_ext_lcom_N" : 1.0,
        "uncalledClasses_ckjm_ext_cam_max" : 0.21428571428571427,
        "sf_instruction_nf" : 316.0,
        "sf_line_sf" : 73.0,
        "hashCodeCloneCountGlobal" : 3.0,
        "uncalledClasses_ckjm_ext_lcom3_min" : 0.875,
        "luceneScore" : 6.635545253753662,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_lcom_sum" : 34.0,
        "uncalledClasses_ckjm_ext_mfa_min" : 0.0,
        "uncalledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 1.0,
        "uncalledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 20.0,
        "uncalledClasses_ckjm_ext_loc_geomean" : 130.99999999999994,
        "uncalledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "uncalledClasses_ckjm_ext_cam_safe" : 1.0,
        "sf_instruction_covered" : 316.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 29.0,
        "uncalledClasses_ckjm_ext_loc_N" : 1.0,
        "uncalledClasses_ckjm_ext_rfc_geomean" : 27.999999999999996,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.7692307692307693,
        "entryClass_ckjm_ext_lcom3" : 0.7692307692307693,
        "uncalledClasses_ckjm_ext_dit_N" : 1.0,
        "uncalledClasses_ckjm_ext_amc_sum" : 13.444444444444445,
        "uncalledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 0.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "uncalledClasses_ckjm_ext_moa_geomean" : 1.0,
        "calledClasses_ckjm_ext_ca_geomean" : 0.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 31.0,
        "uncalledClasses_ckjm_ext_lcom3_sum" : 0.875,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "uncalledClasses_ckjm_ext_ca_mean" : 3.0,
        "calledClasses_ckjm_ext_loc_max" : 699.0,
        "uncalledClasses_ckjm_ext_ce_mean" : 0.0,
        "uncalledClasses_ckjm_ext_ce_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "uncalledClasses_ckjm_ext_dit_min" : 1.0,
        "uncalledClasses_ckjm_ext_wmc_max" : 9.0,
        "sf_instruction_leanmetric" : 316.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "uncalledClasses_ckjm_ext_wmc_mean" : 9.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 12.0,
        "calledClasses_numberOfClasses" : 1.0,
        "uncalledClasses_ckjm_ext_npm_geomean" : 6.0,
        "uncalledClasses_ckjm_ext_cbm_max" : 0.0,
        "uncalledClasses_ckjm_ext_npm_sum" : 6.0,
        "uncalledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 1.0,
        "calledClasses_ckjm_ext_amc_max" : 48.714285714285715,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 0.0,
        "calledClasses_ckjm_ext_lcom_min" : 81.0,
        "entryClass_ckjm_ext_ce" : 1.0,
        "uncalledClasses_ckjm_ext_amc_mean" : 13.444444444444445,
        "uncalledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 5.0,
        "fs_unique" : 1.0,
        "uncalledClasses_ckjm_ext_cbo_N" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 48.714285714285715,
        "uncalledClasses_ckjm_ext_lcom_min" : 34.0,
        "uncalledClasses_ckjm_ext_cbo_quadmean" : 3.0,
        "uncalledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "sf_line_missed" : 73.0,
        "jmh_thrpt_score_mean" : 229360.55599195248,
        "calledClasses_ckjm_ext_cbo_quadmean" : 1.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "uncalledClasses_ckjm_ext_ca_max" : 3.0,
        "uncalledClasses_ckjm_ext_rfc_quadmean" : 28.0,
        "uncalledClasses_ckjm_ext_moa_quadmean" : 1.0,
        "uncalledClasses_ckjm_ext_noc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "uncalledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 0.0,
        "uncalledClasses_ckjm_ext_mfa_mean" : 0.0,
        "sf_complexity_nf" : 26.0,
        "sf_line_leanness" : 0.4016393442622951,
        "uncalledClasses_ckjm_ext_ca_quadmean" : 3.0,
        "uncalledClasses_ckjm_ext_moa_N" : 1.0,
        "calledUncalledMethodRatio" : 0.2727272727272727,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 368.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "uncalledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 699.0,
        "calledClasses_ckjm_ext_wmc_mean" : 14.0,
        "sf_method_error_size" : 0.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "hashCodeCloneCountLocal" : 3.0,
        "uncalledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.2923076923076923,
        "uncalledClasses_ckjm_ext_npm_max" : 6.0,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.7692307692307693,
        "uncalledClasses_ckjm_ext_lcom_geomean" : 34.00000000000001,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.2923076923076923,
        "calledClasses_ckjm_ext_npm_mean" : 12.0,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "sf_line_nf" : 49.0,
        "uncalledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_moa_min" : 1.0,
        "sf_instruction_sf" : 368.0,
        "uncalledClasses_ckjm_ext_ce_min" : 0.0,
        "uncalledClasses_ckjm_ext_dam_min" : 1.0,
        "sf_method_covered" : 5.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "uncalledClasses_ckjm_ext_rfc_mean" : 28.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 1.0,
        "uncalledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.7692307692307693,
        "calledClasses_ckjm_ext_ce_mean" : 1.0,
        "sf_complexity_leanness" : 0.45614035087719296,
        "calledClasses_ckjm_ext_cbo_max" : 1.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "uncalledClasses_ckjm_ext_loc_mean" : 131.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "sf_method_necf" : 20.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "uncalledClasses_ckjm_ext_cbo_max" : 3.0,
        "uncalledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "sf_complexity_total" : 57.0,
        "noCalledMethods" : 6.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 1.1923076923076923,
        "uncalledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "uncalledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_wmc_sum" : 9.0,
        "calledClasses_ckjm_ext_npm_min" : 12.0,
        "uncalledClasses_ckjm_ext_lcom_mean" : 34.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.4619883040935672,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "uncalledClasses_ckjm_ext_noc_N" : 1.0,
        "sf_method_leanness" : 0.25,
        "uncalledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.7692307692307693,
        "calledClasses_ckjm_ext_wmc_max" : 14.0,
        "calledClasses_ckjm_ext_rfc_mean" : 29.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "uncalledClasses_ckjm_ext_loc_max" : 131.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "uncalledClasses_ckjm_ext_ca_sum" : 3.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 1.0,
        "uncalledClasses_ckjm_ext_cam_mean" : 0.21428571428571427,
        "uncalledClasses_ckjm_ext_cbm_min" : 0.0,
        "sf_method_missed" : 15.0,
        "sf_method_nf" : 5.0,
        "uncalledClasses_ckjm_ext_cam_min" : 0.21428571428571427,
        "uncalledClasses_ckjm_ext_amc_min" : 13.444444444444445,
        "uncalledClasses_ckjm_ext_amc_geomean" : 13.444444444444445,
        "calledClasses_ckjm_ext_npm_geomean" : 12.0,
        "calledClasses_ckjm_ext_amc_min" : 48.714285714285715,
        "calledClasses_ckjm_ext_wmc_sum" : 14.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 29.0,
        "uncalledClasses_ckjm_ext_npm_mean" : 6.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 699.0,
        "uncalledClasses_ckjm_ext_ca_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_ca_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "uncalledClasses_ckjm_ext_cam_N" : 1.0,
        "entryClass_ckjm_ext_npm" : 12.0,
        "uncalledClasses_ckjm_ext_ca_safe" : 1.0,
        "uncalledClasses_ckjm_ext_rfc_sum" : 28.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 29.0,
        "uncalledClasses_ckjm_ext_noc_min" : 0.0,
        "calledClasses_ckjm_ext_ce_min" : 1.0,
        "projectDeps" : 0.0,
        "uncalledClasses_ckjm_ext_npm_N" : 1.0,
        "jmh_thrpt_score_0" : 229360.55599195248,
        "uncalledClasses_ckjm_ext_lcom3_max" : 0.875,
        "uncalledClasses_ckjm_ext_wmc_geomean" : 9.000000000000002,
        "entryClass_ckjm_ext_wmc" : 14.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 16.0,
        "SINGLE_SMOOP_po" : 8.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.ericsson.research.trap.utils.Base64",
      "uri" : "com.ericsson.research.trap:trap-utils-api:1.4.1"
    }, {
      "id" : "f6f4058a-1ca1-4bbe-a65d-f2d45bf78b08",
      "groupId" : "org.jbundle.thin.base",
      "artifactId" : "org.jbundle.thin.base.util.base64",
      "version" : "1.0.9",
      "name" : "Base64",
      "packagename" : "org.jbundle.thin.base.util.base64",
      "score" : 6.7648644,
      "hash" : "a136dafbd65f9f6c21e453a508935f52",
      "content" : "/*\n * Copyright © 2012 jbundle.org. All rights reserved.\n */\npackage org.jbundle.thin.base.util.base64;\n\nimport java.io.UnsupportedEncodingException;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\n\nimport biz.source_code.base64Coder.Base64Coder;\n\n/**\n * Encode and decode strings using base64.\n * @author Don Corley <don@tourgeek.com>\n * Please don't make me write this code.\n * Thanks Christian d'Heureuse for Base64Coder at www.source-code.biz.\n */\n\npublic class Base64 {\n\n    public static final String DEFAULT_ENCODING = \"8859_1\";\n\n    /**\n     * Returns the string run through the SHA hash.\n     *\n     * @param unencoded the string to encode\n     * @return the encoded form of the unencoded string\n     */\n    public static byte[] encodeSHA(byte[] rgbValue)\n        throws NoSuchAlgorithmException\n    {\n        MessageDigest md = MessageDigest.getInstance(\"SHA\");\n    \n        md.update(rgbValue);\n        rgbValue = md.digest();\n        return rgbValue;\n    }\n    /**\n     * Encode this string as base64.\n     * @param string\n     * @return\n     */\n    public static char[] encode(byte[] bytes)\n    {\n        return Base64Coder.encode(bytes);\n    }\n    /**\n     * Encode this string as base64.\n     * @param string\n     * @return\n     */\n    @Deprecated\n    public static byte[] encodeToBytes(byte[] bytes)\n    {\n        try {\n            char[] chars = Base64.encode(bytes);\n            String string = new String(chars);\n            return string.getBytes(DEFAULT_ENCODING);\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n    /**\n     * Encode this string to base64.\n     * @param string\n     * @return\n     */\n    @Deprecated\n    public static String encode(String string)\n    {\n        try {\n            byte[] bytes = string.getBytes(DEFAULT_ENCODING);\n            char[] chars = Base64.encode(bytes);\n            return new String(chars);\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n    /**\n     * Decode this base64 string to a regular string.\n     * @param string\n     * @return\n     */\n    public static byte[] decode(char[] chars)\n    {\n        return Base64Coder.decode(chars);\n    }\n    /**\n     * Decode this base64 string to a regular string.\n     * @param string\n     * @return\n     */\n    @Deprecated\n    public static String decode(String string)\n    {\n        try {\n            byte[] bytes = Base64.decode(string.toCharArray());\n            return new String(bytes, DEFAULT_ENCODING);\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n    /**\n     * Decode this base64 string to a regular string.\n     * @param string\n     * @return\n     */\n    @Deprecated\n    public static byte[] decode(byte[] bytes)\n    {\n        try {\n            String string = new String(bytes, DEFAULT_ENCODING);\n            bytes = Base64.decode(string.toCharArray());\n            return bytes;\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n/*\n     /**\n      * Encode this string as base64.\n      * @param string\n      * @return\n      *\n     public static String encode(String s)\n     {\n             return Base64Coder.encodeString(s);\n     }\n     /**\n      * Encode this string as base64.\n      * @param string\n      * @return\n      *\n     public static byte[] encode(byte[] bytes)\n     {\n         try {\n             char[] chars = Base64Coder.encode(bytes);\n             String string = new String(chars);\n             return string.getBytes(DEFAULT_ENCODING);\n         }\n         catch (UnsupportedEncodingException e) {\n             e.printStackTrace();\n             return null;\n         }\n     }\n     /**\n      * Decode this base64 string to a regular string.\n      * @param string\n      * @return\n      *\n     public static String decode(String string)\n     {\n         try {\n             byte[] bytes = Base64Coder.decode(string);\n             return new String(bytes, DEFAULT_ENCODING);\n         }\n         catch (UnsupportedEncodingException e) {\n             e.printStackTrace();\n             return null;\n         }\n     }\n     /**\n      * Decode this base64 string to a regular string.\n      * @param string\n      * @return\n      *\n     public static byte[] decode(byte[] bytes)\n     {\n         try {\n             String string = new String(bytes, DEFAULT_ENCODING);\n             return Base64Coder.decode(string);\n         }\n         catch (UnsupportedEncodingException e) {\n             e.printStackTrace();\n             return null;\n         }\n     }\n*/\n/*\n    // Can't use sun.* in webstart\n    import sun.misc.BASE64Decoder;\n    import sun.misc.BASE64Encoder;\n    // Shouldn't use these sun.* ... change to an open source implementation\n    public static BASE64Decoder decoder = new BASE64Decoder();\n    public static BASE64Encoder encoder = new BASE64Encoder();\n    \n    /**\n     * Encode this string as base64.\n     * @param string\n     * @return\n     *\n    public static String encode(String string)\n    {\n        try {\n            byte[] bytes = string.getBytes(DEFAULT_ENCODING);\n            return encoder.encode(bytes);\n        }\n        catch (UnsupportedEncodingException ignored) {\n            return null;\n        }\n    }\n    /**\n     * Encode this string as base64.\n     * @param string\n     * @return\n     *\n    public static byte[] encode(byte[] bytes)\n    {\n        try {\n            String string = encoder.encode(bytes);\n            return string.getBytes(DEFAULT_ENCODING);\n        }\n        catch (UnsupportedEncodingException ignored) {\n            return null;\n        }\n    }\n    /**\n     * Decode this base64 string to a regular string.\n     * @param string\n     * @return\n     *\n    public static String decode(String string)\n    {\n        byte[] bytes;\n        try {\n            bytes = decoder.decodeBuffer(string);\n            return new String(bytes, DEFAULT_ENCODING);\n        } catch (IOException e) {\n            return null;\n        }\n    }\n    /**\n     * Decode this base64 string to a regular string.\n     * @param string\n     * @return\n     *\n    public static byte[] decode(byte[] bytes)\n    {\n        try {\n            String string = new String(bytes, DEFAULT_ENCODING);\n            return decoder.decodeBuffer(string);\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return null;\n        } catch (IOException e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n*/\n/*\nimport com.oreilly.servlet.Base64Encoder;\n\n    /**\n     * Encode this string to base64.\n     * @param string\n     * @return\n     *\n    public static String encode(String s)\n    {\n        return Base64Encoder.encodeBase64(s);\n    }\n    /**\n     * Encode this string as base64.\n     * @param string\n     * @return\n     *\n    public static byte[] encode(byte[] b)\n    {\n        return Base64Encoder.encodeBase64(b);\n    }\n    /**\n     * Decode this base64 string to a regular string.\n     * @param string\n     * @return\n     *\n    public static String decode(String s)\n    {\n        return Base64Decoder.decodeBase64(s);\n    }\n    /**\n     * Decode this base64 string to a regular string.\n     * @param string\n     * @return\n     *\n    public static byte[] decode(byte[] b)\n    {\n        return Base64Decoder.decodeBase64(b);\n    }\n */\n /*\nimport com.oreilly.servlet.Base64Encoder;\n\n    /**\n     * Encode this string as base64.\n     * @param string\n     * @return\n     *\n    public static char[] encode(byte[] b)\n    {\n        try {\n            byte[] bytes = Base64Encoder.encodeBase64(b);\n            String string = new String(bytes, DEFAULT_ENCODING);\n            return string.toCharArray();\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n    /**\n     * Encode this string as base64.\n     * @param string\n     * @return\n     *\n    @Deprecated\n    public static byte[] encodeToBytes(byte[] bytes)\n    {\n        try {\n            char[] chars = Base64.encode(bytes);\n            String string = new String(chars);\n            return string.getBytes(DEFAULT_ENCODING);\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n    /**\n     * Encode this string to base64.\n     * @param string\n     * @return\n     *\n    @Deprecated\n    public static String encode(String string)\n    {\n        try {\n            byte[] bytes = string.getBytes(DEFAULT_ENCODING);\n            char[] chars = Base64.encode(bytes);\n            return new String(chars);\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n    /**\n     * Decode this base64 string to a regular string.\n     * @param string\n     * @return\n     *\n    public static byte[] decode(char[] chars)\n    {\n        try {\n            String string = new String(chars);\n            byte[] bytes = string.getBytes(DEFAULT_ENCODING);\n            bytes = Base64Decoder.decodeBase64(bytes);\n            return bytes;\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n    /**\n     * Decode this base64 string to a regular string.\n     * @param string\n     * @return\n     *\n    @Deprecated\n    public static String decode(String string)\n    {\n        try {\n            byte[] bytes = Base64.decode(string.toCharArray());\n            return new String(bytes, DEFAULT_ENCODING);\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n    /**\n     * Decode this base64 string to a regular string.\n     * @param string\n     * @return\n     *\n    @Deprecated\n    public static byte[] decode(byte[] bytes)\n    {\n        try {\n            String string = new String(bytes, DEFAULT_ENCODING);\n            bytes = Base64.decode(string.toCharArray());\n            return bytes;\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n*/\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "encodeSHA",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encodeSHA(byte[]):byte[]",
          "lineStart" : 29,
          "lineEnd" : 37,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 43,
          "lineEnd" : 46,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encodeToBytes",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encodeToBytes(byte[]):byte[]",
          "lineStart" : 52,
          "lineEnd" : 63,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "String",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+encode(String):String",
          "lineStart" : 69,
          "lineEnd" : 80,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 86,
          "lineEnd" : 89,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "String",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):String",
          "lineStart" : 95,
          "lineEnd" : 105,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[]):byte[]",
          "lineStart" : 111,
          "lineEnd" : 122,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 43,
        "lineEnd" : 46,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 86,
        "lineEnd" : 89,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "jbundle-thin-base-util-base64 - base64 code",
        "description" : null,
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "e93591ac-8d0c-40a4-9333-bd6c76cec73a" ],
        "_version_" : [ 1521884372970504192 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "biz.source_code:base64coder:2010-12-19" ] ],
        "method" : [ [ "false|public static char[] org.jbundle.thin.base.util.base64.Base64.encode(byte[])|org.jbundle.thin.base.util.base64.Base64.encode([B)[C|[0]", "false|public static byte[] org.jbundle.thin.base.util.base64.Base64.decode(char[])|org.jbundle.thin.base.util.base64.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public org.jbundle.thin.base.util.base64.Base64()|org.jbundle.thin.base.util.base64.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 2.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 2.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.5333333333333333,
        "sf_complexity_necf" : 8.0,
        "calledClasses_ckjm_ext_ca_max" : 1.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.9603174603174602,
        "jmh_thrpt_score_sum" : 227859.75506160772,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 3.0,
        "sf_line_balance" : 9.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 53.21153846153846,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 19.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 72.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 10.198039027185569,
        "entryClass_ckjm_ext_loc" : 95.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 227859.75506160784,
        "calledUncalledMethodRatioJava" : 0.5,
        "sf_line_covered" : 3.0,
        "calledClasses_ckjm_ext_wmc_N" : 2.0,
        "calledClasses_ckjm_ext_amc_geomean" : 21.364960530306117,
        "calledClasses_ckjm_ext_cbo_mean" : 1.0,
        "entryClass_ckjm_ext_dam" : 0.0,
        "calledClasses_ckjm_ext_wmc_min" : 8.0,
        "calledClasses_ckjm_ext_rfc_sum" : 47.0,
        "sf_instruction_necf" : 86.0,
        "calledClasses_ckjm_ext_npm_sum" : 19.0,
        "calledClasses_ckjm_ext_loc_geomean" : 232.2929185317538,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 50.0,
        "calledClasses_ckjm_ext_loc_min" : 95.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 86.0,
        "calledClasses_ckjm_ext_noc_N" : 2.0,
        "calledClasses_ckjm_ext_cbm_N" : 2.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 23.065125189341593,
        "calledClasses_ckjm_ext_moa_N" : 2.0,
        "sf_method_balance" : 1.6666666666666667,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 2.0,
        "sf_line_necf" : 30.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 13.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 10.793516572461451,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.26614532371118854,
        "sf_line_leanmetric" : 3.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.26666666666666666,
        "calledClasses_ckjm_ext_lcom_sum" : 100.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 44.89988864128728,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 5.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 1.0,
        "calledClasses_ckjm_ext_loc_sum" : 663.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.25,
        "calledClasses_ckjm_ext_lcom3_max" : 1.1428571428571428,
        "entryClass_ckjm_ext_amc" : 10.75,
        "sf_method_sf" : 5.0,
        "calledClasses_ckjm_ext_dam_min" : 0.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 2.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 26.60576923076923,
        "calledClasses_ckjm_ext_npm_max" : 11.0,
        "calledClasses_ckjm_ext_ce_sum" : 1.0,
        "calledClasses_ckjm_ext_cbo_min" : 1.0,
        "calledClasses_ckjm_ext_ca_sum" : 1.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 8.555555555555555,
        "calledClasses_ckjm_ext_dam_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_N" : 2.0,
        "entryClass_ckjm_ext_cam" : 0.25,
        "jmh_thrpt_score_quadmean" : 227859.75506160772,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 3.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 54.62600113499065,
        "sf_line_total" : 30.0,
        "entryClass_ckjm_ext_lcom" : 28.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 2.0,
        "calledClasses_ckjm_ext_ce_max" : 1.0,
        "sf_instruction_nf" : 9.0,
        "sf_line_sf" : 27.0,
        "hashCodeCloneCountGlobal" : 4.0,
        "luceneScore" : 6.764864444732666,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 0.7071067811865476,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 2.0,
        "calledClasses_ckjm_ext_lcom_N" : 2.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 8.0,
        "sf_instruction_covered" : 9.0,
        "calledClasses_ckjm_ext_dit_N" : 2.0,
        "calledClasses_ckjm_ext_rfc_max" : 28.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.9775123325525182,
        "entryClass_ckjm_ext_lcom3" : 1.1428571428571428,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 0.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 0.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 5.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 568.0,
        "calledClasses_ckjm_ext_mfa_N" : 2.0,
        "calledClasses_ckjm_ext_rfc_N" : 2.0,
        "sf_instruction_leanmetric" : 9.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.7071067811865476,
        "calledClasses_ckjm_ext_npm_quadmean" : 9.617692030835672,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 2.0,
        "calledClasses_ckjm_ext_cbo_sum" : 2.0,
        "calledClasses_ckjm_ext_amc_max" : 42.46153846153846,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 0.0,
        "calledClasses_ckjm_ext_lcom_min" : 28.0,
        "entryClass_ckjm_ext_ce" : 1.0,
        "calledClasses_ckjm_ext_npm_N" : 2.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 30.9721225339878,
        "jmh_thrpt_score_mean" : 227859.75506160772,
        "sf_line_missed" : 27.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 3.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 0.7071067811865476,
        "sf_line_leanness" : 0.1,
        "calledUncalledMethodRatio" : 0.38095238095238093,
        "calledClasses_ckjm_ext_cbo_N" : 2.0,
        "sf_instruction_missed" : 77.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 331.5,
        "calledClasses_ckjm_ext_wmc_mean" : 10.5,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 4.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.2833333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 1.9206349206349205,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.26718699236468996,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 9.5,
        "sf_line_nf" : 3.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 77.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 2.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.5,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.9428090415820634,
        "sf_complexity_leanness" : 0.375,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 8.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 8.0,
        "noCalledMethods" : 8.0,
        "calledClasses_ckjm_ext_dam_mean" : 0.5,
        "sf_complexity_balance" : 1.6666666666666667,
        "calledClasses_ckjm_ext_npm_min" : 8.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.10465116279069768,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.375,
        "calledClasses_ckjm_ext_lcom3_min" : 0.7777777777777778,
        "calledClasses_ckjm_ext_wmc_max" : 13.0,
        "calledClasses_ckjm_ext_rfc_mean" : 23.5,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 1.0,
        "sf_method_missed" : 5.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 9.380831519646861,
        "calledClasses_ckjm_ext_amc_min" : 10.75,
        "calledClasses_ckjm_ext_wmc_sum" : 21.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 23.926972228010797,
        "calledClasses_ckjm_ext_loc_quadmean" : 407.21554488992683,
        "calledClasses_ckjm_ext_ca_mean" : 0.5,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 8.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 2.0,
        "calledClasses_ckjm_ext_rfc_min" : 19.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 1.0,
        "jmh_thrpt_score_0" : 227859.75506160772,
        "entryClass_ckjm_ext_wmc" : 8.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 13.0,
        "SINGLE_SMOOP_po" : 5.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.jbundle.thin.base.util.base64.Base64",
      "uri" : "org.jbundle.thin.base:org.jbundle.thin.base.util.base64:1.0.9"
    }, {
      "id" : "2f2954be-72a9-4202-a4bf-9326a8903093",
      "groupId" : "net.sourceforge.jadex",
      "artifactId" : "jadex-nuggets",
      "version" : "2.4",
      "name" : "Base64",
      "packagename" : "nuggets.util",
      "score" : 6.74108,
      "hash" : "6c2211ec211ef88ea36cc3f2fcadd030",
      "content" : "/*\n* Base64.java\n* Created by Walczak on Sep 8, 2005. \n* \n* Licence (BSD):\n* ==============\n*\n* Copyright (c) 2005, Andrzej Walczak, University of Hamburg\n* All rights reserved.\n*\n* Redistribution and use in source and binary forms, with or without modification,\n* are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright notice, this list\n* of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this\n* list of conditions and the following disclaimer in the documentation and/or other\n* materials provided with the distribution.\n* Neither the name of the University of Hamburg nor the names of its contributors may be\n* used to endorse or promote products derived from this software without specific\n* prior written permission.\n*\n* this SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n* WARRANTIES OF MERCHANTABILITY AND FITNESS for A PARTICULAR PURPOSE ARE DISCLAIMED.\n* in NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE for ANY DIRECT,\n* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\n* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n* WHETHER in CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n* ARISING IN ANY WAY OUT OF THE USE OF this SOFTWARE, EVEN if ADVISED OF THE POSSIBILITY\n* OF SUCH DAMAGE.\n*\n*/\n\npackage nuggets.util;\n\n\n/**\n * Base64 <br>\n * Contains lots of utilities for coding and decoding text and character arrays\n * fore and back to the Base64 encoding. It is quite the fastest that I know.\n * \n * @author Walczak\n * @since Sep 8, 2005\n * @version 1.1\n */\n\npublic final class Base64 {\n    // ------------------------ ENCODER --------------------\n    /**\n     * This is a wrapper to\n     * <code>toCharArray(final byte[] text, final int from, final int len)</code>\n     * \n     * @param text\n     * @return an encoded char array from the text\n     */\n    public final static char[] toCharArray(final byte[] text) {\n        return toCharArray(text, 0, text.length);\n    }\n\n    /**\n     * This will encode the text without line feeds added\n     * \n     * @param text\n     * @param from\n     *            where to start\n     * @param len\n     *            how long is the byte array\n     * @return an encoded char array from the text\n     */\n    public final static char[] toCharArray(final byte[] text, final int from,\n            final int len) {\n        final char[] code;\n        int bi = from + len;\n        int ci = (len / 3) << 2;\n        int i;\n        switch (len % 3) { // length of padding\n        case 1:\n            ci += 4;\n            code = new char[ci];\n            i = text[--bi] << 4;\n            code[--ci] = '=';\n            code[--ci] = '=';\n            code[--ci] = C[i & 0x3F];\n            code[--ci] = C[(i >>> 6) & 0x3F];\n            break;\n        case 2:\n            ci += 4;\n            code = new char[ci];\n            i = (text[--bi] & 0xFF) << 2 | text[--bi] << 10;\n            code[--ci] = '=';\n            code[--ci] = C[i & 0x3F];\n            code[--ci] = C[(i >>> 6) & 0x3F];\n            code[--ci] = C[(i >>> 12) & 0x3F];\n            break;\n        default: // 0\n            code = new char[ci];\n        }\n\n        while (ci > 00) {\n            i = (text[--bi] & 0xFF) | (text[--bi] & 0xFF) << 8\n                    | text[--bi] << 16;\n            code[--ci] = C[i & 0x3F];\n            code[--ci] = C[(i >>> 6) & 0x3F];\n            code[--ci] = C[(i >>> 12) & 0x3F];\n            code[--ci] = C[(i >>> 18) & 0x3F];\n        }\n        return code;\n    }\n\n    /**\n     * @param text\n     * @return encoded text\n     */\n    public final static byte[] encode(final byte[] text) {\n        return encode(text, 0, text.length);\n    }\n\n    /**\n     * This will encode the text without line feeds added\n     * \n     * @param text\n     * @param from\n     *            where to start\n     * @param len\n     *            how long is the byte array\n     * @return an encoded byte array from the text\n     */\n    public final static byte[] encode(final byte[] text, final int from,\n            final int len) {\n        final byte[] code;\n        int bi = from + len;\n        int ci = (len / 3) << 2;\n        int i;\n        switch (len % 3) { // length of padding\n        case 1:\n            ci += 4;\n            code = new byte[ci];\n            i = text[--bi] << 4;\n            code[--ci] = '=';\n            code[--ci] = '=';\n            code[--ci] = B[i & 0x3F];\n            code[--ci] = B[(i >>> 6) & 0x3F];\n            break;\n        case 2:\n            ci += 4;\n            code = new byte[ci];\n            i = (text[--bi] & 0xFF) << 2 | text[--bi] << 10;\n            code[--ci] = '=';\n            code[--ci] = B[i & 0x3F];\n            code[--ci] = B[(i >>> 6) & 0x3F];\n            code[--ci] = B[(i >>> 12) & 0x3F];\n            break;\n        default: // 0\n            code = new byte[ci];\n        }\n\n        while (ci > 00) {\n            i = (text[--bi] & 0xFF) | (text[--bi] & 0xFF) << 8\n                    | text[--bi] << 16;\n            code[--ci] = B[i & 0x3F];\n            code[--ci] = B[(i >>> 6) & 0x3F];\n            code[--ci] = B[(i >>> 12) & 0x3F];\n            code[--ci] = B[(i >>> 18) & 0x3F];\n        }\n        return code;\n    }\n\n    /**\n     * This will encode the text without line feeds added. It will write all\n     * output to the dest buffer begining from dstart. <br>\n     * Both src and dest may be the same provided (sstart <=dstart).\n     * \n     * @param src\n     * @param sstart\n     *            where to start\n     * @param len\n     *            how long is the byte array\n     * @param dest\n     * @param dstart\n     * @return index to the buffer byte ofter the text\n     */\n\n    public final static int encode(final byte[] src, final int sstart,\n            final int len, final byte[] dest, final int dstart) {\n        int bi = sstart + len;\n        int ci = ((len / 3) << 2) + dstart;\n        int dend;\n        int i;\n        switch (len % 3) { // length of padding\n        case 1:\n            ci += 4;\n            dend = ci;\n            i = src[--bi] << 4;\n            dest[--ci] = '=';\n            dest[--ci] = '=';\n            dest[--ci] = B[i & 0x3F];\n            dest[--ci] = B[(i >>> 6) & 0x3F];\n            break;\n        case 2:\n            ci += 4;\n            dend = ci;\n            i = (src[--bi] & 0xFF) << 2 | src[--bi] << 10;\n            dest[--ci] = '=';\n            dest[--ci] = B[i & 0x3F];\n            dest[--ci] = B[(i >>> 6) & 0x3F];\n            dest[--ci] = B[(i >>> 12) & 0x3F];\n            break;\n        default:\n            dend = ci;\n        }\n\n        while (ci > dstart) {\n            i = (src[--bi] & 0xFF) | (src[--bi] & 0xFF) << 8 | src[--bi] << 16;\n            dest[--ci] = B[i & 0x3F];\n            dest[--ci] = B[(i >>> 6) & 0x3F];\n            dest[--ci] = B[(i >>> 12) & 0x3F];\n            dest[--ci] = B[(i >>> 18) & 0x3F];\n        }\n        return dend;\n    }\n    \n\n\t/** \n\t * @param ba\n\t * @param out\n\t */\n\tpublic static void encode(byte[] ba, ICharStream out) \n\t{\n        final int end = ba.length - 2;\n        int quad;\n        int start=0;\n        while(start<end) {\n            quad = ba[start++] << 16 | (ba[start++] & 0xFF) << 8 | (ba[start++] & 0xFF);\n            out.write(B[(quad >>> 18) & 0x3F]);\n            out.write(B[(quad >>> 12) & 0x3F]);\n            out.write(B[(quad >>> 6) & 0x3F]);\n            out.write(B[quad & 0x3F]);\n        }\n        \n        switch (ba.length % 3) { // length of padding\n        case 1:\n            quad = ba[start] << 4;\n            out.write(B[(quad >>> 6) & 0x3F]);\n            out.write(B[quad & 0x3F]);\n            out.write('=');\n            out.write('=');\n            break;\n        case 2:\n            quad = ba[start++] << 10 | (ba[start] & 0xFF) << 2;\n            out.write(B[(quad >>> 12) & 0x3F]);\n            out.write(B[(quad >>> 6) & 0x3F]);\n            out.write(B[quad & 0x3F]);\n            out.write('=');\n            break;\n        }\t\n\t}\n    \n    /**\n     * This will encode the text. The CRLF comes after <code>lb</code>\n     * characters.\n     * \n     * @param text\n     * @param llen\n     *            the length of line (without CRLF) must be a multiple of 4\n     * @return an encoded char array from the text\n     */\n    public final static char[] toCharArray(final byte[] text, final int llen) {\n        final char[] code;\n        int bi = text.length;\n        int ci = (bi / 3) << 2;\n        int i;\n        //@goal determine padding\n        switch (bi % 3) { // length of padding\n        case 1: // @goal pad two text\n            ci += 4;\n            ci += (ci / llen) << 1;\n            code = new char[ci];\n\n            if (ci % llen == 4) {\n                code[--ci] = '\\n';\n                code[--ci] = '\\r';\n            }\n            i = text[--bi] << 4;\n            code[--ci] = '=';\n            code[--ci] = '=';\n            code[--ci] = C[i & 0x3F];\n            code[--ci] = C[(i >>> 6) & 0x3F];\n            break;\n        case 2: // @goal pad one byte\n            ci += 4;\n            ci += (ci / llen) << 1;\n            code = new char[ci];\n\n            if (ci % llen == 4) {\n                code[--ci] = '\\n';\n                code[--ci] = '\\r';\n            }\n            i = (text[--bi] & 0xFF) << 2 | text[--bi] << 10;\n            code[--ci] = '=';\n            code[--ci] = C[i & 0x3F];\n            code[--ci] = C[(i >>> 6) & 0x3F];\n            code[--ci] = C[(i >>> 12) & 0x3F];\n            break;\n        default: // 0\n            ci += (ci / llen) << 1;\n            code = new char[ci];\n        }\n        //@goal calculate the line breaking constant and variable\n        int lmax = (llen >>> 2) - 1; // will break after this many quadruples\n        int li = (ci % (llen + 2)) >>> 2; // initialize the counter\n\n        while (bi > 00) {\n\n            if (li > 0) {\n                --li;\n\n            } else {\n                code[--ci] = '\\n';\n                code[--ci] = '\\r';\n                li = lmax;\n            }\n            i = (text[--bi] & 0xFF) | (text[--bi] & 0xFF) << 8\n                    | text[--bi] << 16;\n            code[--ci] = C[i & 0x3F];\n            code[--ci] = C[(i >>> 6) & 0x3F];\n            code[--ci] = C[(i >>> 12) & 0x3F];\n            code[--ci] = C[(i >>> 18) & 0x3F];\n        }\n        return code;\n    }\n\n    /**\n     * This will encode the text. The CRLF comes after <code>lb</code>\n     * characters.\n     * \n     * @param text\n     * @param llen\n     *            the length of line (without CRLF) must be a multiple of 4\n     * @return an encoded byte array from the text\n     */\n\n    public final static byte[] encode(final byte[] text, final int llen) {\n        final byte[] code;\n        int bi = text.length;\n        int ci = (bi / 3) << 2;\n        int i;\n        //@goal determine padding\n        switch (bi % 3) { // length of padding\n        case 1: // @goal pad two text\n            ci += 4;\n            ci += (ci / llen) << 1;\n            code = new byte[ci];\n\n            if (ci % llen == 4) {\n                code[--ci] = '\\n';\n                code[--ci] = '\\r';\n            }\n            i = text[--bi] << 4;\n            code[--ci] = '=';\n            code[--ci] = '=';\n            code[--ci] = B[i & 0x3F];\n            code[--ci] = B[(i >>> 6) & 0x3F];\n            break;\n        case 2: // @goal pad one byte\n            ci += 4;\n            ci += (ci / llen) << 1;\n            code = new byte[ci];\n\n            if (ci % llen == 4) {\n                code[--ci] = '\\n';\n                code[--ci] = '\\r';\n            }\n            i = (text[--bi] & 0xFF) << 2 | text[--bi] << 10;\n            code[--ci] = '=';\n            code[--ci] = B[i & 0x3F];\n            code[--ci] = B[(i >>> 6) & 0x3F];\n            code[--ci] = B[(i >>> 12) & 0x3F];\n            break;\n        default: // 0\n            ci += (ci / llen) << 1;\n            code = new byte[ci];\n        }\n        //@goal calculate the line breaking constant and variable\n        int lmax = (llen >>> 2) - 1; // will break after this many quadruples\n        int li = (ci % (llen + 2)) >>> 2; // initialize the counter\n\n        while (ci > 00) {\n\n            if (li > 0) {\n                --li;\n\n            } else {\n                code[--ci] = '\\n';\n                code[--ci] = '\\r';\n                li = lmax;\n            }\n            i = (text[--bi] & 0xFF) | (text[--bi] & 0xFF) << 8\n                    | text[--bi] << 16;\n            code[--ci] = B[i & 0x3F];\n            code[--ci] = B[(i >>> 6) & 0x3F];\n            code[--ci] = B[(i >>> 12) & 0x3F];\n            code[--ci] = B[(i >>> 18) & 0x3F];\n        }\n        return code;\n    }\n\n    //###################### DECODER #####################################\n    /**\n     * This is a wrapper to\n     * <code>decode(final char[] code, final int from, final int len)</code>\n     * \n     * @param code\n     * @return a byte array holding encoded char data\n     */\n    public final static byte[] decode(final char[] code) {\n        return decode(code, 0, code.length);\n    }\n\n    /**\n     * This will decode base64 data without line feeds. The char array should be\n     * multiple of 4 in length.\n     * \n     * @param code\n     * @param from\n     *            start position in code\n     * @param len\n     *            length of the part\n     * @return the decoded sequence of text\n     */\n    public final static byte[] decode(final char[] code, final int from,\n            final int len) {\n        int bi = (len >>> 2) * 3;\n        int ci = from + len;\n        int i;\n        final byte[] text;\n\n        if (code[ci - 1] == '=') {\n            if (code[ci - 2] == '=') { // padding 2\n                ci -= 3;\n                bi -= 2;\n                text = new byte[bi];\n                text[--bi] = (byte) ((I[code[ci]] | I[code[--ci]] << 6) >> 4);\n            } else { // padding 1\n                ci -= 2;\n                --bi;\n                text = new byte[bi];\n                i = I[code[ci]] | I[code[--ci]] << 6 | I[code[--ci]] << 12;\n                text[--bi] = (byte) (i >>> 2);\n                text[--bi] = (byte) (i >>> 10);\n            }\n\n        } else {\n            text = new byte[bi];\n        }\n\n        while (bi > 00) {\n            i = I[code[--ci]] | I[code[--ci]] << 6 | I[code[--ci]] << 12\n                    | I[code[--ci]] << 18;\n            text[--bi] = (byte) (i);\n            text[--bi] = (byte) (i >>> 8);\n            text[--bi] = (byte) (i >>> 16);\n        }\n        return text;\n    }\n\n    /**\n     * This is a wrapper to\n     * <code>decode(final byte[] code, final int from, final int len)</code>\n     * \n     * @param code\n     * @return a byte array holding encoded char data\n     */\n    public final static byte[] decode(final byte[] code) {\n        return decode(code, 0, code.length);\n    }\n\n    /**\n     * a copy of the char part\n     * \n     * @param src\n     * @param from\n     * @param len\n     * @return decoded byte array\n     */\n    public final static byte[] decode(final byte[] src, final int from,\n            final int len) {\n        int bi = (len >>> 2) * 3;\n        int ci = from + len;\n        int i;\n        final byte[] text;\n\n        if (src[ci - 1] == '=') {\n            if (src[ci - 2] == '=') { // padding 2\n                ci -= 3;\n                bi -= 2;\n                text = new byte[bi];\n                text[--bi] = (byte) ((I[src[ci]] | I[src[--ci]] << 6) >> 4);\n            } else { // padding 1\n                ci -= 2;\n                --bi;\n                text = new byte[bi];\n                i = I[src[ci]] | I[src[--ci]] << 6 | I[src[--ci]] << 12;\n                text[--bi] = (byte) (i >>> 2);\n                text[--bi] = (byte) (i >>> 10);\n            }\n\n        } else {\n            text = new byte[bi];\n        }\n\n        while (bi > 00) {\n            i = I[src[--ci]] | I[src[--ci]] << 6 | I[src[--ci]] << 12\n                    | I[src[--ci]] << 18;\n            text[--bi] = (byte) (i);\n            text[--bi] = (byte) (i >>> 8);\n            text[--bi] = (byte) (i >>> 16);\n        }\n        return text;\n    }\n\n    /**\n     * <code>decodeCRLF(code, 0, code.length, 76)</code>\n     * \n     * @param code\n     * @return the encoded text;\n     */\n    public final static byte[] decode76(final char[] code) {\n        return decodeCRLF(code, 0, code.length, 76);\n    }\n\n    /**\n     * This will decode base64 data. The starting point and length must be\n     * accurate. The data must end on a multiple of 4 boundary and must include\n     * the '=' padding, if any.\n     * \n     * @param code\n     * @param from\n     * @param len\n     *            the length of data\n     * @param llen\n     *            the line length of this base64 (without CRLF)\n     * @return the decoded sequence of text\n     */\n    public final static byte[] decodeCRLF(final char[] code, final int from,\n            final int len, final int llen) {\n        int bi = ((len - ((len / (llen + 2)) << 1)) >>> 2) * 3;\n        int ci = from + len;\n        int lmax = (llen >>> 2);\n        int li = (ci % (llen + 2)) >>> 2;\n        int i;\n        if (li == 0) { // skip crlf\n            ci -= 2;\n            li = lmax;\n        }\n        final byte[] text;\n\n        if (code[ci - 1] == '=') {\n            if (code[ci - 2] == '=') { // padding 2\n                ci -= 3;\n                bi -= 2;\n                text = new byte[bi];\n                text[--bi] = (byte) ((I[code[ci]] | I[code[--ci]] << 6) >> 4);\n                --li;\n            } else { // padding 1\n                ci -= 2;\n                --bi;\n                text = new byte[bi];\n                i = I[code[ci]] | I[code[--ci]] << 6 | I[code[--ci]] << 12;\n                text[--bi] = (byte) (i >>> 2);\n                text[--bi] = (byte) (i >>> 10);\n                --li;\n            }\n\n        } else {\n            text = new byte[bi];\n        }\n\n        while (bi > 00) {\n\n            if (li == 0) {\n                ci -= 2;\n                li = lmax;\n            }\n            i = I[code[--ci]] | I[code[--ci]] << 6 | I[code[--ci]] << 12\n                    | I[code[--ci]] << 18;\n            text[--bi] = (byte) (i);\n            text[--bi] = (byte) (i >>> 8);\n            text[--bi] = (byte) (i >>> 16);\n            --li;\n        }\n        return text;\n    }\n\n    /**\n     * This will decode base64 data with CRLF at 4 character boundary. <br>\n     * The sequence may look like:\n     * <p>\n     * ABCDABCD\\r\\nABCDABCD or even ABCDABCD#####ABCD###ABCD#ABCD.\n     * </p>\n     * <p>\n     * The array must be multiple of 4 + number of CRLF or illegal characters\n     * and the line length may vary.\n     * </p>\n     * \n     * @param code\n     * @param from\n     * @param len\n     * @return the decoded sequence of text\n     */\n    public final static byte[] decodeCRLF(final char[] code, final int from,\n            final int len) {\n        int bi = len;\n        int ci = from + len;\n        int i;\n        //@goal determine the number of valid code\n\n        while (ci > from) {\n            if (I[code[--ci]] < 0)\n                --bi;\n        }\n        //@goal allocate byte array\n        bi = (bi >>> 2) * 3;\n        final byte[] text = new byte[bi];\n        //@goal decode the sequence\n        ci = from + len;\n\n        while (bi > 00) {\n            do\n                i = I[code[--ci]]; // look ahead\n            while (i < 0);\n            i |= I[code[--ci]] << 6 | I[code[--ci]] << 12 | I[code[--ci]] << 18;\n            text[--bi] = (byte) (i);\n            text[--bi] = (byte) (i >>> 8);\n            text[--bi] = (byte) (i >>> 16);\n        }\n        return text;\n    }\n\n    /**\n     * @param code\n     * @return the decoded array\n     */\n    public final static byte[] decodeFailSafe(char[] code) {\n        return decodeFailSafe(code, 0, code.length);\n    }\n\n    /**\n     * This removes all bad characters from the char array. It modifies the\n     * array in the scope of the process !!! Than simply calls decode;\n     * \n     * @param code\n     * @param from\n     * @param len\n     * @return decoded text\n     */\n    public final static byte[] decodeFailSafe(final char[] code,\n            final int from, final int len) {\n        char c;\n        int ci = from;\n        int cj = from;\n        int ce = from + len;\n\n        while (ci < ce) {\n            c = code[ci];\n            if (c == '=')\n                break;\n\n            try {\n                if (I[c] >= 0)\n                    code[cj++] = c;\n            } catch (Exception e) {/**/\n            }\n            ci++;\n        }\n\n        switch (((cj - from) & 0x3)) {\n        case 1:\n            code[cj++] = C[0];\n        case 2:\n            code[cj++] = '=';\n        case 3:\n            code[cj++] = '=';\n        default:\n        }\n        return decode(code, from, cj - from);\n    }\n\n    //------------------ static fields -------------------\n\n    private static final byte[] B = new byte[] { \n            65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, \n            81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99,100,101,102,\n           103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,\n           119,120,121,122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, };\n\n      private static final char[] C = new char[] { \n           'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',\n           'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',\n           'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',\n           'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/', };\n\n      private static final int[]  I = new int[] { \n            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,\n            52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1,  0, -1, -1,\n            -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, \n            15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, \n            -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, \n            41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, };\n\n}",
      "methods" : {
        "Base64" : [ {
          "name" : "toCharArray",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+toCharArray(byte[]):char[]",
          "lineStart" : 57,
          "lineEnd" : 59,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "toCharArray",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+toCharArray(byte[], int, int):char[]",
          "lineStart" : 71,
          "lineEnd" : 109,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):byte[]",
          "lineStart" : 115,
          "lineEnd" : 117,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int):byte[]",
          "lineStart" : 129,
          "lineEnd" : 167,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "int",
          "params" : [ "byte[]", "int", "int", "byte[]", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int, byte[], int):int",
          "lineStart" : 184,
          "lineEnd" : 221,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "void",
          "params" : [ "byte[]", "ICharStream" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], ICharStream):void",
          "lineStart" : 228,
          "lineEnd" : 257,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "toCharArray",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "int" ],
          "visibility" : "public",
          "descriptor" : "+toCharArray(byte[], int):char[]",
          "lineStart" : 268,
          "lineEnd" : 331,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int):byte[]",
          "lineStart" : 343,
          "lineEnd" : 406,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 416,
          "lineEnd" : 418,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], int, int):byte[]",
          "lineStart" : 431,
          "lineEnd" : 465,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[]):byte[]",
          "lineStart" : 474,
          "lineEnd" : 476,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[], int, int):byte[]",
          "lineStart" : 486,
          "lineEnd" : 520,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode76",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode76(char[]):byte[]",
          "lineStart" : 528,
          "lineEnd" : 530,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decodeCRLF",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decodeCRLF(char[], int, int, int):byte[]",
          "lineStart" : 545,
          "lineEnd" : 593,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decodeCRLF",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decodeCRLF(char[], int, int):byte[]",
          "lineStart" : 611,
          "lineEnd" : 638,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decodeFailSafe",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decodeFailSafe(char[]):byte[]",
          "lineStart" : 644,
          "lineEnd" : 646,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decodeFailSafe",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decodeFailSafe(char[], int, int):byte[]",
          "lineStart" : 657,
          "lineEnd" : 687,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "toCharArray",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+toCharArray(byte[]):char[]",
        "lineStart" : 57,
        "lineEnd" : 59,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 416,
        "lineEnd" : 418,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "jadex-nuggets",
        "description" : "The Jadex nuggets is a fast Java bean to\n\t\tXML and back converter.",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "317c5fa8-9c7a-4051-834d-3abc2ab52991" ],
        "_version_" : [ 1521884222221975552 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "janino:janino:2.5.10", "xpp3:xpp3:1.1.4c" ] ],
        "method" : [ [ "false|public static final char[] nuggets.util.Base64.toCharArray(byte[])|nuggets.util.Base64.toCharArray([B)[C|[0]", "false|public static final byte[] nuggets.util.Base64.decode(char[])|nuggets.util.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])|java.lang.AssertionError|actual array was null", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public nuggets.util.Base64()|nuggets.util.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.32222222222222224,
        "sf_complexity_necf" : 63.0,
        "calledClasses_ckjm_ext_ca_max" : 2.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6481481481481483,
        "jmh_thrpt_score_sum" : 112739.81740017908,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 0.9285714285714286,
        "sf_complexity_covered" : 11.0,
        "sf_line_balance" : 4.921568627450981,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 157.3684210526316,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 22.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 111.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 18.999999999999996,
        "entryClass_ckjm_ext_loc" : 3012.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 112739.81740017918,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 51.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 157.36842105263156,
        "calledClasses_ckjm_ext_cbo_mean" : 3.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 19.0,
        "calledClasses_ckjm_ext_rfc_sum" : 22.0,
        "sf_instruction_necf" : 1956.0,
        "calledClasses_ckjm_ext_npm_sum" : 18.0,
        "calledClasses_ckjm_ext_loc_geomean" : 3011.9999999999977,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 111.0,
        "calledClasses_ckjm_ext_loc_min" : 3012.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 1956.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 22.000000000000004,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 2.6,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 302.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 13.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 19.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3222222222222223,
        "sf_line_leanmetric" : 51.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.32222222222222224,
        "calledClasses_ckjm_ext_lcom_sum" : 111.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 110.99999999999997,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 52.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 3.0,
        "calledClasses_ckjm_ext_loc_sum" : 3012.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.32222222222222224,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6481481481481483,
        "entryClass_ckjm_ext_amc" : 157.3684210526316,
        "sf_method_sf" : 13.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 157.3684210526316,
        "calledClasses_ckjm_ext_npm_max" : 18.0,
        "calledClasses_ckjm_ext_ce_sum" : 1.0,
        "calledClasses_ckjm_ext_cbo_min" : 3.0,
        "calledClasses_ckjm_ext_ca_sum" : 2.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 4.403314917127072,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.32222222222222224,
        "jmh_thrpt_score_quadmean" : 112739.81740017908,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 11.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 111.0,
        "sf_line_total" : 302.0,
        "entryClass_ckjm_ext_lcom" : 111.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 1.0,
        "sf_instruction_nf" : 362.0,
        "sf_line_sf" : 251.0,
        "hashCodeCloneCountGlobal" : 5.0,
        "luceneScore" : 6.741079807281494,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 1.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 18.0,
        "sf_instruction_covered" : 362.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 22.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.6481481481481483,
        "entryClass_ckjm_ext_lcom3" : 0.6481481481481483,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 2.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 2.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 52.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 3012.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 362.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 1.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 18.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 3.0,
        "calledClasses_ckjm_ext_amc_max" : 157.3684210526316,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 2.0,
        "calledClasses_ckjm_ext_lcom_min" : 111.0,
        "entryClass_ckjm_ext_ce" : 1.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 5.0,
        "fs_unique" : 0.9285714285714286,
        "calledClasses_ckjm_ext_amc_quadmean" : 157.3684210526316,
        "jmh_thrpt_score_mean" : 112739.81740017908,
        "sf_line_missed" : 251.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 3.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 11.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 2.0,
        "sf_line_leanness" : 0.16887417218543047,
        "calledUncalledMethodRatio" : 0.3157894736842105,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 1594.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 3012.0,
        "calledClasses_ckjm_ext_wmc_mean" : 19.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 5.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.32222222222222224,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.6481481481481483,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.32222222222222224,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 18.0,
        "sf_line_nf" : 51.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 1594.0,
        "sf_method_covered" : 5.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_ce_mean" : 1.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.6481481481481483,
        "sf_complexity_leanness" : 0.1746031746031746,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 18.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 63.0,
        "noCalledMethods" : 6.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 4.7272727272727275,
        "calledClasses_ckjm_ext_npm_min" : 18.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.18507157464212678,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.2777777777777778,
        "calledClasses_ckjm_ext_lcom3_min" : 0.6481481481481483,
        "calledClasses_ckjm_ext_wmc_max" : 19.0,
        "calledClasses_ckjm_ext_rfc_mean" : 22.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 13.0,
        "sf_method_nf" : 5.0,
        "calledClasses_ckjm_ext_npm_geomean" : 17.999999999999996,
        "calledClasses_ckjm_ext_amc_min" : 157.3684210526316,
        "calledClasses_ckjm_ext_wmc_sum" : 19.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 22.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 3012.0,
        "calledClasses_ckjm_ext_ca_mean" : 2.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 18.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 22.0,
        "calledClasses_ckjm_ext_ce_min" : 1.0,
        "projectDeps" : 2.0,
        "jmh_thrpt_score_0" : 112739.81740017908,
        "entryClass_ckjm_ext_wmc" : 19.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 15.0,
        "SINGLE_SMOOP_po" : 7.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "nuggets.util.Base64",
      "uri" : "net.sourceforge.jadex:jadex-nuggets:2.4"
    }, {
      "id" : "db54c419-0d4a-42df-a6b2-a191cff6e109",
      "groupId" : "net.sourceforge.jadex",
      "artifactId" : "jadex-commons",
      "version" : "2.4",
      "name" : "Base64",
      "packagename" : "jadex.commons",
      "score" : 6.76212,
      "hash" : "ab338f0ec0bd5da3c679fb06acfd47bb",
      "content" : "package jadex.commons;\n\n/** \n * Base64<br>\n * Contains lots of utilities for coding and decoding text and character arrays fore\n * and back to the Base64 encoding. It is quite the fastest that I know.\n */\npublic final class Base64\n{\n   // ------------------------ ENCODER --------------------\n   /** This is a wrapper to <code>toCharArray(final byte[] text, final int from, final int len)</code>\n    * @param text\n    * @return an encoded char array from the text\n    */\n   public final static char[] toCharArray(final byte[] text)\n   {\n      return toCharArray(text, 0, text.length);\n   }\n\n   /** This will encode the text without line feeds added\n    * @param text\n    * @param from where to start\n    * @param len how long is the byte array\n    * @return an encoded char array from the text\n    */\n   public final static char[] toCharArray(final byte[] text, final int from, final int len)\n   {\n      final char[] code;\n      int bi = from + len;\n      int ci = (len / 3) << 2;\n      int i;\n      switch (len % 3) { // length of padding\n      case 1:\n         ci += 4;\n         code = new char[ci];\n         i = text[--bi] << 4;\n         code[--ci] = '=';\n         code[--ci] = '=';\n         code[--ci] = C[i & 0x3F];\n         code[--ci] = C[(i >>> 6) & 0x3F];\n         break;\n      case 2:\n         ci += 4;\n         code = new char[ci];\n         i = (text[--bi] & 0xFF) << 2 | text[--bi] << 10;\n         code[--ci] = '=';\n         code[--ci] = C[i & 0x3F];\n         code[--ci] = C[(i >>> 6) & 0x3F];\n         code[--ci] = C[(i >>> 12) & 0x3F];\n         break;\n      default: // 0\n         code = new char[ci];\n      }\n\n      while (ci > 00)\n      {\n         i = (text[--bi] & 0xFF) | (text[--bi] & 0xFF) << 8 | text[--bi] << 16;\n         code[--ci] = C[i & 0x3F];\n         code[--ci] = C[(i >>> 6) & 0x3F];\n         code[--ci] = C[(i >>> 12) & 0x3F];\n         code[--ci] = C[(i >>> 18) & 0x3F];\n      }\n      return code;\n   }\n\n   /** \n    * @param text\n    * @return encoded text\n    */\n   public final static byte[] encode(final byte[] text)\n   {\n      return encode(text, 0, text.length);\n   }\n\n   /** This will encode the text without line feeds added\n    * @param text\n    * @param from where to start\n    * @param len how long is the byte array\n    * @return an encoded byte array from the text\n    */\n   public final static byte[] encode(final byte[] text, final int from, final int len)\n   {\n      final byte[] code;\n      int bi = from + len;\n      int ci = (len / 3) << 2;\n      int i;\n      switch (len % 3) { // length of padding\n      case 1:\n         ci += 4;\n         code = new byte[ci];\n         i = text[--bi] << 4;\n         code[--ci] = '=';\n         code[--ci] = '=';\n         code[--ci] = B[i & 0x3F];\n         code[--ci] = B[(i >>> 6) & 0x3F];\n         break;\n      case 2:\n         ci += 4;\n         code = new byte[ci];\n         i = (text[--bi] & 0xFF) << 2 | text[--bi] << 10;\n         code[--ci] = '=';\n         code[--ci] = B[i & 0x3F];\n         code[--ci] = B[(i >>> 6) & 0x3F];\n         code[--ci] = B[(i >>> 12) & 0x3F];\n         break;\n      default: // 0\n         code = new byte[ci];\n      }\n\n      while (ci > 00)\n      {\n         i = (text[--bi] & 0xFF) | (text[--bi] & 0xFF) << 8 | text[--bi] << 16;\n         code[--ci] = B[i & 0x3F];\n         code[--ci] = B[(i >>> 6) & 0x3F];\n         code[--ci] = B[(i >>> 12) & 0x3F];\n         code[--ci] = B[(i >>> 18) & 0x3F];\n      }\n      return code;\n   }\n\n   /** This will encode the text without line feeds added. It will write all output\n    * to the dest buffer begining from dstart.<br>\n    * Both src and dest may be the same provided (sstart<=dstart).\n    * @param src\n    * @param sstart where to start\n    * @param len how long is the byte array\n    * @param dest\n    * @param dstart\n    * @return index to the buffer byte ofter the text\n    */\n   public final static int encode(final byte[] src, final int sstart, final int len, final byte[] dest, final int dstart)\n   {\n      int bi = sstart + len;\n      int ci = ((len / 3) << 2) + dstart;\n      int dend;\n      int i;\n      switch (len % 3) { // length of padding\n      case 1:\n         ci += 4;\n         dend = ci;\n         i = src[--bi] << 4;\n         dest[--ci] = '=';\n         dest[--ci] = '=';\n         dest[--ci] = B[i & 0x3F];\n         dest[--ci] = B[(i >>> 6) & 0x3F];\n         break;\n      case 2:\n         ci += 4;\n         dend = ci;\n         i = (src[--bi] & 0xFF) << 2 | src[--bi] << 10;\n         dest[--ci] = '=';\n         dest[--ci] = B[i & 0x3F];\n         dest[--ci] = B[(i >>> 6) & 0x3F];\n         dest[--ci] = B[(i >>> 12) & 0x3F];\n         break;\n      default:\n         dend = ci;\n      }\n\n      while (ci > dstart)\n      {\n         i = (src[--bi] & 0xFF) | (src[--bi] & 0xFF) << 8 | src[--bi] << 16;\n         dest[--ci] = B[i & 0x3F];\n         dest[--ci] = B[(i >>> 6) & 0x3F];\n         dest[--ci] = B[(i >>> 12) & 0x3F];\n         dest[--ci] = B[(i >>> 18) & 0x3F];\n      }\n      return dend;\n   }\n\n   /** This will encode the text. The CRLF comes after <code>lb</code> characters.\n    * @param text\n    * @param llen the length of line (without CRLF) must be a multiple of 4\n    * @return an encoded char array from the text\n    */\n   public final static char[] toCharArray(final byte[] text, final int llen)\n   {\n      final char[] code;\n      int bi = text.length;\n      int ci = (bi / 3) << 2;\n      int i;\n      //@goal determine padding\n      switch (bi % 3) { // length of padding\n      case 1: // @goal pad two text\n         ci += 4;\n         ci += (ci / llen) << 1;\n         code = new char[ci];\n\n         if (ci % llen == 4)\n         {\n            code[--ci] = '\\n';\n            code[--ci] = '\\r';\n         }\n         i = text[--bi] << 4;\n         code[--ci] = '=';\n         code[--ci] = '=';\n         code[--ci] = C[i & 0x3F];\n         code[--ci] = C[(i >>> 6) & 0x3F];\n         break;\n      case 2: // @goal pad one byte\n         ci += 4;\n         ci += (ci / llen) << 1;\n         code = new char[ci];\n\n         if (ci % llen == 4)\n         {\n            code[--ci] = '\\n';\n            code[--ci] = '\\r';\n         }\n         i = (text[--bi] & 0xFF) << 2 | text[--bi] << 10;\n         code[--ci] = '=';\n         code[--ci] = C[i & 0x3F];\n         code[--ci] = C[(i >>> 6) & 0x3F];\n         code[--ci] = C[(i >>> 12) & 0x3F];\n         break;\n      default: // 0\n         ci += (ci / llen) << 1;\n         code = new char[ci];\n      }\n      //@goal calculate the line breaking constant and variable\n      int lmax = (llen >>> 2) - 1; // will break after this many quadruples\n      int li = (ci % (llen + 2)) >>> 2; // initialize the counter\n\n      while (bi > 00)\n      {\n\n         if (li > 0)\n         {\n            --li;\n\n         }\n         else\n         {\n            code[--ci] = '\\n';\n            code[--ci] = '\\r';\n            li = lmax;\n         }\n         i = (text[--bi] & 0xFF) | (text[--bi] & 0xFF) << 8 | text[--bi] << 16;\n         code[--ci] = C[i & 0x3F];\n         code[--ci] = C[(i >>> 6) & 0x3F];\n         code[--ci] = C[(i >>> 12) & 0x3F];\n         code[--ci] = C[(i >>> 18) & 0x3F];\n      }\n      return code;\n   }\n\n   /** This will encode the text. The CRLF comes after <code>lb</code> characters.\n    * @param text\n    * @param llen the length of line (without CRLF) must be a multiple of 4\n    * @return an encoded byte array from the text\n    */\n   public final static byte[] encode(final byte[] text, final int llen)\n   {\n      final byte[] code;\n      int bi = text.length;\n      int ci = (bi / 3) << 2;\n      int i;\n      //@goal determine padding\n      switch (bi % 3) { // length of padding\n      case 1: // @goal pad two text\n         ci += 4;\n         ci += (ci / llen) << 1;\n         code = new byte[ci];\n\n         if (ci % llen == 4)\n         {\n            code[--ci] = '\\n';\n            code[--ci] = '\\r';\n         }\n         i = text[--bi] << 4;\n         code[--ci] = '=';\n         code[--ci] = '=';\n         code[--ci] = B[i & 0x3F];\n         code[--ci] = B[(i >>> 6) & 0x3F];\n         break;\n      case 2: // @goal pad one byte\n         ci += 4;\n         ci += (ci / llen) << 1;\n         code = new byte[ci];\n\n         if (ci % llen == 4)\n         {\n            code[--ci] = '\\n';\n            code[--ci] = '\\r';\n         }\n         i = (text[--bi] & 0xFF) << 2 | text[--bi] << 10;\n         code[--ci] = '=';\n         code[--ci] = B[i & 0x3F];\n         code[--ci] = B[(i >>> 6) & 0x3F];\n         code[--ci] = B[(i >>> 12) & 0x3F];\n         break;\n      default: // 0\n         ci += (ci / llen) << 1;\n         code = new byte[ci];\n      }\n      //@goal calculate the line breaking constant and variable\n      int lmax = (llen >>> 2) - 1; // will break after this many quadruples\n      int li = (ci % (llen + 2)) >>> 2; // initialize the counter\n\n      while (ci > 00)\n      {\n         if (li > 0)\n         {\n            --li;\n         }\n         else\n         {\n            code[--ci] = '\\n';\n            code[--ci] = '\\r';\n            li = lmax;\n         }\n         i = (text[--bi] & 0xFF) | (text[--bi] & 0xFF) << 8 | text[--bi] << 16;\n         code[--ci] = B[i & 0x3F];\n         code[--ci] = B[(i >>> 6) & 0x3F];\n         code[--ci] = B[(i >>> 12) & 0x3F];\n         code[--ci] = B[(i >>> 18) & 0x3F];\n      }\n      return code;\n   }\n\n   //###################### DECODER #####################################\n   /** This is a wrapper to <code>decode(final char[] code, final int from, final int len)</code>\n    * @param code\n    * @return a byte array holding encoded char data\n    */\n   public final static byte[] decode(final char[] code)\n   {\n      return decode(code, 0, code.length);\n   }\n\n   /** This will decode base64 data without line feeds.\n    * The char array should be multiple of 4 in length.\n    * @param code\n    * @param from start position in code\n    * @param len length of the part\n    * @return the decoded sequence of text\n    */\n   public final static byte[] decode(final char[] code, final int from, final int len)\n   {\n      int bi = (len >>> 2) * 3;\n      int ci = from + len;\n      int i;\n      final byte[] text;\n\n      if (code[ci - 1] == '=')\n      {\n         if (code[ci - 2] == '=')\n         { // padding 2\n            ci -= 3;\n            bi -= 2;\n            text = new byte[bi];\n            text[--bi] = (byte) ((I[code[ci]] | I[code[--ci]] << 6) >> 4);\n         }\n         else\n         { // padding 1\n            ci -= 2;\n            --bi;\n            text = new byte[bi];\n            i = I[code[ci]] | I[code[--ci]] << 6 | I[code[--ci]] << 12;\n            text[--bi] = (byte) (i >>> 2);\n            text[--bi] = (byte) (i >>> 10);\n         }\n\n      }\n      else\n      {\n         text = new byte[bi];\n      }\n\n      while (bi > 00)\n      {\n         i = I[code[--ci]] | I[code[--ci]] << 6 | I[code[--ci]] << 12 | I[code[--ci]] << 18;\n         text[--bi] = (byte) (i);\n         text[--bi] = (byte) (i >>> 8);\n         text[--bi] = (byte) (i >>> 16);\n      }\n      return text;\n   }\n\n   /** \n    * This is a wrapper to <code>decode(final byte[] code, final int from, final int len)</code>\n    * @param code\n    * @return a byte array holding encoded char data\n    */\n   public final static byte[] decode(final byte[] code)\n   {\n      return decode(code, 0, code.length);\n   }\n\n   /** \n    * a copy of the char part\n    * @param src\n    * @param from\n    * @param len\n    * @return decoded byte array\n    */\n   public final static byte[] decode(final byte[] src, final int from, final int len)\n   {\n      int bi = (len >>> 2) * 3;\n      int ci = from + len;\n      int i;\n      final byte[] text;\n\n      if (src[ci - 1] == '=')\n      {\n         if (src[ci - 2] == '=')\n         { // padding 2\n            ci -= 3;\n            bi -= 2;\n            text = new byte[bi];\n            text[--bi] = (byte) ((I[src[ci]] | I[src[--ci]] << 6) >> 4);\n         }\n         else\n         { // padding 1\n            ci -= 2;\n            --bi;\n            text = new byte[bi];\n            i = I[src[ci]] | I[src[--ci]] << 6 | I[src[--ci]] << 12;\n            text[--bi] = (byte) (i >>> 2);\n            text[--bi] = (byte) (i >>> 10);\n         }\n\n      }\n      else\n      {\n         text = new byte[bi];\n      }\n\n      while (bi > 00)\n      {\n         i = I[src[--ci]] | I[src[--ci]] << 6 | I[src[--ci]] << 12 | I[src[--ci]] << 18;\n         text[--bi] = (byte) (i);\n         text[--bi] = (byte) (i >>> 8);\n         text[--bi] = (byte) (i >>> 16);\n      }\n      return text;\n   }\n\n   /** \n    * <code>decodeCRLF(code, 0, code.length, 76)</code>\n    * @param code\n    * @return the encoded text;\n    */\n   public final static byte[] decode76(final char[] code)\n   {\n      return decodeCRLF(code, 0, code.length, 76);\n   }\n\n   /** This will decode base64 data. The starting point and length must be accurate.\n    * The data must end on a multiple of 4 boundary and must include the '=' padding, if any.\n    * @param code\n    * @param from\n    * @param len the length of data\n    * @param llen the line length of this base64 (without CRLF)\n    * @return the decoded sequence of text\n    */\n   public final static byte[] decodeCRLF(final char[] code, final int from, final int len, final int llen)\n   {\n      int bi = ((len - ((len / (llen + 2)) << 1)) >>> 2) * 3;\n      int ci = from + len;\n      int lmax = (llen >>> 2);\n      int li = (ci % (llen + 2)) >>> 2;\n      int i;\n      if (li == 0)\n      { // skip crlf\n         ci -= 2;\n         li = lmax;\n      }\n      final byte[] text;\n\n      if (code[ci - 1] == '=')\n      {\n         if (code[ci - 2] == '=')\n         { // padding 2\n            ci -= 3;\n            bi -= 2;\n            text = new byte[bi];\n            text[--bi] = (byte) ((I[code[ci]] | I[code[--ci]] << 6) >> 4);\n            --li;\n         }\n         else\n         { // padding 1\n            ci -= 2;\n            --bi;\n            text = new byte[bi];\n            i = I[code[ci]] | I[code[--ci]] << 6 | I[code[--ci]] << 12;\n            text[--bi] = (byte) (i >>> 2);\n            text[--bi] = (byte) (i >>> 10);\n            --li;\n         }\n\n      }\n      else\n      {\n         text = new byte[bi];\n      }\n\n      while (bi > 00)\n      {\n\n         if (li == 0)\n         {\n            ci -= 2;\n            li = lmax;\n         }\n         i = I[code[--ci]] | I[code[--ci]] << 6 | I[code[--ci]] << 12 | I[code[--ci]] << 18;\n         text[--bi] = (byte) (i);\n         text[--bi] = (byte) (i >>> 8);\n         text[--bi] = (byte) (i >>> 16);\n         --li;\n      }\n      return text;\n   }\n\n   /** \n    * This will decode base64 data with CRLF at 4 character boundary.<br>\n    * The sequence may look like:<p>\n    * ABCDABCD\\r\\nABCDABCD or even ABCDABCD#####ABCD###ABCD#ABCD.</p>\n    * <p>\n    * The array must be multiple of 4 + number of CRLF or illegal characters and \n    * the line length may vary.</p>\n    * @param code\n    * @param from\n    * @param len\n    * @return the decoded sequence of text\n    */\n   public final static byte[] decodeCRLF(final char[] code, final int from, final int len)\n   {\n      int bi = len;\n      int ci = from + len;\n      int i;\n      //@goal determine the number of valid code\n\n      while (ci > from)\n      {\n         if (I[code[--ci]] < 0) --bi;\n      }\n      //@goal allocate byte array\n      bi = (bi >>> 2) * 3;\n      final byte[] text = new byte[bi];\n      //@goal decode the sequence\n      ci = from + len;\n\n      while (bi > 00)\n      {\n         do\n            i = I[code[--ci]]; // look ahead\n         while (i < 0);\n         i |= I[code[--ci]] << 6 | I[code[--ci]] << 12 | I[code[--ci]] << 18;\n         text[--bi] = (byte) (i);\n         text[--bi] = (byte) (i >>> 8);\n         text[--bi] = (byte) (i >>> 16);\n      }\n      return text;\n   }\n\n   /** \n    * @param code\n    * @return the decoded array\n    */\n   public final static byte[] decodeFailSafe(char[] code)\n   {\n      return decodeFailSafe(code, 0, code.length);\n   }\n\n   /** \n    * This removes all bad characters from the char array. It modifies the array\n    * in the scope of the process !!! Than simply calls decode;\n    * @param code\n    * @param from\n    * @param len\n    * @return decoded text\n    */\n   public final static byte[] decodeFailSafe(final char[] code, final int from, final int len)\n   {\n      char c;\n      int ci = from;\n      int cj = from;\n      int ce = from + len;\n\n      while (ci < ce)\n      {\n         c = code[ci];\n         if (c == '=') break;\n\n         try\n         {\n            if (I[c] >= 0) code[cj++] = c;\n         }\n         catch (Exception e)\n         {/**/}\n         ci++;\n      }\n\n      switch (((cj - from) & 0x3)) {\n      case 1:\n         code[cj++] = C[0];\n      case 2:\n         code[cj++] = '=';\n      case 3:\n         code[cj++] = '=';\n      default:\n      }\n      return decode(code, from, cj - from);\n   }\n\n   //------------------ static fields -------------------\n\n   private static final byte[] B = new byte[] { \n         65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, \n         81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99,100,101,102,\n        103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,\n        119,120,121,122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, };\n\n   private static final char[] C = new char[] { \n        'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',\n        'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',\n        'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',\n        'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/', };\n\n   private static final int[]  I = new int[] { \n         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,\n         52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1,  0, -1, -1,\n         -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, \n         15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, \n         -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, \n         41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, };\n}",
      "methods" : {
        "Base64" : [ {
          "name" : "toCharArray",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+toCharArray(byte[]):char[]",
          "lineStart" : 15,
          "lineEnd" : 18,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "toCharArray",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+toCharArray(byte[], int, int):char[]",
          "lineStart" : 26,
          "lineEnd" : 64,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):byte[]",
          "lineStart" : 70,
          "lineEnd" : 73,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int):byte[]",
          "lineStart" : 81,
          "lineEnd" : 119,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "int",
          "params" : [ "byte[]", "int", "int", "byte[]", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int, byte[], int):int",
          "lineStart" : 131,
          "lineEnd" : 169,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "toCharArray",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "int" ],
          "visibility" : "public",
          "descriptor" : "+toCharArray(byte[], int):char[]",
          "lineStart" : 176,
          "lineEnd" : 245,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int):byte[]",
          "lineStart" : 252,
          "lineEnd" : 319,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 326,
          "lineEnd" : 329,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], int, int):byte[]",
          "lineStart" : 338,
          "lineEnd" : 378,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[]):byte[]",
          "lineStart" : 385,
          "lineEnd" : 388,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[], int, int):byte[]",
          "lineStart" : 397,
          "lineEnd" : 437,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "decode76",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode76(char[]):byte[]",
          "lineStart" : 444,
          "lineEnd" : 447,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "decodeCRLF",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decodeCRLF(char[], int, int, int):byte[]",
          "lineStart" : 457,
          "lineEnd" : 513,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "decodeCRLF",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decodeCRLF(char[], int, int):byte[]",
          "lineStart" : 527,
          "lineEnd" : 555,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "decodeFailSafe",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decodeFailSafe(char[]):byte[]",
          "lineStart" : 561,
          "lineEnd" : 564,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        }, {
          "name" : "decodeFailSafe",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decodeFailSafe(char[], int, int):byte[]",
          "lineStart" : 574,
          "lineEnd" : 605,
          "columnStart" : 4,
          "columnEnd" : 4,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "toCharArray",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+toCharArray(byte[]):char[]",
        "lineStart" : 15,
        "lineEnd" : 18,
        "columnStart" : 4,
        "columnEnd" : 4,
        "initializer" : false
      }, {
        "name" : "decode76",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode76(char[]):byte[]",
        "lineStart" : 444,
        "lineEnd" : 447,
        "columnStart" : 4,
        "columnEnd" : 4,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "jadex-commons",
        "description" : "Jadex commons is a base package containing frequently used\n\t\tfunctionality missing in standard Java utility classes.",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "0aeb390f-e2ba-4f64-ab50-b12267810d16" ],
        "_version_" : [ 1521884373026078720 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "bouncycastle:bcprov-jdk15:140" ] ],
        "method" : [ [ "false|public static final char[] jadex.commons.Base64.toCharArray(byte[])|jadex.commons.Base64.toCharArray([B)[C|[0]", "false|public static final byte[] jadex.commons.Base64.decode76(char[])|jadex.commons.Base64.decode76([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])|java.lang.AssertionError|actual array was null", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public jadex.commons.Base64()|jadex.commons.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.39705882352941174,
        "sf_complexity_necf" : 59.0,
        "calledClasses_ckjm_ext_ca_max" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6470588235294118,
        "jmh_thrpt_score_sum" : 118173.2801596759,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 0.9285714285714286,
        "sf_complexity_covered" : 13.0,
        "sf_line_balance" : 3.4838709677419355,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 158.0,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 19.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 101.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 17.999999999999996,
        "entryClass_ckjm_ext_loc" : 2865.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 118173.28015967588,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 62.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 158.00000000000003,
        "calledClasses_ckjm_ext_cbo_mean" : 0.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 18.0,
        "calledClasses_ckjm_ext_rfc_sum" : 19.0,
        "sf_instruction_necf" : 1810.0,
        "calledClasses_ckjm_ext_npm_sum" : 17.0,
        "calledClasses_ckjm_ext_loc_geomean" : 2864.9999999999986,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 101.0,
        "calledClasses_ckjm_ext_loc_min" : 2865.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 1810.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 18.999999999999996,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 2.4,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 278.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 12.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 18.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.39705882352941174,
        "sf_line_leanmetric" : 62.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.39705882352941174,
        "calledClasses_ckjm_ext_lcom_sum" : 101.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 101.00000000000003,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 46.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 0.0,
        "calledClasses_ckjm_ext_loc_sum" : 2865.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.39705882352941174,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6470588235294118,
        "entryClass_ckjm_ext_amc" : 158.0,
        "sf_method_sf" : 12.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 158.0,
        "calledClasses_ckjm_ext_npm_max" : 17.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 0.0,
        "calledClasses_ckjm_ext_ca_sum" : 0.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 3.5707070707070705,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.39705882352941174,
        "jmh_thrpt_score_quadmean" : 118173.2801596759,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 13.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 101.0,
        "sf_line_total" : 278.0,
        "entryClass_ckjm_ext_lcom" : 101.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 396.0,
        "sf_line_sf" : 216.0,
        "hashCodeCloneCountGlobal" : 2.0,
        "luceneScore" : 6.762119770050049,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 17.0,
        "sf_instruction_covered" : 396.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 19.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.6470588235294118,
        "entryClass_ckjm_ext_lcom3" : 0.6470588235294118,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 0.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 0.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 46.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 2865.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 396.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 17.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_max" : 158.0,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 0.0,
        "calledClasses_ckjm_ext_lcom_min" : 101.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 5.0,
        "fs_unique" : 0.9285714285714286,
        "calledClasses_ckjm_ext_amc_quadmean" : 158.0,
        "jmh_thrpt_score_mean" : 118173.2801596759,
        "sf_line_missed" : 216.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 0.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 13.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 0.0,
        "sf_line_leanness" : 0.22302158273381295,
        "calledUncalledMethodRatio" : 0.3333333333333333,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 1414.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 2865.0,
        "calledClasses_ckjm_ext_wmc_mean" : 18.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 2.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.39705882352941174,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.6470588235294118,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.39705882352941174,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 17.0,
        "sf_line_nf" : 62.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 1414.0,
        "sf_method_covered" : 5.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.6470588235294118,
        "sf_complexity_leanness" : 0.22033898305084745,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 17.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 59.0,
        "noCalledMethods" : 6.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 3.5384615384615383,
        "calledClasses_ckjm_ext_npm_min" : 17.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.21878453038674034,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.29411764705882354,
        "calledClasses_ckjm_ext_lcom3_min" : 0.6470588235294118,
        "calledClasses_ckjm_ext_wmc_max" : 18.0,
        "calledClasses_ckjm_ext_rfc_mean" : 19.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 12.0,
        "sf_method_nf" : 5.0,
        "calledClasses_ckjm_ext_npm_geomean" : 17.0,
        "calledClasses_ckjm_ext_amc_min" : 158.0,
        "calledClasses_ckjm_ext_wmc_sum" : 18.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 19.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 2865.0,
        "calledClasses_ckjm_ext_ca_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 17.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 19.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 1.0,
        "jmh_thrpt_score_0" : 118173.2801596759,
        "entryClass_ckjm_ext_wmc" : 18.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 14.0,
        "SINGLE_SMOOP_po" : 6.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "jadex.commons.Base64",
      "uri" : "net.sourceforge.jadex:jadex-commons:2.4"
    }, {
      "id" : "e06e39e6-00bf-47c3-b788-5b9f5223b1d8",
      "groupId" : "org.imixs.workflow",
      "artifactId" : "imixs-workflow-xml",
      "version" : "2.1.1",
      "name" : "Base64",
      "packagename" : "org.imixs.workflow.webservices",
      "score" : 6.4814553,
      "hash" : "79d716b9afdfac917fade25005dec19a",
      "content" : "package org.imixs.workflow.webservices;\n\n//////////////////////license & copyright header/////////////////////////\n////\n//Base64 - encode/decode data using the Base64 encoding scheme     //\n////\n//Copyright (c) 1998 by Kevin Kelley                   //\n////\n//This library is free software; you can redistribute it and/or       //\n//modify it under the terms of the GNU Lesser General Public          //\n//License as published by the Free Software Foundation; either        //\n//version 2.1 of the License, or (at your option) any later version.  //\n////\n//This library is distributed in the hope that it will be useful,     //\n//but WITHOUT ANY WARRANTY; without even the implied warranty of      //\n//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       //\n//GNU Lesser General Public License for more details.                 //\n////\n//You should have received a copy of the GNU Lesser General Public    //\n//License along with this library; if not, write to the Free Software //\n//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA           //\n//02111-1307, USA, or contact the author:                             //\n////\n//Kevin Kelley <kelley@ruralnet.net> - 30718 Rd. 28, La Junta, CO,    //\n//81050  USA.                                                         //\n////\n////////////////////end license & copyright header///////////////////////\n\nimport java.io.*; // needed only for main() method.\n\n/**\n * Provides encoding of raw bytes to base64-encoded characters, and decoding of\n * base64 characters to raw bytes.\n * \n * @author Kevin Kelley (kelley@ruralnet.net)\n * @version 1.3 date 06 August 1998 modified 14 February 2000 modified 22\n *          September 2000\n */\npublic class Base64 {\n\n\t/**\n\t * returns an array of base64-encoded characters to represent the passed\n\t * data array.\n\t * \n\t * @param data\n\t *            the array of bytes to encode\n\t * @return base64-coded character array.\n\t */\n\tstatic public char[] encode(byte[] data) {\n\t\tchar[] out = new char[((data.length + 2) / 3) * 4];\n\n\t\t//\n\t\t// 3 bytes encode to 4 chars. Output is always an even\n\t\t// multiple of 4 characters.\n\t\t//\n\t\tfor (int i = 0, index = 0; i < data.length; i += 3, index += 4) {\n\t\t\tboolean quad = false;\n\t\t\tboolean trip = false;\n\n\t\t\tint val = (0xFF & (int) data[i]);\n\t\t\tval <<= 8;\n\t\t\tif ((i + 1) < data.length) {\n\t\t\t\tval |= (0xFF & (int) data[i + 1]);\n\t\t\t\ttrip = true;\n\t\t\t}\n\t\t\tval <<= 8;\n\t\t\tif ((i + 2) < data.length) {\n\t\t\t\tval |= (0xFF & (int) data[i + 2]);\n\t\t\t\tquad = true;\n\t\t\t}\n\t\t\tout[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];\n\t\t\tval >>= 6;\n\t\t\tout[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];\n\t\t\tval >>= 6;\n\t\t\tout[index + 1] = alphabet[val & 0x3F];\n\t\t\tval >>= 6;\n\t\t\tout[index + 0] = alphabet[val & 0x3F];\n\t\t}\n\t\treturn out;\n\t}\n\n\t/**\n\t * Decodes a BASE-64 encoded stream to recover the original data. White\n\t * space before and after will be trimmed away, but no other manipulation of\n\t * the input will be performed.\n\t * \n\t * As of version 1.2 this method will properly handle input containing junk\n\t * characters (newlines and the like) rather than throwing an error. It does\n\t * this by pre-parsing the input and generating from that a count of VALID\n\t * input characters.\n\t **/\n\tstatic public byte[] decode(char[] data) {\n\t\t// as our input could contain non-BASE64 data (newlines,\n\t\t// whitespace of any sort, whatever) we must first adjust\n\t\t// our count of USABLE data so that...\n\t\t// (a) we don't misallocate the output array, and\n\t\t// (b) think that we miscalculated our data length\n\t\t// just because of extraneous throw-away junk\n\n\t\tint tempLen = data.length;\n\t\tfor (int ix = 0; ix < data.length; ix++) {\n\t\t\tif ((data[ix] > 255) || codes[data[ix]] < 0)\n\t\t\t\t--tempLen; // ignore non-valid chars and padding\n\t\t}\n\t\t// calculate required length:\n\t\t// -- 3 bytes for every 4 valid base64 chars\n\t\t// -- plus 2 bytes if there are 3 extra base64 chars,\n\t\t// or plus 1 byte if there are 2 extra.\n\n\t\tint len = (tempLen / 4) * 3;\n\t\tif ((tempLen % 4) == 3)\n\t\t\tlen += 2;\n\t\tif ((tempLen % 4) == 2)\n\t\t\tlen += 1;\n\n\t\tbyte[] out = new byte[len];\n\n\t\tint shift = 0; // # of excess bits stored in accum\n\t\tint accum = 0; // excess bits\n\t\tint index = 0;\n\n\t\t// we now go through the entire array (NOT using the 'tempLen' value)\n\t\tfor (int ix = 0; ix < data.length; ix++) {\n\t\t\tint value = (data[ix] > 255) ? -1 : codes[data[ix]];\n\n\t\t\tif (value >= 0) // skip over non-code\n\t\t\t{\n\t\t\t\taccum <<= 6; // bits shift up by 6 each time thru\n\t\t\t\tshift += 6; // loop, with new bits being put in\n\t\t\t\taccum |= value; // at the bottom.\n\t\t\t\tif (shift >= 8) // whenever there are 8 or more shifted in,\n\t\t\t\t{\n\t\t\t\t\tshift -= 8; // write them out (from the top, leaving any\n\t\t\t\t\tout[index++] = // excess at the bottom for next iteration.\n\t\t\t\t\t(byte) ((accum >> shift) & 0xff);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// we will also have skipped processing a padding null byte ('=')\n\t\t\t// here;\n\t\t\t// these are used ONLY for padding to an even length and do not\n\t\t\t// legally\n\t\t\t// occur as encoded data. for this reason we can ignore the fact\n\t\t\t// that\n\t\t\t// no index++ operation occurs in that special case: the out[] array\n\t\t\t// is\n\t\t\t// initialized to all-zero bytes to start with and that works to our\n\t\t\t// advantage in this combination.\n\t\t}\n\n\t\t// if there is STILL something wrong we just have to throw up now!\n\t\tif (index != out.length) {\n\t\t\tthrow new Error(\"Miscalculated data length (wrote \" + index\n\t\t\t\t\t+ \" instead of \" + out.length + \")\");\n\t\t}\n\n\t\treturn out;\n\t}\n\n\t//\n\t// code characters for values 0..63\n\t//\n\tstatic private char[] alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"\n\t\t\t.toCharArray();\n\n\t//\n\t// lookup table for converting base64 characters to value in range 0..63\n\t//\n\tstatic private byte[] codes = new byte[256];\n\tstatic {\n\t\tfor (int i = 0; i < 256; i++)\n\t\t\tcodes[i] = -1;\n\t\tfor (int i = 'A'; i <= 'Z'; i++)\n\t\t\tcodes[i] = (byte) (i - 'A');\n\t\tfor (int i = 'a'; i <= 'z'; i++)\n\t\t\tcodes[i] = (byte) (26 + i - 'a');\n\t\tfor (int i = '0'; i <= '9'; i++)\n\t\t\tcodes[i] = (byte) (52 + i - '0');\n\t\tcodes['+'] = 62;\n\t\tcodes['/'] = 63;\n\t}\n\n\t// /////////////////////////////////////////////////\n\t// remainder (main method and helper functions) is\n\t// for testing purposes only, feel free to clip it.\n\t// /////////////////////////////////////////////////\n\n\tpublic static void main(String[] args) {\n\t\tboolean decode = false;\n\n\t\tif (args.length == 0) {\n\t\t\tSystem.out.println(\"usage:  java Base64 [-d[ecode]] filename\");\n\t\t\tSystem.exit(0);\n\t\t}\n\t\tfor (int i = 0; i < args.length; i++) {\n\t\t\tif (\"-decode\".equalsIgnoreCase(args[i]))\n\t\t\t\tdecode = true;\n\t\t\telse if (\"-d\".equalsIgnoreCase(args[i]))\n\t\t\t\tdecode = true;\n\t\t}\n\n\t\tString filename = args[args.length - 1];\n\t\tFile file = new File(filename);\n\t\tif (!file.exists()) {\n\t\t\tSystem.out\n\t\t\t\t\t.println(\"Error:  file '\" + filename + \"' doesn't exist!\");\n\t\t\tSystem.exit(0);\n\t\t}\n\n\t\tif (decode) {\n\t\t\tchar[] encoded = readChars(file);\n\t\t\tbyte[] decoded = decode(encoded);\n\t\t\twriteBytes(file, decoded);\n\t\t} else {\n\t\t\tbyte[] decoded = readBytes(file);\n\t\t\tchar[] encoded = encode(decoded);\n\t\t\twriteChars(file, encoded);\n\t\t}\n\t}\n\n\tprivate static byte[] readBytes(File file) {\n\t\tByteArrayOutputStream baos = new ByteArrayOutputStream();\n\t\ttry {\n\t\t\tInputStream fis = new FileInputStream(file);\n\t\t\tInputStream is = new BufferedInputStream(fis);\n\t\t\tint count = 0;\n\t\t\tbyte[] buf = new byte[16384];\n\t\t\twhile ((count = is.read(buf)) != -1) {\n\t\t\t\tif (count > 0)\n\t\t\t\t\tbaos.write(buf, 0, count);\n\t\t\t}\n\t\t\tis.close();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\treturn baos.toByteArray();\n\t}\n\n\tprivate static char[] readChars(File file) {\n\t\tCharArrayWriter caw = new CharArrayWriter();\n\t\ttry {\n\t\t\tReader fr = new FileReader(file);\n\t\t\tReader in = new BufferedReader(fr);\n\t\t\tint count = 0;\n\t\t\tchar[] buf = new char[16384];\n\t\t\twhile ((count = in.read(buf)) != -1) {\n\t\t\t\tif (count > 0)\n\t\t\t\t\tcaw.write(buf, 0, count);\n\t\t\t}\n\t\t\tin.close();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\treturn caw.toCharArray();\n\t}\n\n\tprivate static void writeBytes(File file, byte[] data) {\n\t\ttry {\n\t\t\tOutputStream fos = new FileOutputStream(file);\n\t\t\tOutputStream os = new BufferedOutputStream(fos);\n\t\t\tos.write(data);\n\t\t\tos.close();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\tprivate static void writeChars(File file, char[] data) {\n\t\ttry {\n\t\t\tWriter fos = new FileWriter(file);\n\t\t\tWriter os = new BufferedWriter(fos);\n\t\t\tos.write(data);\n\t\t\tos.close();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 49,
          "lineEnd" : 80,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 92,
          "lineEnd" : 157,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "main",
          "returnParam" : "void",
          "params" : [ "String[]" ],
          "visibility" : "public",
          "descriptor" : "+main(String[]):void",
          "lineStart" : 187,
          "lineEnd" : 218,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "readBytes",
          "returnParam" : "byte[]",
          "params" : [ "File" ],
          "visibility" : "private",
          "descriptor" : "-readBytes(File):byte[]",
          "lineStart" : 220,
          "lineEnd" : 237,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "readChars",
          "returnParam" : "char[]",
          "params" : [ "File" ],
          "visibility" : "private",
          "descriptor" : "-readChars(File):char[]",
          "lineStart" : 239,
          "lineEnd" : 256,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "writeBytes",
          "returnParam" : "void",
          "params" : [ "File", "byte[]" ],
          "visibility" : "private",
          "descriptor" : "-writeBytes(File, byte[]):void",
          "lineStart" : 258,
          "lineEnd" : 267,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "writeChars",
          "returnParam" : "void",
          "params" : [ "File", "char[]" ],
          "visibility" : "private",
          "descriptor" : "-writeChars(File, char[]):void",
          "lineStart" : 269,
          "lineEnd" : 278,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 49,
        "lineEnd" : 80,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 92,
        "lineEnd" : 157,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "Interfaces",
        "description" : "Imixs Workflow XML provides xml libraries to extend the Imixs Workflow API based on xml standards.",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "6597ce27-7023-40d7-af61-14d06ec5bb5b" ],
        "_version_" : [ 1521884502533603328 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "org.imixs.workflow:imixs-workflow-api:2.1.2" ] ],
        "method" : [ [ "false|public static char[] org.imixs.workflow.webservices.Base64.encode(byte[])|org.imixs.workflow.webservices.Base64.encode([B)[C|[0]", "false|public static byte[] org.imixs.workflow.webservices.Base64.decode(char[])|org.imixs.workflow.webservices.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public org.imixs.workflow.webservices.Base64()|org.imixs.workflow.webservices.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.25,
        "sf_complexity_necf" : 33.0,
        "calledClasses_ckjm_ext_ca_max" : 2.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.75,
        "jmh_thrpt_score_sum" : 229603.0741680297,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 18.0,
        "sf_line_balance" : 1.3829787234042554,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 60.55555555555556,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 44.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 32.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 9.000000000000002,
        "entryClass_ckjm_ext_loc" : 556.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 229603.0741680295,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 47.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 60.555555555555564,
        "calledClasses_ckjm_ext_cbo_mean" : 2.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 9.0,
        "calledClasses_ckjm_ext_rfc_sum" : 44.0,
        "sf_instruction_necf" : 473.0,
        "calledClasses_ckjm_ext_npm_sum" : 4.0,
        "calledClasses_ckjm_ext_loc_geomean" : 556.0,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 32.0,
        "calledClasses_ckjm_ext_loc_min" : 556.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 473.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 43.99999999999999,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 1.6666666666666667,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 112.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 5.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 9.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.25,
        "sf_line_leanmetric" : 47.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.25,
        "calledClasses_ckjm_ext_lcom_sum" : 32.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 32.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 15.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 2.0,
        "calledClasses_ckjm_ext_loc_sum" : 556.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.25,
        "calledClasses_ckjm_ext_lcom3_max" : 0.75,
        "entryClass_ckjm_ext_amc" : 60.55555555555556,
        "sf_method_sf" : 5.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 60.55555555555556,
        "calledClasses_ckjm_ext_npm_max" : 4.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 2.0,
        "calledClasses_ckjm_ext_ca_sum" : 2.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.8122605363984674,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.25,
        "jmh_thrpt_score_quadmean" : 229603.0741680297,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 18.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 32.0,
        "sf_line_total" : 112.0,
        "entryClass_ckjm_ext_lcom" : 32.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 261.0,
        "sf_line_sf" : 65.0,
        "hashCodeCloneCountGlobal" : 2.0,
        "luceneScore" : 6.481455326080322,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 8.0,
        "sf_instruction_covered" : 261.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 44.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.75,
        "entryClass_ckjm_ext_lcom3" : 0.75,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 2.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 2.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 15.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 556.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 261.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 4.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 2.0,
        "calledClasses_ckjm_ext_amc_max" : 60.55555555555556,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 2.0,
        "calledClasses_ckjm_ext_lcom_min" : 32.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 60.55555555555556,
        "jmh_thrpt_score_mean" : 229603.0741680297,
        "sf_line_missed" : 65.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 2.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 18.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 2.0,
        "sf_line_leanness" : 0.41964285714285715,
        "calledUncalledMethodRatio" : 0.4444444444444444,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 212.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 556.0,
        "calledClasses_ckjm_ext_wmc_mean" : 9.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 2.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.25,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.75,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.25,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 4.0,
        "sf_line_nf" : 47.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 212.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 2.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.75,
        "sf_complexity_leanness" : 0.5454545454545454,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 2.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 8.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 33.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.8333333333333334,
        "calledClasses_ckjm_ext_npm_min" : 4.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.5517970401691332,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.375,
        "calledClasses_ckjm_ext_lcom3_min" : 0.75,
        "calledClasses_ckjm_ext_wmc_max" : 9.0,
        "calledClasses_ckjm_ext_rfc_mean" : 44.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 5.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 4.0,
        "calledClasses_ckjm_ext_amc_min" : 60.55555555555556,
        "calledClasses_ckjm_ext_wmc_sum" : 9.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 44.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 556.0,
        "calledClasses_ckjm_ext_ca_mean" : 2.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 4.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 44.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 1.0,
        "jmh_thrpt_score_0" : 229603.0741680297,
        "entryClass_ckjm_ext_wmc" : 9.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 21.0,
        "SINGLE_SMOOP_po" : 11.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.imixs.workflow.webservices.Base64",
      "uri" : "org.imixs.workflow:imixs-workflow-xml:2.1.1"
    }, {
      "id" : "fbfee1a6-87a9-492b-9ba4-89465129f476",
      "groupId" : "org.scalaj",
      "artifactId" : "scalaj-http_2.9.3",
      "version" : "2.0.0",
      "name" : "Base64",
      "packagename" : "scalaj.http",
      "score" : 6.6060166,
      "hash" : "fa17f18fbec6a7a12bd6d1b004a09e52",
      "content" : "// Copyright 2003-2010 Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland\n// www.source-code.biz, www.inventec.ch/chdh\n//\n// This module is multi-licensed and may be used under the terms\n// of any of the following licenses:\n//\n//  EPL, Eclipse Public License, V1.0 or later, http://www.eclipse.org/legal\n//  LGPL, GNU Lesser General Public License, V2.1 or later, http://www.gnu.org/licenses/lgpl.html\n//  GPL, GNU General Public License, V2 or later, http://www.gnu.org/licenses/gpl.html\n//  AL, Apache License, V2.0 or later, http://www.apache.org/licenses\n//  BSD, BSD License, http://www.opensource.org/licenses/bsd-license.php\n//  MIT, MIT License, http://www.opensource.org/licenses/MIT\n//\n// Please contact the author if you need another license.\n// This module is provided \"as is\", without warranties of any kind.\n\npackage scalaj.http;\n\n/**\n* A Base64 encoder/decoder.\n*\n* <p>\n* This class is used to encode and decode data in Base64 format as described in RFC 1521.\n*\n* <p>\n* Project home page: <a href=\"http://www.source-code.biz/base64coder/java/\">www.source-code.biz/base64coder/java</a><br>\n* Author: Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland<br>\n* Multi-licensed: EPL / LGPL / GPL / AL / BSD / MIT.\n*/\npublic class Base64 {\n\n  // The line separator string of the operating system.\n  private static final String systemLineSeparator = System.getProperty(\"line.separator\");\n\n  // Mapping table from 6-bit nibbles to Base64 characters.\n  private static final char[] map1 = new char[64];\n     static {\n        int i=0;\n        for (char c='A'; c<='Z'; c++) map1[i++] = c;\n        for (char c='a'; c<='z'; c++) map1[i++] = c;\n        for (char c='0'; c<='9'; c++) map1[i++] = c;\n        map1[i++] = '+'; map1[i++] = '/'; }\n\n  // Mapping table from Base64 characters to 6-bit nibbles.\n  private static final byte[] map2 = new byte[128];\n     static {\n        for (int i=0; i<map2.length; i++) map2[i] = -1;\n        for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; }\n\n  /**\n  * Encodes a string into Base64 format.\n  * No blanks or line breaks are inserted.\n  * @param s  A String to be encoded.\n  * @return   A String containing the Base64 encoded data.\n  */\n  public static String encodeString (String s) {\n     return new String(encode(s.getBytes())); }\n\n  /**\n  * Encodes a byte array into Base 64 format and breaks the output into lines of 76 characters.\n  * This method is compatible with <code>sun.misc.BASE64Encoder.encodeBuffer(byte[])</code>.\n  * @param in  An array containing the data bytes to be encoded.\n  * @return    A String containing the Base64 encoded data, broken into lines.\n  */\n  public static String encodeLines (byte[] in) {\n     return encodeLines(in, 0, in.length, 76, systemLineSeparator); }\n\n  /**\n  * Encodes a byte array into Base 64 format and breaks the output into lines.\n  * @param in            An array containing the data bytes to be encoded.\n  * @param iOff          Offset of the first byte in <code>in</code> to be processed.\n  * @param iLen          Number of bytes to be processed in <code>in</code>, starting at <code>iOff</code>.\n  * @param lineLen       Line length for the output data. Should be a multiple of 4.\n  * @param lineSeparator The line separator to be used to separate the output lines.\n  * @return              A String containing the Base64 encoded data, broken into lines.\n  */\n  public static String encodeLines (byte[] in, int iOff, int iLen, int lineLen, String lineSeparator) {\n     int blockLen = (lineLen*3) / 4;\n     if (blockLen <= 0) throw new IllegalArgumentException();\n     int lines = (iLen+blockLen-1) / blockLen;\n     int bufLen = ((iLen+2)/3)*4 + lines*lineSeparator.length();\n     StringBuilder buf = new StringBuilder(bufLen);\n     int ip = 0;\n     while (ip < iLen) {\n        int l = Math.min(iLen-ip, blockLen);\n        buf.append (encode(in, iOff+ip, l));\n        buf.append (lineSeparator);\n        ip += l; }\n     return buf.toString(); }\n\n  /**\n  * Encodes a byte array into Base64 format.\n  * No blanks or line breaks are inserted in the output.\n  * @param in  An array containing the data bytes to be encoded.\n  * @return    A character array containing the Base64 encoded data.\n  */\n  public static char[] encode (byte[] in) {\n     return encode(in, 0, in.length); }\n\n  /**\n  * Encodes a byte array into Base64 format.\n  * No blanks or line breaks are inserted in the output.\n  * @param in    An array containing the data bytes to be encoded.\n  * @param iLen  Number of bytes to process in <code>in</code>.\n  * @return      A character array containing the Base64 encoded data.\n  */\n  public static char[] encode (byte[] in, int iLen) {\n     return encode(in, 0, iLen); }\n\n  /**\n  * Encodes a byte array into Base64 format.\n  * No blanks or line breaks are inserted in the output.\n  * @param in    An array containing the data bytes to be encoded.\n  * @param iOff  Offset of the first byte in <code>in</code> to be processed.\n  * @param iLen  Number of bytes to process in <code>in</code>, starting at <code>iOff</code>.\n  * @return      A character array containing the Base64 encoded data.\n  */\n  public static char[] encode (byte[] in, int iOff, int iLen) {\n     int oDataLen = (iLen*4+2)/3;       // output length without padding\n     int oLen = ((iLen+2)/3)*4;         // output length including padding\n     char[] out = new char[oLen];\n     int ip = iOff;\n     int iEnd = iOff + iLen;\n     int op = 0;\n     while (ip < iEnd) {\n        int i0 = in[ip++] & 0xff;\n        int i1 = ip < iEnd ? in[ip++] & 0xff : 0;\n        int i2 = ip < iEnd ? in[ip++] & 0xff : 0;\n        int o0 = i0 >>> 2;\n        int o1 = ((i0 &   3) << 4) | (i1 >>> 4);\n        int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);\n        int o3 = i2 & 0x3F;\n        out[op++] = map1[o0];\n        out[op++] = map1[o1];\n        out[op] = op < oDataLen ? map1[o2] : '='; op++;\n        out[op] = op < oDataLen ? map1[o3] : '='; op++; }\n     return out; }\n\n  /**\n  * Decodes a string from Base64 format.\n  * No blanks or line breaks are allowed within the Base64 encoded input data.\n  * @param s  A Base64 String to be decoded.\n  * @return   A String containing the decoded data.\n  * @throws   IllegalArgumentException If the input is not valid Base64 encoded data.\n  */\n  public static String decodeString (String s) {\n     return new String(decode(s)); }\n\n  /**\n  * Decodes a byte array from Base64 format and ignores line separators, tabs and blanks.\n  * CR, LF, Tab and Space characters are ignored in the input data.\n  * This method is compatible with <code>sun.misc.BASE64Decoder.decodeBuffer(String)</code>.\n  * @param s  A Base64 String to be decoded.\n  * @return   An array containing the decoded data bytes.\n  * @throws   IllegalArgumentException If the input is not valid Base64 encoded data.\n  */\n  public static byte[] decodeLines (String s) {\n     char[] buf = new char[s.length()];\n     int p = 0;\n     for (int ip = 0; ip < s.length(); ip++) {\n        char c = s.charAt(ip);\n        if (c != ' ' && c != '\\r' && c != '\\n' && c != '\\t')\n           buf[p++] = c; }\n     return decode(buf, 0, p); }\n\n  /**\n  * Decodes a byte array from Base64 format.\n  * No blanks or line breaks are allowed within the Base64 encoded input data.\n  * @param s  A Base64 String to be decoded.\n  * @return   An array containing the decoded data bytes.\n  * @throws   IllegalArgumentException If the input is not valid Base64 encoded data.\n  */\n  public static byte[] decode (String s) {\n     return decode(s.toCharArray()); }\n\n  /**\n  * Decodes a byte array from Base64 format.\n  * No blanks or line breaks are allowed within the Base64 encoded input data.\n  * @param in  A character array containing the Base64 encoded data.\n  * @return    An array containing the decoded data bytes.\n  * @throws    IllegalArgumentException If the input is not valid Base64 encoded data.\n  */\n  public static byte[] decode (char[] in) {\n     return decode(in, 0, in.length); }\n\n  /**\n  * Decodes a byte array from Base64 format.\n  * No blanks or line breaks are allowed within the Base64 encoded input data.\n  * @param in    A character array containing the Base64 encoded data.\n  * @param iOff  Offset of the first character in <code>in</code> to be processed.\n  * @param iLen  Number of characters to process in <code>in</code>, starting at <code>iOff</code>.\n  * @return      An array containing the decoded data bytes.\n  * @throws      IllegalArgumentException If the input is not valid Base64 encoded data.\n  */\n  public static byte[] decode (char[] in, int iOff, int iLen) {\n     if (iLen%4 != 0) throw new IllegalArgumentException (\"Length of Base64 encoded input string is not a multiple of 4.\");\n     while (iLen > 0 && in[iOff+iLen-1] == '=') iLen--;\n     int oLen = (iLen*3) / 4;\n     byte[] out = new byte[oLen];\n     int ip = iOff;\n     int iEnd = iOff + iLen;\n     int op = 0;\n     while (ip < iEnd) {\n        int i0 = in[ip++];\n        int i1 = in[ip++];\n        int i2 = ip < iEnd ? in[ip++] : 'A';\n        int i3 = ip < iEnd ? in[ip++] : 'A';\n        if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)\n           throw new IllegalArgumentException (\"Illegal character in Base64 encoded data.\");\n        int b0 = map2[i0];\n        int b1 = map2[i1];\n        int b2 = map2[i2];\n        int b3 = map2[i3];\n        if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)\n           throw new IllegalArgumentException (\"Illegal character in Base64 encoded data.\");\n        int o0 = ( b0       <<2) | (b1>>>4);\n        int o1 = ((b1 & 0xf)<<4) | (b2>>>2);\n        int o2 = ((b2 &   3)<<6) |  b3;\n        out[op++] = (byte)o0;\n        if (op<oLen) out[op++] = (byte)o1;\n        if (op<oLen) out[op++] = (byte)o2; }\n     return out; }\n\n  // Dummy constructor.\n  private Base64() {}\n\n} // end class Base64",
      "methods" : {
        "Base64" : [ {
          "name" : "encodeString",
          "returnParam" : "String",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+encodeString(String):String",
          "lineStart" : 56,
          "lineEnd" : 57,
          "columnStart" : 3,
          "columnEnd" : 47,
          "initializer" : false
        }, {
          "name" : "encodeLines",
          "returnParam" : "String",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encodeLines(byte[]):String",
          "lineStart" : 65,
          "lineEnd" : 66,
          "columnStart" : 3,
          "columnEnd" : 69,
          "initializer" : false
        }, {
          "name" : "encodeLines",
          "returnParam" : "String",
          "params" : [ "byte[]", "int", "int", "int", "String" ],
          "visibility" : "public",
          "descriptor" : "+encodeLines(byte[], int, int, int, String):String",
          "lineStart" : 77,
          "lineEnd" : 89,
          "columnStart" : 3,
          "columnEnd" : 29,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 97,
          "lineEnd" : 98,
          "columnStart" : 3,
          "columnEnd" : 39,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int):char[]",
          "lineStart" : 107,
          "lineEnd" : 108,
          "columnStart" : 3,
          "columnEnd" : 34,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int):char[]",
          "lineStart" : 118,
          "lineEnd" : 137,
          "columnStart" : 3,
          "columnEnd" : 18,
          "initializer" : false
        }, {
          "name" : "decodeString",
          "returnParam" : "String",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decodeString(String):String",
          "lineStart" : 146,
          "lineEnd" : 147,
          "columnStart" : 3,
          "columnEnd" : 36,
          "initializer" : false
        }, {
          "name" : "decodeLines",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decodeLines(String):byte[]",
          "lineStart" : 157,
          "lineEnd" : 164,
          "columnStart" : 3,
          "columnEnd" : 32,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):byte[]",
          "lineStart" : 173,
          "lineEnd" : 174,
          "columnStart" : 3,
          "columnEnd" : 38,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 183,
          "lineEnd" : 184,
          "columnStart" : 3,
          "columnEnd" : 39,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], int, int):byte[]",
          "lineStart" : 195,
          "lineEnd" : 222,
          "columnStart" : 3,
          "columnEnd" : 18,
          "initializer" : false
        }, {
          "name" : "Base64",
          "returnParam" : null,
          "params" : [ ],
          "visibility" : "private",
          "descriptor" : "-Base64()",
          "lineStart" : 225,
          "lineEnd" : 225,
          "columnStart" : 3,
          "columnEnd" : 21,
          "initializer" : true
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : [ ],
        "visibility" : "private",
        "descriptor" : "-Base64()",
        "lineStart" : 225,
        "lineEnd" : 225,
        "columnStart" : 3,
        "columnEnd" : 21,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 97,
        "lineEnd" : 98,
        "columnStart" : 3,
        "columnEnd" : 39,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 183,
        "lineEnd" : 184,
        "columnStart" : 3,
        "columnEnd" : 39,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "scalaj-http",
        "description" : "scalaj-http",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "6db76fa1-0422-4caf-8116-7d2e202d853b" ],
        "_version_" : [ 1521884353609596928 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "org.scala-lang:scala-library:2.9.3" ] ],
        "method" : [ [ "false|public static char[] scalaj.http.Base64.encode(byte[])|scalaj.http.Base64.encode([B)[C|[0]", "false|public static byte[] scalaj.http.Base64.decode(char[])|scalaj.http.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|private scalaj.http.Base64()|scalaj.http.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.2833333333333333,
        "sf_complexity_necf" : 40.0,
        "calledClasses_ckjm_ext_ca_max" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.7777777777777778,
        "jmh_thrpt_score_sum" : 226079.72220547558,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 26.0,
        "sf_line_balance" : 0.4897959183673469,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 42.46153846153846,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 28.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 72.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 13.0,
        "entryClass_ckjm_ext_loc" : 568.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 226079.72220547555,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 49.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 42.46153846153847,
        "calledClasses_ckjm_ext_cbo_mean" : 0.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 13.0,
        "calledClasses_ckjm_ext_rfc_sum" : 28.0,
        "sf_instruction_necf" : 456.0,
        "calledClasses_ckjm_ext_npm_sum" : 11.0,
        "calledClasses_ckjm_ext_loc_geomean" : 568.0000000000001,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 72.0,
        "calledClasses_ckjm_ext_loc_min" : 568.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 456.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 27.999999999999996,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 1.4,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 73.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 7.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 13.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.2833333333333333,
        "sf_line_leanmetric" : 49.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.2833333333333333,
        "calledClasses_ckjm_ext_lcom_sum" : 72.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 72.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 14.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 0.0,
        "calledClasses_ckjm_ext_loc_sum" : 568.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.2833333333333333,
        "calledClasses_ckjm_ext_lcom3_max" : 0.7777777777777778,
        "entryClass_ckjm_ext_amc" : 42.46153846153846,
        "sf_method_sf" : 7.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 42.46153846153846,
        "calledClasses_ckjm_ext_npm_max" : 11.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 0.0,
        "calledClasses_ckjm_ext_ca_sum" : 0.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.4430379746835443,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.2833333333333333,
        "jmh_thrpt_score_quadmean" : 226079.72220547558,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 26.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 72.0,
        "sf_line_total" : 73.0,
        "entryClass_ckjm_ext_lcom" : 72.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 316.0,
        "sf_line_sf" : 24.0,
        "hashCodeCloneCountGlobal" : 22.0,
        "luceneScore" : 6.606016635894775,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 12.0,
        "sf_instruction_covered" : 316.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 28.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.7777777777777778,
        "entryClass_ckjm_ext_lcom3" : 0.7777777777777778,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 0.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 0.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 14.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 568.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 316.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 11.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_max" : 42.46153846153846,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 0.0,
        "calledClasses_ckjm_ext_lcom_min" : 72.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 5.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 42.46153846153846,
        "jmh_thrpt_score_mean" : 226079.72220547558,
        "sf_line_missed" : 24.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 0.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 26.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 0.0,
        "sf_line_leanness" : 0.6712328767123288,
        "calledUncalledMethodRatio" : 0.46153846153846156,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 140.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 568.0,
        "calledClasses_ckjm_ext_wmc_mean" : 13.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 5.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.2833333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.7777777777777778,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.2833333333333333,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 11.0,
        "sf_line_nf" : 49.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 140.0,
        "sf_method_covered" : 5.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.7777777777777778,
        "sf_complexity_leanness" : 0.65,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 12.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 40.0,
        "noCalledMethods" : 6.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.5384615384615384,
        "calledClasses_ckjm_ext_npm_min" : 11.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.6929824561403509,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.4166666666666667,
        "calledClasses_ckjm_ext_lcom3_min" : 0.7777777777777778,
        "calledClasses_ckjm_ext_wmc_max" : 13.0,
        "calledClasses_ckjm_ext_rfc_mean" : 28.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 7.0,
        "sf_method_nf" : 5.0,
        "calledClasses_ckjm_ext_npm_geomean" : 11.000000000000002,
        "calledClasses_ckjm_ext_amc_min" : 42.46153846153846,
        "calledClasses_ckjm_ext_wmc_sum" : 13.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 28.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 568.0,
        "calledClasses_ckjm_ext_ca_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 11.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 28.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 1.0,
        "jmh_thrpt_score_0" : 226079.72220547558,
        "entryClass_ckjm_ext_wmc" : 13.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 17.0,
        "SINGLE_SMOOP_po" : 9.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "scalaj.http.Base64",
      "uri" : "org.scalaj:scalaj-http_2.9.3:2.0.0"
    }, {
      "id" : "1dcf7560-daa2-4646-8954-3d588cfcca9e",
      "groupId" : "cn.jpush.api",
      "artifactId" : "jpush-client",
      "version" : "3.2.7",
      "name" : "Base64",
      "packagename" : "cn.jpush.api.utils",
      "score" : 6.8252535,
      "hash" : "43da80d574e5f2f6cd87052c771913b2",
      "content" : "package cn.jpush.api.utils;\n\nimport java.io.CharArrayWriter;\nimport java.io.IOException;\n\npublic class Base64 {\n    static final char[] alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"\n            .toCharArray();\n\n    public static char[] encode(byte[] content) {\n        CharArrayWriter cw = new CharArrayWriter(4 * content.length / 3);\n\n        int idx = 0;\n\n        int x = 0;\n\n        for (int i = 0; i < content.length; ++i) {\n            if (idx == 0)\n                x = (content[i] & 0xFF) << 16;\n            else if (idx == 1)\n                x |= (content[i] & 0xFF) << 8;\n            else {\n                x |= content[i] & 0xFF;\n            }\n\n            if (++idx == 3) {\n                cw.write(alphabet[(x >> 18)]);\n                cw.write(alphabet[(x >> 12 & 0x3F)]);\n                cw.write(alphabet[(x >> 6 & 0x3F)]);\n                cw.write(alphabet[(x & 0x3F)]);\n\n                idx = 0;\n            }\n        }\n\n        if (idx == 1) {\n            cw.write(alphabet[(x >> 18)]);\n            cw.write(alphabet[(x >> 12 & 0x3F)]);\n            cw.write(61);\n            cw.write(61);\n        }\n\n        if (idx == 2) {\n            cw.write(alphabet[(x >> 18)]);\n            cw.write(alphabet[(x >> 12 & 0x3F)]);\n            cw.write(alphabet[(x >> 6 & 0x3F)]);\n            cw.write(61);\n        }\n\n        return cw.toCharArray();\n    }\n\n    public static byte[] decode(char[] message) throws IOException {\n        byte[] buff = new byte[4];\n        byte[] dest = new byte[message.length];\n\n        int bpos = 0;\n        int destpos = 0;\n\n        for (int i = 0; i < message.length; ++i) {\n            int c = message[i];\n\n            if ((c != 10) && (c != 13) && (c != 32)) {\n                if (c == 9)\n                    continue;\n\n                if ((c >= 65) && (c <= 90)) {\n                    buff[(bpos++)] = (byte) (c - 65);\n                } else if ((c >= 97) && (c <= 122)) {\n                    buff[(bpos++)] = (byte) (c - 97 + 26);\n                } else if ((c >= 48) && (c <= 57)) {\n                    buff[(bpos++)] = (byte) (c - 48 + 52);\n                } else if (c == 43) {\n                    buff[(bpos++)] = 62;\n                } else if (c == 47) {\n                    buff[(bpos++)] = 63;\n                } else if (c == 61) {\n                    buff[(bpos++)] = 64;\n                } else {\n                    throw new IOException(\"Illegal char in base64 code.\");\n                }\n\n                if (bpos == 4) {\n                    bpos = 0;\n\n                    if (buff[0] == 64)\n                        break;\n\n                    if (buff[1] == 64)\n                        throw new IOException(\"Unexpected '=' in base64 code.\");\n\n                    int v;\n                    if (buff[2] == 64) {\n                        v = (buff[0] & 0x3F) << 6 | buff[1] & 0x3F;\n                        dest[(destpos++)] = (byte) (v >> 4);\n                        break;\n                    }\n                    if (buff[3] == 64) {\n                        v = (buff[0] & 0x3F) << 12 | (buff[1] & 0x3F) << 6\n                                | buff[2] & 0x3F;\n                        dest[(destpos++)] = (byte) (v >> 10);\n                        dest[(destpos++)] = (byte) (v >> 2);\n                        break;\n                    }\n\n                    v = (buff[0] & 0x3F) << 18 | (buff[1] & 0x3F) << 12\n                            | (buff[2] & 0x3F) << 6 | buff[3] & 0x3F;\n                    dest[(destpos++)] = (byte) (v >> 16);\n                    dest[(destpos++)] = (byte) (v >> 8);\n                    dest[(destpos++)] = (byte) v;\n                }\n            }\n        }\n\n        byte[] res = new byte[destpos];\n        System.arraycopy(dest, 0, res, 0, destpos);\n\n        return res;\n    }\n}",
      "methods" : {
        "Base64" : [ {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 10,
          "lineEnd" : 51,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 53,
          "lineEnd" : 119,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 10,
        "lineEnd" : 51,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 53,
        "lineEnd" : 119,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "JPush API Java Client",
        "description" : "JPush's officially supported Java client library for accessing JPush APIs.",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "e6d9e84b-134b-4c13-96d7-a5978f0b175d" ],
        "_version_" : [ 1521884124331114496 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "com.google.code.gson:gson:2.3", "org.slf4j:slf4j-api:1.7.7" ] ],
        "method" : [ [ "false|public static char[] cn.jpush.api.utils.Base64.encode(byte[])|cn.jpush.api.utils.Base64.encode([B)[C|[0]", "false|public static byte[] cn.jpush.api.utils.Base64.decode(char[]) throws java.io.IOException|cn.jpush.api.utils.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public cn.jpush.api.utils.Base64()|cn.jpush.api.utils.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.3333333333333333,
        "sf_complexity_necf" : 28.0,
        "calledClasses_ckjm_ext_ca_max" : 1.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6666666666666666,
        "jmh_thrpt_score_sum" : 204653.14080506307,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 28.0,
        "sf_line_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 108.0,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 11.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 4.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 4.0,
        "entryClass_ckjm_ext_loc" : 437.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 204653.14080506316,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 71.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 108.00000000000003,
        "calledClasses_ckjm_ext_cbo_mean" : 1.0,
        "entryClass_ckjm_ext_dam" : 0.0,
        "calledClasses_ckjm_ext_wmc_min" : 4.0,
        "calledClasses_ckjm_ext_rfc_sum" : 11.0,
        "sf_instruction_necf" : 428.0,
        "calledClasses_ckjm_ext_npm_sum" : 3.0,
        "calledClasses_ckjm_ext_loc_geomean" : 436.9999999999999,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 4.0,
        "calledClasses_ckjm_ext_loc_min" : 437.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 428.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 11.000000000000002,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 71.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 0.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 4.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.3333333333333333,
        "sf_line_leanmetric" : 71.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom_sum" : 4.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 4.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 0.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 1.0,
        "calledClasses_ckjm_ext_loc_sum" : 437.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6666666666666666,
        "entryClass_ckjm_ext_amc" : 108.0,
        "sf_method_sf" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 0.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 108.0,
        "calledClasses_ckjm_ext_npm_max" : 3.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 1.0,
        "calledClasses_ckjm_ext_ca_sum" : 1.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.0,
        "calledClasses_ckjm_ext_dam_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.3333333333333333,
        "jmh_thrpt_score_quadmean" : 204653.14080506307,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 28.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 4.0,
        "sf_line_total" : 71.0,
        "entryClass_ckjm_ext_lcom" : 4.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 428.0,
        "sf_line_sf" : 0.0,
        "hashCodeCloneCountGlobal" : 5.0,
        "luceneScore" : 6.825253486633301,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 0.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 3.0,
        "sf_instruction_covered" : 428.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 11.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.6666666666666666,
        "entryClass_ckjm_ext_lcom3" : 0.6666666666666666,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 1.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 1.0,
        "calledClasses_ckjm_ext_dam_sum" : 0.0,
        "sf_complexity_missed" : 0.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 437.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 428.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 1.0,
        "calledClasses_ckjm_ext_amc_max" : 108.0,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 1.0,
        "calledClasses_ckjm_ext_lcom_min" : 4.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 108.0,
        "jmh_thrpt_score_mean" : 204653.14080506307,
        "sf_line_missed" : 0.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 28.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 1.0,
        "sf_line_leanness" : 1.0,
        "calledUncalledMethodRatio" : 1.0,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 0.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 437.0,
        "calledClasses_ckjm_ext_wmc_mean" : 4.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 5.0,
        "calledClasses_ckjm_ext_dam_max" : 0.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.3333333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.6666666666666666,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 3.0,
        "sf_line_nf" : 71.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 0.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.6666666666666666,
        "sf_complexity_leanness" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 3.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 28.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 0.0,
        "sf_complexity_balance" : 0.0,
        "calledClasses_ckjm_ext_npm_min" : 3.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 1.0,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 1.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.6666666666666666,
        "calledClasses_ckjm_ext_wmc_max" : 4.0,
        "calledClasses_ckjm_ext_rfc_mean" : 11.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 0.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_amc_min" : 108.0,
        "calledClasses_ckjm_ext_wmc_sum" : 4.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 11.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 437.0,
        "calledClasses_ckjm_ext_ca_mean" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 3.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 11.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 2.0,
        "jmh_thrpt_score_0" : 204653.14080506307,
        "entryClass_ckjm_ext_wmc" : 4.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 12.0,
        "SINGLE_SMOOP_po" : 4.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "cn.jpush.api.utils.Base64",
      "uri" : "cn.jpush.api:jpush-client:3.2.7"
    }, {
      "id" : "26ad6f28-2293-4a0a-8c49-e373e5127e6a",
      "groupId" : "org.httpobjects",
      "artifactId" : "httpobjects",
      "version" : "0.11.0",
      "name" : "Base64",
      "packagename" : "org.httpobjects.impl",
      "score" : 6.6060166,
      "hash" : "63825b3146d48a5b4db2983afef9a0ca",
      "content" : "/**\n * Copyright (C) 2011, 2012 Commission Junction Inc.\n *\n * This file is part of httpobjects.\n *\n * httpobjects is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2, or (at your option)\n * any later version.\n *\n * httpobjects is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with httpobjects; see the file COPYING.  If not, write to the\n * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\n * 02110-1301 USA.\n *\n * Linking this library statically or dynamically with other modules is\n * making a combined work based on this library.  Thus, the terms and\n * conditions of the GNU General Public License cover the whole\n * combination.\n *\n * As a special exception, the copyright holders of this library give you\n * permission to link this library with independent modules to produce an\n * executable, regardless of the license terms of these independent\n * modules, and to copy and distribute the resulting executable under\n * terms of your choice, provided that you also meet, for each linked\n * independent module, the terms and conditions of the license of that\n * module.  An independent module is a module which is not derived from\n * or based on this library.  If you modify this library, you may extend\n * this exception to your version of the library, but you are not\n * obligated to do so.  If you do not wish to do so, delete this\n * exception statement from your version.\n */\n//Copyright 2003-2010 Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland\n//www.source-code.biz, www.inventec.ch/chdh\n//\n//This module is multi-licensed and may be used under the terms\n//of any of the following licenses:\n//\n//EPL, Eclipse Public License, V1.0 or later, http://www.eclipse.org/legal\n//LGPL, GNU Lesser General Public License, V2.1 or later, http://www.gnu.org/licenses/lgpl.html\n//GPL, GNU General Public License, V2 or later, http://www.gnu.org/licenses/gpl.html\n//AL, Apache License, V2.0 or later, http://www.apache.org/licenses\n//BSD, BSD License, http://www.opensource.org/licenses/bsd-license.php\n//\n//Please contact the author if you need another license.\n//This module is provided \"as is\", without warranties of any kind.\n\npackage org.httpobjects.impl;\n\nimport java.io.UnsupportedEncodingException;\n\n/**\n* A Base64 encoder/decoder.\n*\n* <p>\n* This class is used to encode and decode data in Base64 format as described in RFC 1521.\n*\n* <p>\n* Project home page: <a href=\"http://www.source-code.biz/base64coder/java/\">www.source-code.biz/base64coder/java</a><br>\n* Author: Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland<br>\n* Multi-licensed: EPL / LGPL / GPL / AL / BSD.\n*/\npublic class Base64 {\n\n//The line separator string of the operating system.\nprivate static final String systemLineSeparator = System.getProperty(\"line.separator\");\n\n//Mapping table from 6-bit nibbles to Base64 characters.\nprivate static final char[] map1 = new char[64];\nstatic {\n   int i=0;\n   for (char c='A'; c<='Z'; c++) map1[i++] = c;\n   for (char c='a'; c<='z'; c++) map1[i++] = c;\n   for (char c='0'; c<='9'; c++) map1[i++] = c;\n   map1[i++] = '+'; map1[i++] = '/'; }\n\n//Mapping table from Base64 characters to 6-bit nibbles.\nprivate static final byte[] map2 = new byte[128];\nstatic {\n   for (int i=0; i<map2.length; i++) map2[i] = -1;\n   for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; }\n\n/**\n* Encodes a string into Base64 format.\n* No blanks or line breaks are inserted.\n* @param s  A String to be encoded.\n* @return   A String containing the Base64 encoded data.\n*/\npublic static String encodeString (String s, String encodingName) {\n    try {\n        return new String(encode(s.getBytes(encodingName)));\n    } catch (UnsupportedEncodingException e) {\n        throw new RuntimeException(e.getMessage(), e);\n    }\n}\n\n/**\n* Encodes a byte array into Base 64 format and breaks the output into lines of 76 characters.\n* This method is compatible with <code>sun.misc.BASE64Encoder.encodeBuffer(byte[])</code>.\n* @param in  An array containing the data bytes to be encoded.\n* @return    A String containing the Base64 encoded data, broken into lines.\n*/\npublic static String encodeLines (byte[] in) {\nreturn encodeLines(in, 0, in.length, 76, systemLineSeparator); }\n\n/**\n* Encodes a byte array into Base 64 format and breaks the output into lines.\n* @param in            An array containing the data bytes to be encoded.\n* @param iOff          Offset of the first byte in <code>in</code> to be processed.\n* @param iLen          Number of bytes to be processed in <code>in</code>, starting at <code>iOff</code>.\n* @param lineLen       Line length for the output data. Should be a multiple of 4.\n* @param lineSeparator The line separator to be used to separate the output lines.\n* @return              A String containing the Base64 encoded data, broken into lines.\n*/\npublic static String encodeLines (byte[] in, int iOff, int iLen, int lineLen, String lineSeparator) {\nint blockLen = (lineLen*3) / 4;\nif (blockLen <= 0) throw new IllegalArgumentException();\nint lines = (iLen+blockLen-1) / blockLen;\nint bufLen = ((iLen+2)/3)*4 + lines*lineSeparator.length();\nStringBuilder buf = new StringBuilder(bufLen);\nint ip = 0;\nwhile (ip < iLen) {\n   int l = Math.min(iLen-ip, blockLen);\n   buf.append (encode(in, iOff+ip, l));\n   buf.append (lineSeparator);\n   ip += l; }\nreturn buf.toString(); }\n\n/**\n* Encodes a byte array into Base64 format.\n* No blanks or line breaks are inserted in the output.\n* @param in  An array containing the data bytes to be encoded.\n* @return    A character array containing the Base64 encoded data.\n*/\npublic static char[] encode (byte[] in) {\nreturn encode(in, 0, in.length); }\n\n/**\n* Encodes a byte array into Base64 format.\n* No blanks or line breaks are inserted in the output.\n* @param in    An array containing the data bytes to be encoded.\n* @param iLen  Number of bytes to process in <code>in</code>.\n* @return      A character array containing the Base64 encoded data.\n*/\npublic static char[] encode (byte[] in, int iLen) {\nreturn encode(in, 0, iLen); }\n\n/**\n* Encodes a byte array into Base64 format.\n* No blanks or line breaks are inserted in the output.\n* @param in    An array containing the data bytes to be encoded.\n* @param iOff  Offset of the first byte in <code>in</code> to be processed.\n* @param iLen  Number of bytes to process in <code>in</code>, starting at <code>iOff</code>.\n* @return      A character array containing the Base64 encoded data.\n*/\npublic static char[] encode (byte[] in, int iOff, int iLen) {\nint oDataLen = (iLen*4+2)/3;       // output length without padding\nint oLen = ((iLen+2)/3)*4;         // output length including padding\nchar[] out = new char[oLen];\nint ip = iOff;\nint iEnd = iOff + iLen;\nint op = 0;\nwhile (ip < iEnd) {\n   int i0 = in[ip++] & 0xff;\n   int i1 = ip < iEnd ? in[ip++] & 0xff : 0;\n   int i2 = ip < iEnd ? in[ip++] & 0xff : 0;\n   int o0 = i0 >>> 2;\n   int o1 = ((i0 &   3) << 4) | (i1 >>> 4);\n   int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);\n   int o3 = i2 & 0x3F;\n   out[op++] = map1[o0];\n   out[op++] = map1[o1];\n   out[op] = op < oDataLen ? map1[o2] : '='; op++;\n   out[op] = op < oDataLen ? map1[o3] : '='; op++; }\nreturn out; }\n\n/**\n* Decodes a string from Base64 format.\n* No blanks or line breaks are allowed within the Base64 encoded input data.\n* @param s  A Base64 String to be decoded.\n* @return   A String containing the decoded data.\n* @throws   IllegalArgumentException If the input is not valid Base64 encoded data.\n*/\npublic static String decodeString (String s) {\nreturn new String(decode(s)); }\n\n/**\n* Decodes a byte array from Base64 format and ignores line separators, tabs and blanks.\n* CR, LF, Tab and Space characters are ignored in the input data.\n* This method is compatible with <code>sun.misc.BASE64Decoder.decodeBuffer(String)</code>.\n* @param s  A Base64 String to be decoded.\n* @return   An array containing the decoded data bytes.\n* @throws   IllegalArgumentException If the input is not valid Base64 encoded data.\n*/\npublic static byte[] decodeLines (String s) {\nchar[] buf = new char[s.length()];\nint p = 0;\nfor (int ip = 0; ip < s.length(); ip++) {\n   char c = s.charAt(ip);\n   if (c != ' ' && c != '\\r' && c != '\\n' && c != '\\t')\n      buf[p++] = c; }\nreturn decode(buf, 0, p); }\n\n/**\n* Decodes a byte array from Base64 format.\n* No blanks or line breaks are allowed within the Base64 encoded input data.\n* @param s  A Base64 String to be decoded.\n* @return   An array containing the decoded data bytes.\n* @throws   IllegalArgumentException If the input is not valid Base64 encoded data.\n*/\npublic static byte[] decode (String s) {\nreturn decode(s.toCharArray()); }\n\n/**\n* Decodes a byte array from Base64 format.\n* No blanks or line breaks are allowed within the Base64 encoded input data.\n* @param in  A character array containing the Base64 encoded data.\n* @return    An array containing the decoded data bytes.\n* @throws    IllegalArgumentException If the input is not valid Base64 encoded data.\n*/\npublic static byte[] decode (char[] in) {\nreturn decode(in, 0, in.length); }\n\n/**\n* Decodes a byte array from Base64 format.\n* No blanks or line breaks are allowed within the Base64 encoded input data.\n* @param in    A character array containing the Base64 encoded data.\n* @param iOff  Offset of the first character in <code>in</code> to be processed.\n* @param iLen  Number of characters to process in <code>in</code>, starting at <code>iOff</code>.\n* @return      An array containing the decoded data bytes.\n* @throws      IllegalArgumentException If the input is not valid Base64 encoded data.\n*/\npublic static byte[] decode (char[] in, int iOff, int iLen) {\nif (iLen%4 != 0) throw new IllegalArgumentException (\"Length of Base64 encoded input string is not a multiple of 4.\");\nwhile (iLen > 0 && in[iOff+iLen-1] == '=') iLen--;\nint oLen = (iLen*3) / 4;\nbyte[] out = new byte[oLen];\nint ip = iOff;\nint iEnd = iOff + iLen;\nint op = 0;\nwhile (ip < iEnd) {\n   int i0 = in[ip++];\n   int i1 = in[ip++];\n   int i2 = ip < iEnd ? in[ip++] : 'A';\n   int i3 = ip < iEnd ? in[ip++] : 'A';\n   if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)\n      throw new IllegalArgumentException (\"Illegal character in Base64 encoded data.\");\n   int b0 = map2[i0];\n   int b1 = map2[i1];\n   int b2 = map2[i2];\n   int b3 = map2[i3];\n   if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)\n      throw new IllegalArgumentException (\"Illegal character in Base64 encoded data.\");\n   int o0 = ( b0       <<2) | (b1>>>4);\n   int o1 = ((b1 & 0xf)<<4) | (b2>>>2);\n   int o2 = ((b2 &   3)<<6) |  b3;\n   out[op++] = (byte)o0;\n   if (op<oLen) out[op++] = (byte)o1;\n   if (op<oLen) out[op++] = (byte)o2; }\nreturn out; }\n\n//Dummy constructor.\nprivate Base64() {}\n\n} // end class Base64Coder",
      "methods" : {
        "Base64" : [ {
          "name" : "encodeString",
          "returnParam" : "String",
          "params" : [ "String", "String" ],
          "visibility" : "public",
          "descriptor" : "+encodeString(String, String):String",
          "lineStart" : 94,
          "lineEnd" : 100,
          "columnStart" : 1,
          "columnEnd" : 1,
          "initializer" : false
        }, {
          "name" : "encodeLines",
          "returnParam" : "String",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encodeLines(byte[]):String",
          "lineStart" : 108,
          "lineEnd" : 109,
          "columnStart" : 1,
          "columnEnd" : 64,
          "initializer" : false
        }, {
          "name" : "encodeLines",
          "returnParam" : "String",
          "params" : [ "byte[]", "int", "int", "int", "String" ],
          "visibility" : "public",
          "descriptor" : "+encodeLines(byte[], int, int, int, String):String",
          "lineStart" : 120,
          "lineEnd" : 132,
          "columnStart" : 1,
          "columnEnd" : 24,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 140,
          "lineEnd" : 141,
          "columnStart" : 1,
          "columnEnd" : 34,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int):char[]",
          "lineStart" : 150,
          "lineEnd" : 151,
          "columnStart" : 1,
          "columnEnd" : 29,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int):char[]",
          "lineStart" : 161,
          "lineEnd" : 180,
          "columnStart" : 1,
          "columnEnd" : 13,
          "initializer" : false
        }, {
          "name" : "decodeString",
          "returnParam" : "String",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decodeString(String):String",
          "lineStart" : 189,
          "lineEnd" : 190,
          "columnStart" : 1,
          "columnEnd" : 31,
          "initializer" : false
        }, {
          "name" : "decodeLines",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decodeLines(String):byte[]",
          "lineStart" : 200,
          "lineEnd" : 207,
          "columnStart" : 1,
          "columnEnd" : 27,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):byte[]",
          "lineStart" : 216,
          "lineEnd" : 217,
          "columnStart" : 1,
          "columnEnd" : 33,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 226,
          "lineEnd" : 227,
          "columnStart" : 1,
          "columnEnd" : 34,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], int, int):byte[]",
          "lineStart" : 238,
          "lineEnd" : 265,
          "columnStart" : 1,
          "columnEnd" : 13,
          "initializer" : false
        }, {
          "name" : "Base64",
          "returnParam" : null,
          "params" : [ ],
          "visibility" : "private",
          "descriptor" : "-Base64()",
          "lineStart" : 268,
          "lineEnd" : 268,
          "columnStart" : 1,
          "columnEnd" : 19,
          "initializer" : true
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : [ ],
        "visibility" : "private",
        "descriptor" : "-Base64()",
        "lineStart" : 268,
        "lineEnd" : 268,
        "columnStart" : 1,
        "columnEnd" : 19,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 140,
        "lineEnd" : 141,
        "columnStart" : 1,
        "columnEnd" : 34,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 226,
        "lineEnd" : 227,
        "columnStart" : 1,
        "columnEnd" : 34,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "${artifactId}",
        "description" : null,
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "4e80878d-6e56-4ff1-82ce-d0b43de0ea6b" ],
        "_version_" : [ 1521884407097458688 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] org.httpobjects.impl.Base64.encode(byte[])|org.httpobjects.impl.Base64.encode([B)[C|[0]", "false|public static byte[] org.httpobjects.impl.Base64.decode(char[])|org.httpobjects.impl.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|private org.httpobjects.impl.Base64()|org.httpobjects.impl.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.2833333333333333,
        "sf_complexity_necf" : 40.0,
        "calledClasses_ckjm_ext_ca_max" : 1.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.7777777777777778,
        "jmh_thrpt_score_sum" : 232207.43544777838,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 26.0,
        "sf_line_balance" : 0.5306122448979592,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 43.15384615384615,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 30.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 72.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 13.0,
        "entryClass_ckjm_ext_loc" : 577.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 232207.43544777826,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 49.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 43.15384615384616,
        "calledClasses_ckjm_ext_cbo_mean" : 1.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 13.0,
        "calledClasses_ckjm_ext_rfc_sum" : 30.0,
        "sf_instruction_necf" : 465.0,
        "calledClasses_ckjm_ext_npm_sum" : 11.0,
        "calledClasses_ckjm_ext_loc_geomean" : 577.0000000000001,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 72.0,
        "calledClasses_ckjm_ext_loc_min" : 577.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 465.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 30.000000000000004,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 1.4,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 75.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 7.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 13.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.2833333333333333,
        "sf_line_leanmetric" : 49.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.2833333333333333,
        "calledClasses_ckjm_ext_lcom_sum" : 72.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 72.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 14.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 1.0,
        "calledClasses_ckjm_ext_loc_sum" : 577.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.2833333333333333,
        "calledClasses_ckjm_ext_lcom3_max" : 0.7777777777777778,
        "entryClass_ckjm_ext_amc" : 43.15384615384615,
        "sf_method_sf" : 7.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 43.15384615384615,
        "calledClasses_ckjm_ext_npm_max" : 11.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 1.0,
        "calledClasses_ckjm_ext_ca_sum" : 1.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.47151898734177217,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.2833333333333333,
        "jmh_thrpt_score_quadmean" : 232207.43544777838,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 26.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 72.0,
        "sf_line_total" : 75.0,
        "entryClass_ckjm_ext_lcom" : 72.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 316.0,
        "sf_line_sf" : 26.0,
        "hashCodeCloneCountGlobal" : 5.0,
        "luceneScore" : 6.606016635894775,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 12.0,
        "sf_instruction_covered" : 316.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 30.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.7777777777777778,
        "entryClass_ckjm_ext_lcom3" : 0.7777777777777778,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 1.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 1.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 14.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 577.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 316.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 11.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 1.0,
        "calledClasses_ckjm_ext_amc_max" : 43.15384615384615,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 1.0,
        "calledClasses_ckjm_ext_lcom_min" : 72.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 5.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 43.15384615384615,
        "jmh_thrpt_score_mean" : 232207.43544777838,
        "sf_line_missed" : 26.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 26.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 1.0,
        "sf_line_leanness" : 0.6533333333333333,
        "calledUncalledMethodRatio" : 0.46153846153846156,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 149.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 577.0,
        "calledClasses_ckjm_ext_wmc_mean" : 13.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 5.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.2833333333333333,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.7777777777777778,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.2833333333333333,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 11.0,
        "sf_line_nf" : 49.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 149.0,
        "sf_method_covered" : 5.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.7777777777777778,
        "sf_complexity_leanness" : 0.65,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 12.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 40.0,
        "noCalledMethods" : 6.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.5384615384615384,
        "calledClasses_ckjm_ext_npm_min" : 11.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.6795698924731183,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.4166666666666667,
        "calledClasses_ckjm_ext_lcom3_min" : 0.7777777777777778,
        "calledClasses_ckjm_ext_wmc_max" : 13.0,
        "calledClasses_ckjm_ext_rfc_mean" : 30.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 7.0,
        "sf_method_nf" : 5.0,
        "calledClasses_ckjm_ext_npm_geomean" : 11.000000000000002,
        "calledClasses_ckjm_ext_amc_min" : 43.15384615384615,
        "calledClasses_ckjm_ext_wmc_sum" : 13.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 30.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 577.0,
        "calledClasses_ckjm_ext_ca_mean" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 11.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 30.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 232207.43544777838,
        "entryClass_ckjm_ext_wmc" : 13.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 18.0,
        "SINGLE_SMOOP_po" : 9.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.httpobjects.impl.Base64",
      "uri" : "org.httpobjects:httpobjects:0.11.0"
    }, {
      "id" : "900b864d-76ad-409e-a55f-df8673faa654",
      "groupId" : "jfree",
      "artifactId" : "jcommon",
      "version" : "1.0.16",
      "name" : "Base64",
      "packagename" : "org.jfree.xml.util",
      "score" : 6.4814553,
      "hash" : "a7c1da67742e4413509b427875c06c98",
      "content" : "/* ========================================================================\n * JCommon : a free general purpose class library for the Java(tm) platform\n * ========================================================================\n *\n * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.\n * \n * Project Info:  http://www.jfree.org/jcommon/index.html\n *\n * This library is free software; you can redistribute it and/or modify it \n * under the terms of the GNU Lesser General Public License as published by \n * the Free Software Foundation; either version 2.1 of the License, or \n * (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY \n * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public \n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, \n * USA.  \n *\n * [Java is a trademark or registered trademark of Sun Microsystems, Inc. \n * in the United States and other countries.]\n * \n * -------------------------------------\n * AbstractElementDefinitionHandler.java\n * -------------------------------------\n * (C)opyright 2003-2005, by Thomas Morgner and Contributors.\n *\n * Original Author:  Kevin Kelley <kelley@ruralnet.net> -\n *                   30718 Rd. 28, La Junta, CO, 81050  USA. \n *\n * $Id: Base64.java,v 1.4 2005/10/18 13:33:53 mungady Exp $\n *\n * Changes\n * -------------------------\n * 23.09.2003 : Initial version\n *\n */\npackage org.jfree.xml.util;\n\nimport java.io.BufferedInputStream;\nimport java.io.BufferedOutputStream;\nimport java.io.BufferedReader;\nimport java.io.BufferedWriter;\nimport java.io.ByteArrayOutputStream;\nimport java.io.CharArrayWriter;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.FileReader;\nimport java.io.FileWriter;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.Reader;\nimport java.io.Writer;\n\n/**\n * Provides encoding of raw bytes to base64-encoded characters, and\n * decoding of base64 characters to raw bytes.\n * date: 06 August 1998\n * modified: 14 February 2000\n * modified: 22 September 2000\n *\n * @author Kevin Kelley (kelley@ruralnet.net)\n * @version 1.3\n */\npublic class Base64 {\n\n  private Base64 ()\n  {\n  }\n\n    /**\n     * returns an array of base64-encoded characters to represent the\n     * passed data array.\n     *\n     * @param data the array of bytes to encode\n     * @return base64-coded character array.\n     */\n    public static char[] encode(final byte[] data) {\n        final char[] out = new char[((data.length + 2) / 3) * 4];\n\n        //\n        // 3 bytes encode to 4 chars.  Output is always an even\n        // multiple of 4 characters.\n        //\n        for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {\n            boolean quad = false;\n            boolean trip = false;\n\n            int val = (0xFF & data[i]);\n            val <<= 8;\n            if ((i + 1) < data.length) {\n                val |= (0xFF & data[i + 1]);\n                trip = true;\n            }\n            val <<= 8;\n            if ((i + 2) < data.length) {\n                val |= (0xFF & data[i + 2]);\n                quad = true;\n            }\n            out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 1] = alphabet[val & 0x3F];\n            val >>= 6;\n            out[index + 0] = alphabet[val & 0x3F];\n        }\n        return out;\n    }\n\n    /**\n     * Decodes a BASE-64 encoded stream to recover the original\n     * data. White space before and after will be trimmed away,\n     * but no other manipulation of the input will be performed.\n     *\n     * As of version 1.2 this method will properly handle input\n     * containing junk characters (newlines and the like) rather\n     * than throwing an error. It does this by pre-parsing the\n     * input and generating from that a count of VALID input\n     * characters.\n     * \n     * @param data  the character data.\n     * \n     * @return The decoded data.\n     */\n    public static byte[] decode(final char[] data) {\n        // as our input could contain non-BASE64 data (newlines,\n        // whitespace of any sort, whatever) we must first adjust\n        // our count of USABLE data so that...\n        // (a) we don't misallocate the output array, and\n        // (b) think that we miscalculated our data length\n        //     just because of extraneous throw-away junk\n\n        int tempLen = data.length;\n        for (int ix = 0; ix < data.length; ix++) {\n            if ((data[ix] > 255) || codes[data[ix]] < 0) {\n                --tempLen; // ignore non-valid chars and padding\n            }\n        }\n        // calculate required length:\n        //  -- 3 bytes for every 4 valid base64 chars\n        //  -- plus 2 bytes if there are 3 extra base64 chars,\n        //     or plus 1 byte if there are 2 extra.\n\n        int len = (tempLen / 4) * 3;\n        if ((tempLen % 4) == 3) {\n            len += 2;\n        }\n        if ((tempLen % 4) == 2) {\n            len += 1;\n        }\n\n        final byte[] out = new byte[len];\n\n\n        int shift = 0; // # of excess bits stored in accum\n        int accum = 0; // excess bits\n        int index = 0;\n\n        // we now go through the entire array (NOT using the 'tempLen' value)\n        for (int ix = 0; ix < data.length; ix++) {\n            final int value = (data[ix] > 255) ? -1 : codes[data[ix]];\n\n            if (value >= 0) { // skip over non-code\n                accum <<= 6; // bits shift up by 6 each time thru\n                shift += 6; // loop, with new bits being put in\n                accum |= value; // at the bottom.\n                if (shift >= 8) { // whenever there are 8 or more shifted in,\n                    shift -= 8; // write them out (from the top, leaving any\n                    out[index++] = // excess at the bottom for next iteration.\n                        (byte) ((accum >> shift) & 0xff);\n                }\n            }\n            // we will also have skipped processing a padding null byte ('=') here;\n            // these are used ONLY for padding to an even length and do not legally\n            // occur as encoded data. for this reason we can ignore the fact that\n            // no index++ operation occurs in that special case: the out[] array is\n            // initialized to all-zero bytes to start with and that works to our\n            // advantage in this combination.\n        }\n\n        // if there is STILL something wrong we just have to throw up now!\n        if (index != out.length) {\n            throw new Error(\"Miscalculated data length (wrote \" \n                + index + \" instead of \" + out.length + \")\");\n        }\n\n        return out;\n    }\n\n\n    //\n    // code characters for values 0..63\n    //\n    private static char[] alphabet =\n        \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".toCharArray();\n\n    //\n    // lookup table for converting base64 characters to value in range 0..63\n    //\n    private static byte[] codes = new byte[256];\n\n    static {\n        for (int i = 0; i < 256; i++) {\n            codes[i] = -1;\n        }\n        for (int i = 'A'; i <= 'Z'; i++) {\n            codes[i] = (byte) (i - 'A');\n        }\n        for (int i = 'a'; i <= 'z'; i++) {\n            codes[i] = (byte) (26 + i - 'a');\n        }\n        for (int i = '0'; i <= '9'; i++) {\n            codes[i] = (byte) (52 + i - '0');\n        }\n        codes['+'] = 62;\n        codes['/'] = 63;\n    }\n\n\n\n\n    ///////////////////////////////////////////////////\n    // remainder (main method and helper functions) is\n    // for testing purposes only, feel free to clip it.\n    ///////////////////////////////////////////////////\n\n    /**\n     * Entry point.\n     * \n     * @param args  the command line arguments.\n     */\n    public static void main(final String[] args) {\n        boolean decode = false;\n\n        if (args.length == 0) {\n            System.out.println(\"usage:  java Base64 [-d[ecode]] filename\");\n            System.exit(0);\n        }\n        for (int i = 0; i < args.length; i++) {\n            if (\"-decode\".equalsIgnoreCase(args[i])) {\n                decode = true;\n            }\n            else if (\"-d\".equalsIgnoreCase(args[i])) {\n                decode = true;\n            }   \n        }\n\n        final String filename = args[args.length - 1];\n        final File file = new File(filename);\n        if (!file.exists()) {\n            System.out.println(\"Error:  file '\" + filename + \"' doesn't exist!\");\n            System.exit(0);\n        }\n\n        if (decode) {\n            final char[] encoded = readChars(file);\n            final byte[] decoded = decode(encoded);\n            writeBytes(file, decoded);\n        }\n        else {\n            final byte[] decoded = readBytes(file);\n            final char[] encoded = encode(decoded);\n            writeChars(file, encoded);\n        }\n    }\n\n    private static byte[] readBytes(final File file) {\n        final ByteArrayOutputStream baos = new ByteArrayOutputStream();\n        try {\n            final InputStream fis = new FileInputStream(file);\n            final InputStream is = new BufferedInputStream(fis);\n\n            int count;\n            final byte[] buf = new byte[16384];\n            while ((count = is.read(buf)) != -1) {\n                if (count > 0) {\n                    baos.write(buf, 0, count);\n                }   \n            }\n            is.close();\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        return baos.toByteArray();\n    }\n\n    private static char[] readChars(final File file) {\n        final CharArrayWriter caw = new CharArrayWriter();\n        try {\n            final Reader fr = new FileReader(file);\n            final Reader in = new BufferedReader(fr);\n            int count;\n            final char[] buf = new char[16384];\n            while ((count = in.read(buf)) != -1) {\n                if (count > 0) {\n                    caw.write(buf, 0, count);\n                }\n            }\n            in.close();\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        return caw.toCharArray();\n    }\n\n    private static void writeBytes(final File file, final byte[] data) {\n        try {\n            final OutputStream fos = new FileOutputStream(file);\n            final OutputStream os = new BufferedOutputStream(fos);\n            os.write(data);\n            os.close();\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    private static void writeChars(final File file, final char[] data) {\n        try {\n            final Writer fos = new FileWriter(file);\n            final Writer os = new BufferedWriter(fos);\n            os.write(data);\n            os.close();\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n    ///////////////////////////////////////////////////\n    // end of test code.\n    ///////////////////////////////////////////////////\n\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "Base64",
          "returnParam" : null,
          "params" : [ ],
          "visibility" : "private",
          "descriptor" : "-Base64()",
          "lineStart" : 72,
          "lineEnd" : 74,
          "columnStart" : 3,
          "columnEnd" : 3,
          "initializer" : true
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 83,
          "lineEnd" : 114,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 131,
          "lineEnd" : 194,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "main",
          "returnParam" : "void",
          "params" : [ "String[]" ],
          "visibility" : "public",
          "descriptor" : "+main(String[]):void",
          "lineStart" : 238,
          "lineEnd" : 271,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "readBytes",
          "returnParam" : "byte[]",
          "params" : [ "File" ],
          "visibility" : "private",
          "descriptor" : "-readBytes(File):byte[]",
          "lineStart" : 273,
          "lineEnd" : 293,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "readChars",
          "returnParam" : "char[]",
          "params" : [ "File" ],
          "visibility" : "private",
          "descriptor" : "-readChars(File):char[]",
          "lineStart" : 295,
          "lineEnd" : 314,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "writeBytes",
          "returnParam" : "void",
          "params" : [ "File", "byte[]" ],
          "visibility" : "private",
          "descriptor" : "-writeBytes(File, byte[]):void",
          "lineStart" : 316,
          "lineEnd" : 326,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "writeChars",
          "returnParam" : "void",
          "params" : [ "File", "char[]" ],
          "visibility" : "private",
          "descriptor" : "-writeChars(File, char[]):void",
          "lineStart" : 328,
          "lineEnd" : 338,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : [ ],
        "visibility" : "private",
        "descriptor" : "-Base64()",
        "lineStart" : 72,
        "lineEnd" : 74,
        "columnStart" : 3,
        "columnEnd" : 3,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 83,
        "lineEnd" : 114,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 131,
        "lineEnd" : 194,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "jcommon",
        "description" : "JCommon is a free general purpose Java class library that is used in several projects at www.jfree.org, including JFreeChart and JFreeReport.",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "cf20d5ec-2133-4aab-b527-b5d1537876fc" ],
        "_version_" : [ 1521884554699210752 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] org.jfree.xml.util.Base64.encode(byte[])|org.jfree.xml.util.Base64.encode([B)[C|[0]", "false|public static byte[] org.jfree.xml.util.Base64.decode(char[])|org.jfree.xml.util.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|private org.jfree.xml.util.Base64()|org.jfree.xml.util.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.25,
        "sf_complexity_necf" : 33.0,
        "calledClasses_ckjm_ext_ca_max" : 1.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.75,
        "jmh_thrpt_score_sum" : 233349.6264868502,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 18.0,
        "sf_line_balance" : 1.3125,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 60.111111111111114,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 44.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 32.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 9.000000000000002,
        "entryClass_ckjm_ext_loc" : 552.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 233349.62648685032,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 48.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 60.1111111111111,
        "calledClasses_ckjm_ext_cbo_mean" : 1.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 9.0,
        "calledClasses_ckjm_ext_rfc_sum" : 44.0,
        "sf_instruction_necf" : 469.0,
        "calledClasses_ckjm_ext_npm_sum" : 3.0,
        "calledClasses_ckjm_ext_loc_geomean" : 551.9999999999998,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 32.0,
        "calledClasses_ckjm_ext_loc_min" : 552.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 469.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 43.99999999999999,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 1.6666666666666667,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 111.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 5.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 9.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.25,
        "sf_line_leanmetric" : 48.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.25,
        "calledClasses_ckjm_ext_lcom_sum" : 32.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 32.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 15.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 1.0,
        "calledClasses_ckjm_ext_loc_sum" : 552.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.25,
        "calledClasses_ckjm_ext_lcom3_max" : 0.75,
        "entryClass_ckjm_ext_amc" : 60.111111111111114,
        "sf_method_sf" : 5.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 60.111111111111114,
        "calledClasses_ckjm_ext_npm_max" : 3.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 1.0,
        "calledClasses_ckjm_ext_ca_sum" : 1.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.7969348659003831,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.25,
        "jmh_thrpt_score_quadmean" : 233349.6264868502,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 18.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 32.0,
        "sf_line_total" : 111.0,
        "entryClass_ckjm_ext_lcom" : 32.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 261.0,
        "sf_line_sf" : 63.0,
        "hashCodeCloneCountGlobal" : 1.0,
        "luceneScore" : 6.481455326080322,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 8.0,
        "sf_instruction_covered" : 261.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 44.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.75,
        "entryClass_ckjm_ext_lcom3" : 0.75,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 1.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 1.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 15.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 552.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 261.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 1.0,
        "calledClasses_ckjm_ext_amc_max" : 60.111111111111114,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 1.0,
        "calledClasses_ckjm_ext_lcom_min" : 32.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 60.111111111111114,
        "jmh_thrpt_score_mean" : 233349.6264868502,
        "sf_line_missed" : 63.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 18.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 1.0,
        "sf_line_leanness" : 0.43243243243243246,
        "calledUncalledMethodRatio" : 0.4444444444444444,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 208.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 552.0,
        "calledClasses_ckjm_ext_wmc_mean" : 9.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 1.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.25,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.75,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.25,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 3.0,
        "sf_line_nf" : 48.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 208.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.75,
        "sf_complexity_leanness" : 0.5454545454545454,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 8.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 33.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.8333333333333334,
        "calledClasses_ckjm_ext_npm_min" : 3.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.5565031982942431,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.375,
        "calledClasses_ckjm_ext_lcom3_min" : 0.75,
        "calledClasses_ckjm_ext_wmc_max" : 9.0,
        "calledClasses_ckjm_ext_rfc_mean" : 44.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 5.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_amc_min" : 60.111111111111114,
        "calledClasses_ckjm_ext_wmc_sum" : 9.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 44.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 552.0,
        "calledClasses_ckjm_ext_ca_mean" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 3.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 44.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 233349.6264868502,
        "entryClass_ckjm_ext_wmc" : 9.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 22.0,
        "SINGLE_SMOOP_po" : 11.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.jfree.xml.util.Base64",
      "uri" : "jfree:jcommon:1.0.16"
    }, {
      "id" : "bed34e65-7351-4258-b60e-5a049d96b5de",
      "groupId" : "org.apache.ws.commons",
      "artifactId" : "ws-commons-util",
      "version" : "1.0.1",
      "name" : "Base64",
      "packagename" : "org.apache.ws.commons.util",
      "score" : 6.5310283,
      "hash" : "f2073342947d8770522efb4167641cb2",
      "content" : "/*\n * Copyright 1999,2005 The Apache Software Foundation.\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.apache.ws.commons.util;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.StringWriter;\nimport java.io.Writer;\nimport java.lang.reflect.UndeclaredThrowableException;\n\nimport org.xml.sax.ContentHandler;\nimport org.xml.sax.SAXException;\n\n\n/** Performs Base64 encoding and/or decoding. This is an on-the-fly decoder: Unlike,\n * for example, the commons-codec classes, it doesn't depend on byte arrays. In\n * other words, it has an extremely low memory profile. This is well suited even\n * for very large byte streams.\n */\npublic class Base64 {\n\t/** An exception of this type is thrown, if the decoded\n\t * character stream contains invalid input.\n\t */\n\tpublic static class DecodingException extends IOException {\n\t\tprivate static final long serialVersionUID = 3257006574836135478L;\n\t\tDecodingException(String pMessage) { super(pMessage); }\n\t}\n\n\t/** An exception of this type is thrown by the {@link SAXEncoder},\n\t * if writing to the target handler causes a SAX exception.\n\t * This class is required, because the {@link IOException}\n\t * allows no cause until Java 1.3.\n\t */\n\tpublic static class SAXIOException extends IOException {\n\t\tprivate static final long serialVersionUID = 3258131345216451895L;\n\t\tfinal SAXException saxException;\n\t\tSAXIOException(SAXException e) {\n\t\t\tsuper();\n\t\t\tsaxException = e;\n\t\t}\n\t\t/** Returns the encapsulated {@link SAXException}.\n\t\t * @return An exception, which was thrown when invoking\n\t\t * {@link ContentHandler#characters(char[], int, int)}.\n\t\t */\n\t\tpublic SAXException getSAXException() { return saxException; }\n\t}\n\n\n\t/** Default line separator: \\n\n\t */\n\tpublic static final String LINE_SEPARATOR = \"\\n\";\n\n\t/** Default size for line wrapping.\n\t */\n\tpublic static final int LINE_SIZE = 76;\n\n\t/**\n     * This array is a lookup table that translates 6-bit positive integer\n     * index values into their \"Base64 Alphabet\" equivalents as specified \n     * in Table 1 of RFC 2045.\n     */\n    private static final char intToBase64[] = {\n        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n        'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',\n        'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',\n        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'\n    };\n\n    /**\n     * This array is a lookup table that translates unicode characters\n     * drawn from the \"Base64 Alphabet\" (as specified in Table 1 of RFC 2045)\n     * into their 6-bit positive integer equivalents.  Characters that\n     * are not in the Base64 alphabet but fall within the bounds of the\n     * array are translated to -1.\n     */\n    private static final byte base64ToInt[] = {\n        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n        -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54,\n        55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4,\n        5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\n        24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34,\n        35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51\n    };\n\n\t/** An encoder is an object, which is able to encode byte array\n\t * in blocks of three bytes. Any such block is converted into an\n\t * array of four bytes.\n\t */\n\tpublic static abstract class Encoder {\n\t\tprivate int num, numBytes;\n\t\tprivate final char[] charBuffer;\n\t\tprivate int charOffset;\n\t\tprivate final int wrapSize;\n\t\tprivate final int skipChars;\n\t\tprivate final String sep;\n\t\tprivate int lineChars = 0;\n\t\t/** Creates a new instance.\n\t\t * @param pBuffer The encoders buffer. The encoder will\n\t\t * write to the buffer as long as possible. If the\n\t\t * buffer is full or the end of data is signaled, then\n\t\t * the method {@link #writeBuffer(char[], int, int)}\n\t\t * will be invoked.\n\t\t * @param pWrapSize A nonzero value indicates, that a line\n\t\t * wrap should be performed after the given number of\n\t\t * characters. The value must be a multiple of 4. Zero\n\t\t * indicates, that no line wrap should be performed.\n\t\t * @param pSep The eol sequence being used to terminate\n\t\t * a line in case of line wraps. May be null, in which\n\t\t * case the default value {@link Base64#LINE_SEPARATOR}\n\t\t * is being used.\n\t\t */\n\t\tprotected Encoder(char[] pBuffer, int pWrapSize, String pSep) {\n\t\t\tcharBuffer = pBuffer;\n\t\t\tsep = pSep == null ? null : Base64.LINE_SEPARATOR;\n\t\t\tskipChars = pWrapSize == 0 ? 4 : 4 + sep.length();\n\t\t\twrapSize = skipChars == 4 ? 0 : pWrapSize;\n\t\t\tif (wrapSize < 0  ||  wrapSize %4 > 0) {\n\t\t\t\tthrow new IllegalArgumentException(\"Illegal argument for wrap size: \" + pWrapSize\n\t\t\t\t\t\t\t\t\t\t\t\t   + \"(Expected nonnegative multiple of 4)\");\n\t\t\t}\n\t\t\tif (pBuffer.length < skipChars) {\n\t\t\t\tthrow new IllegalArgumentException(\"The buffer must contain at least \" + skipChars\n\t\t\t\t\t\t\t\t\t\t\t\t   + \" characters, but has \" + pBuffer.length);\n\t\t\t}\n\t\t}\n\t\t/** Called for writing the buffer contents to the target.\n\t\t * @param pChars The buffer being written.\n\t\t * @param pOffset Offset of first character being written.\n\t\t * @param pLen Number of characters being written.\n\t\t * @throws IOException Writing to the destination failed.\n\t\t */\n\t\tprotected abstract void writeBuffer(char[] pChars, int pOffset, int pLen) throws IOException;\n\n\t\tprivate void wrap() {\n\t\t\tfor (int j = 0;  j < sep.length();  j++) {\n\t\t\t\tcharBuffer[charOffset++] = sep.charAt(j);\n\t\t\t}\n\t\t\tlineChars = 0;\n\t\t}\n\n\t\t/** Encodes the given byte array.\n\t\t * @param pBuffer Byte array being encoded.\n\t\t * @param pOffset Offset of first byte being encoded.\n\t\t * @param pLen Number of bytes being encoded.\n\t\t * @throws IOException Invoking the {@link #writeBuffer(char[],int,int)} method\n\t\t * for writing the encoded data failed.\n\t\t */\n\t\tpublic void write(byte[] pBuffer, int pOffset, int pLen) throws IOException {\n\t\t\tfor(int i = 0;  i < pLen;  i++) {\n\t\t\t\tint b = pBuffer[pOffset++];\n\t\t\t\tif (b < 0) { b += 256; }\n\t\t\t\tnum = (num << 8) + b;\n\t\t\t\tif (++numBytes == 3) {\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[num >> 18];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[(num >> 12) & 0x3f];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[(num >> 6) & 0x3f];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[num & 0x3f];\n\t\t\t\t\tif (wrapSize > 0) {\n\t\t\t\t\t\tlineChars += 4;\n\t\t\t\t\t\tif (lineChars >= wrapSize) {\n\t\t\t\t\t\t\twrap();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnum = 0;\n\t\t\t\t\tnumBytes = 0;\n\t\t\t\t\tif (charOffset + skipChars > charBuffer.length) {\n\t\t\t\t\t\twriteBuffer(charBuffer, 0, charOffset);\n\t\t\t\t\t\tcharOffset = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t/** Writes any currently buffered data to the destination.\n\t\t * @throws IOException Invoking the {@link #writeBuffer(char[],int,int)}\n\t\t * method for writing the encoded data failed.\n\t\t */\n\t\tpublic void flush() throws IOException {\n\t\t\tif (numBytes > 0) {\n\t\t\t\tif (numBytes == 1) {\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[num >> 2];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[(num << 4) & 0x3f];\n\t\t\t\t\tcharBuffer[charOffset++] = '=';\n\t\t\t\t\tcharBuffer[charOffset++] = '=';\n\t\t\t\t} else {\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[num >> 10];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[(num >> 4) & 0x3f];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[(num << 2) & 0x3f];\n\t\t\t\t\tcharBuffer[charOffset++] = '=';\n\t\t\t\t}\n\t\t\t\tlineChars += 4;\n\t\t\t\tnum = 0;\n\t\t\t\tnumBytes = 0;\n\t\t\t}\n\t\t\tif (wrapSize > 0  &&  lineChars > 0) {\n\t\t\t\twrap();\n\t\t\t}\n\t\t\tif (charOffset > 0) {\n\t\t\t\twriteBuffer(charBuffer, 0, charOffset);\n\t\t\t\tcharOffset = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** An {@link OutputStream}, which is writing to the given\n\t * {@link Encoder}.\n\t */\n\tpublic static class EncoderOutputStream extends OutputStream {\n\t\tprivate final Encoder encoder;\n\t\t/** Creates a new instance, which is creating\n\t\t * output using the given {@link Encoder}.\n\t\t * @param pEncoder The base64 encoder being used.\n\t\t */\n\t\tpublic EncoderOutputStream(Encoder pEncoder) {\n\t\t\tencoder = pEncoder;\n\t\t}\n\t\tprivate final byte[] oneByte = new byte[1];\n\t\tpublic void write(int b) throws IOException {\n\t\t\toneByte[0] = (byte) b;\n\t\t\tencoder.write(oneByte, 0, 1);\n\t\t}\n\t\tpublic void write(byte[] pBuffer, int pOffset, int pLen) throws IOException {\n\t\t\tencoder.write(pBuffer, pOffset, pLen);\n\t\t}\n\t\tpublic void close() throws IOException {\n\t\t\tencoder.flush();\n\t\t}\n\t}\n\n\t/** Returns an {@link OutputStream}, that encodes its input in Base64\n\t * and writes it to the given {@link Writer}. If the Base64 stream\n\t * ends, then the output streams {@link OutputStream#close()} method\n\t * must be invoked. Note, that this will <em>not</em> close the\n\t * target {@link Writer}!\n\t * @param pWriter Target writer.\n\t * @return An output stream, encoding its input in Base64 and writing\n\t * the output to the writer <code>pWriter</code>.\n\t */\n\tpublic static OutputStream newEncoder(Writer pWriter) {\n\t\treturn newEncoder(pWriter, LINE_SIZE, LINE_SEPARATOR);\n\t}\n\n\t/** Returns an {@link OutputStream}, that encodes its input in Base64\n\t * and writes it to the given {@link Writer}. If the Base64 stream\n\t * ends, then the output streams {@link OutputStream#close()} method\n\t * must be invoked. Note, that this will <em>not</em> close the\n\t * target {@link Writer}!\n\t * @param pWriter Target writer.\n\t * @param pLineSize Size of one line in characters, must be a multiple\n\t * of four. Zero indicates, that no line wrapping should occur.\n\t * @param pSeparator Line separator or null, in which case the default value\n\t * {@link #LINE_SEPARATOR} is used.\n\t * @return An output stream, encoding its input in Base64 and writing\n\t * the output to the writer <code>pWriter</code>.\n\t */\n\tpublic static OutputStream newEncoder(final Writer pWriter, int pLineSize, String pSeparator) {\n\t\tfinal Encoder encoder = new Encoder(new char[4096], pLineSize, pSeparator){\n\t\t\tprotected void writeBuffer(char[] pBuffer, int pOffset, int pLen) throws IOException {\n\t\t\t\tpWriter.write(pBuffer, pOffset, pLen);\n\t\t\t}\n\t\t};\n\t\treturn new EncoderOutputStream(encoder);\n\t}\n\n\t/** An {@link Encoder}, which is writing to a SAX content handler.\n\t * This is typically used for embedding a base64 stream into an\n\t * XML document.\n\t */\n\tpublic static class SAXEncoder extends Encoder {\n\t\tprivate final ContentHandler handler;\n\t\t/** Creates a new instance.\n\t\t * @param pBuffer The encoders buffer.\n\t\t * @param pWrapSize A nonzero value indicates, that a line\n\t\t * wrap should be performed after the given number of\n\t\t * characters. The value must be a multiple of 4. Zero\n\t\t * indicates, that no line wrap should be performed.\n\t\t * @param pSep The eol sequence being used to terminate\n\t\t * a line in case of line wraps. May be null, in which\n\t\t * case the default value {@link Base64#LINE_SEPARATOR}\n\t\t * is being used.\n\t\t * @param pHandler The target handler.\n\t\t */\n\t\tpublic SAXEncoder(char[] pBuffer, int pWrapSize, String pSep,\n\t\t\t\t\t\t  ContentHandler pHandler) {\n\t\t\tsuper(pBuffer, pWrapSize, pSep);\n\t\t\thandler = pHandler;\n\t\t}\n\t\t/** Writes to the content handler.\n\t\t * @throws SAXIOException Writing to the content handler\n\t\t * caused a SAXException.\n\t\t */\n\t\tprotected void writeBuffer(char[] pChars, int pOffset, int pLen) throws IOException {\n\t\t\ttry {\n\t\t\t\thandler.characters(pChars, pOffset, pLen);\n\t\t\t} catch (SAXException e) {\n\t\t\t\tthrow new SAXIOException(e);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Converts the given byte array into a base64 encoded character\n\t * array.\n\t * @param pBuffer The buffer being encoded.\n\t * @param pOffset Offset in buffer, where to begin encoding.\n\t * @param pLength Number of bytes being encoded.\n\t * @return Character array of encoded bytes.\n\t */\n\tpublic static String encode(byte[] pBuffer, int pOffset, int pLength) {\n\t\treturn encode(pBuffer, pOffset, pLength, LINE_SIZE, LINE_SEPARATOR);\n\t}\n\n\t/** Converts the given byte array into a base64 encoded character\n\t * array.\n\t * @param pBuffer The buffer being encoded.\n\t * @param pOffset Offset in buffer, where to begin encoding.\n\t * @param pLength Number of bytes being encoded.\n\t * @param pLineSize Size of one line in characters, must be a multiple\n\t * of four. Zero indicates, that no line wrapping should occur.\n\t * @param pSeparator Line separator or null, in which case the default value\n\t * {@link #LINE_SEPARATOR} is used.\n\t * @return Character array of encoded bytes.\n\t */\n\tpublic static String encode(byte[] pBuffer, int pOffset, int pLength,\n\t\t\t\t\t\t\t\tint pLineSize, String pSeparator) {\n\t\tStringWriter sw = new StringWriter();\n\t\tOutputStream ostream = newEncoder(sw, pLineSize, pSeparator);\n\t\ttry {\n\t\t\tostream.write(pBuffer, pOffset, pLength);\n\t\t\tostream.close();\n\t\t} catch (IOException e) {\n\t\t\tthrow new UndeclaredThrowableException(e);\n\t\t}\n\t\treturn sw.toString();\n\t}\n\n\t/** Converts the given byte array into a base64 encoded character\n\t * array with the line size {@link #LINE_SIZE} and the separator\n\t * {@link #LINE_SEPARATOR}.\n\t * @param pBuffer The buffer being encoded.\n\t * @return Character array of encoded bytes.\n\t */\n\tpublic static String encode(byte[] pBuffer) {\n\t\treturn encode(pBuffer, 0, pBuffer.length);\n\t}\n\n\t/** An encoder is an object, which is able to decode char arrays\n\t * in blocks of four bytes. Any such block is converted into a\n\t * array of three bytes.\n\t */\n\tpublic static abstract class Decoder {\n\t\tprivate final byte[] byteBuffer;\n\t\tprivate int byteBufferOffset;\n\t\tprivate int num, numBytes;\n\t\tprivate int eofBytes;\n\t\t/** Creates a new instance.\n\t\t * @param pBufLen The decoders buffer size. The decoder will\n\t\t * store up to this number of decoded bytes before invoking\n\t\t * {@link #writeBuffer(byte[],int,int)}.\n\t\t */\n\t\tprotected Decoder(int pBufLen) {\n\t\t\tbyteBuffer = new byte[pBufLen];\n\t\t}\n\t\t/** Called for writing the decoded bytes to the destination.\n\t\t * @param pBuffer The byte array being written.\n\t\t * @param pOffset Offset of the first byte being written.\n\t\t * @param pLen Number of bytes being written.\n\t\t * @throws IOException Writing to the destination failed.\n\t\t */\n\t\tprotected abstract void writeBuffer(byte[] pBuffer, int pOffset, int pLen) throws IOException;\n\t\t/** Converts the Base64 encoded character array.\n\t\t * @param pData The character array being decoded.\n\t\t * @param pOffset Offset of first character being decoded.\n\t\t * @param pLen Number of characters being decoded.\n\t\t * @throws DecodingException Decoding failed.\n\t\t * @throws IOException An invocation of the {@link #writeBuffer(byte[],int,int)}\n\t\t * method failed.\n\t\t */\n\t\tpublic void write(char[] pData, int pOffset, int pLen) throws IOException {\n\t\t\tfor (int i = 0;  i < pLen;  i++) {\n\t\t\t\tchar c = pData[pOffset++];\n\t\t\t\tif (Character.isWhitespace(c)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (c == '=') {\n\t\t\t\t\t++eofBytes;\n\t\t\t\t\tnum = num << 6;\n\t\t\t\t\tswitch(++numBytes) {\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tthrow new DecodingException(\"Unexpected end of stream character (=)\");\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t// Wait for the next '='\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tbyteBuffer[byteBufferOffset++] = (byte) (num >> 16);\n\t\t\t\t\t\t\tif (eofBytes == 1) {\n\t\t\t\t\t\t\t\tbyteBuffer[byteBufferOffset++] = (byte) (num >> 8);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twriteBuffer(byteBuffer, 0, byteBufferOffset);\n\t\t\t\t\t\t\tbyteBufferOffset = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\tthrow new DecodingException(\"Trailing garbage detected\");\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new IllegalStateException(\"Invalid value for numBytes\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (eofBytes > 0) {\n\t\t\t\t\t\tthrow new DecodingException(\"Base64 characters after end of stream character (=) detected.\");\n\t\t\t\t\t}\n\t\t\t\t\tint result;\n\t\t\t\t\tif (c >= 0  &&  c < base64ToInt.length) {\n\t\t\t\t\t\tresult = base64ToInt[c];\n\t\t\t\t\t\tif (result >= 0) {\n\t\t\t\t\t\t\tnum = (num << 6) + result;\n\t\t\t\t\t\t\tif (++numBytes == 4) {\n\t\t\t\t\t\t\t\tbyteBuffer[byteBufferOffset++] = (byte) (num >> 16);\n\t\t\t\t\t\t\t\tbyteBuffer[byteBufferOffset++] = (byte) ((num >> 8) & 0xff);\n\t\t\t\t\t\t\t\tbyteBuffer[byteBufferOffset++] = (byte) (num & 0xff);\n\t\t\t\t\t\t\t\tif (byteBufferOffset + 3 > byteBuffer.length) {\n\t\t\t\t\t\t\t\t\twriteBuffer(byteBuffer, 0, byteBufferOffset);\n\t\t\t\t\t\t\t\t\tbyteBufferOffset = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tnum = 0;\n\t\t\t\t\t\t\t\tnumBytes = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t    }\n\t\t\t\t\tif (!Character.isWhitespace(c)) {\n\t\t\t\t\t\tthrow new DecodingException(\"Invalid Base64 character: \" + (int) c);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t/** Indicates, that no more data is being expected. Writes all currently\n\t\t * buffered data to the destination by invoking {@link #writeBuffer(byte[],int,int)}.\n\t\t * @throws DecodingException Decoding failed (Unexpected end of file).\n\t\t * @throws IOException An invocation of the {@link #writeBuffer(byte[],int,int)} method failed.\n\t\t */\n\t\tpublic void flush() throws IOException {\n\t\t\tif (numBytes != 0  &&  numBytes != 4) {\n\t\t\t\tthrow new DecodingException(\"Unexpected end of file\");\n\t\t\t}\n\t\t\tif (byteBufferOffset > 0) {\n\t\t\t\twriteBuffer(byteBuffer, 0, byteBufferOffset);\n\t\t\t\tbyteBufferOffset = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Returns a {@link Writer}, that decodes its Base64 encoded\n\t * input and writes it to the given {@link OutputStream}.\n\t * Note, that the writers {@link Writer#close()} method will\n\t * <em>not</em> close the output stream <code>pStream</code>!\n\t * @param pStream Target output stream.\n\t * @return An output stream, encoding its input in Base64 and writing\n\t * the output to the writer <code>pWriter</code>.\n\t */\n\tpublic Writer newDecoder(final OutputStream pStream) {\n\t\treturn new Writer(){\n\t\t\tprivate final Decoder decoder = new Decoder(1024){\n\t\t\t\tprotected void writeBuffer(byte[] pBytes, int pOffset, int pLen) throws IOException {\n\t\t\t\t\tpStream.write(pBytes, pOffset, pLen);\n\t\t\t\t}\n\t\t\t};\n\t\t\tpublic void close() throws IOException {\n\t\t\t\tflush();\n\t\t\t}\n\t\t\tpublic void flush() throws IOException {\n\t\t\t\tdecoder.flush();\n\t\t\t\tpStream.flush();\n\t\t\t}\n\t\t\tpublic void write(char[] cbuf, int off, int len) throws IOException {\n\t\t\t\tdecoder.write(cbuf, off, len);\n\t\t\t}\n\t\t};\n\t}\n\n\t/** Converts the given base64 encoded character buffer into a byte array.\n\t * @param pBuffer The character buffer being decoded.\n\t * @param pOffset Offset of first character being decoded.\n\t * @param pLength Number of characters being decoded.\n\t * @return Converted byte array\n\t * @throws DecodingException The input character stream contained invalid data.\n\t */\n\tpublic static byte[] decode(char[] pBuffer, int pOffset, int pLength) throws DecodingException {\n\t\tfinal ByteArrayOutputStream baos = new ByteArrayOutputStream();\n\t\tDecoder d = new Decoder(1024){\n\t\t\tprotected void writeBuffer(byte[] pBuf, int pOff, int pLen) throws IOException {\n\t\t\t\tbaos.write(pBuf, pOff, pLen);\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\td.write(pBuffer, pOffset, pLength);\n\t\t\td.flush();\n\t\t} catch (DecodingException e) {\n\t\t\tthrow e;\n\t\t} catch (IOException e) {\n\t\t\tthrow new UndeclaredThrowableException(e);\n\t\t}\n\t\treturn baos.toByteArray();\n\t}\n\n\t/** Converts the given base64 encoded character buffer into a byte array.\n\t * @param pBuffer The character buffer being decoded.\n\t * @return Converted byte array\n\t * @throws DecodingException The input character stream contained invalid data.\n\t */\n\tpublic static byte[] decode(char[] pBuffer) throws DecodingException {\n\t\treturn decode(pBuffer, 0, pBuffer.length);\n\t}\n\n\t/** Converts the given base64 encoded String into a byte array.\n\t * @param pBuffer The string being decoded.\n\t * @return Converted byte array\n\t * @throws DecodingException The input character stream contained invalid data.\n\t */\n\tpublic static byte[] decode(String pBuffer) throws DecodingException {\n\t\treturn decode(pBuffer.toCharArray());\n\t}\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "newEncoder",
          "returnParam" : "OutputStream",
          "params" : [ "Writer" ],
          "visibility" : "public",
          "descriptor" : "+newEncoder(Writer):OutputStream",
          "lineStart" : 254,
          "lineEnd" : 256,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "newEncoder",
          "returnParam" : "OutputStream",
          "params" : [ "Writer", "int", "String" ],
          "visibility" : "public",
          "descriptor" : "+newEncoder(Writer, int, String):OutputStream",
          "lineStart" : 271,
          "lineEnd" : 278,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "String",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int):String",
          "lineStart" : 323,
          "lineEnd" : 325,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "String",
          "params" : [ "byte[]", "int", "int", "int", "String" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int, int, String):String",
          "lineStart" : 338,
          "lineEnd" : 349,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "String",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):String",
          "lineStart" : 357,
          "lineEnd" : 359,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "newDecoder",
          "returnParam" : "Writer",
          "params" : [ "OutputStream" ],
          "visibility" : "public",
          "descriptor" : "+newDecoder(OutputStream):Writer",
          "lineStart" : 475,
          "lineEnd" : 493,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], int, int):byte[]",
          "lineStart" : 502,
          "lineEnd" : 518,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 525,
          "lineEnd" : 527,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):byte[]",
          "lineStart" : 534,
          "lineEnd" : 536,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        } ],
        "SAXEncoder" : [ {
          "name" : "SAXEncoder",
          "returnParam" : null,
          "params" : [ "char[]", "int", "String", "ContentHandler" ],
          "visibility" : "public",
          "descriptor" : "+SAXEncoder(char[], int, String, ContentHandler)",
          "lineStart" : 298,
          "lineEnd" : 302,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : true
        }, {
          "name" : "writeBuffer",
          "returnParam" : "void",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "protected",
          "descriptor" : "#writeBuffer(char[], int, int):void",
          "lineStart" : 307,
          "lineEnd" : 313,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        } ],
        "DecodingException" : [ {
          "name" : "DecodingException",
          "returnParam" : null,
          "params" : [ "String" ],
          "visibility" : "",
          "descriptor" : "~DecodingException(String)",
          "lineStart" : 40,
          "lineEnd" : 40,
          "columnStart" : 17,
          "columnEnd" : 71,
          "initializer" : true
        } ],
        "SAXIOException" : [ {
          "name" : "SAXIOException",
          "returnParam" : null,
          "params" : [ "SAXException" ],
          "visibility" : "",
          "descriptor" : "~SAXIOException(SAXException)",
          "lineStart" : 51,
          "lineEnd" : 54,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : true
        }, {
          "name" : "getSAXException",
          "returnParam" : "SAXException",
          "params" : [ ],
          "visibility" : "public",
          "descriptor" : "+getSAXException():SAXException",
          "lineStart" : 59,
          "lineEnd" : 59,
          "columnStart" : 17,
          "columnEnd" : 78,
          "initializer" : false
        } ],
        "Encoder" : [ {
          "name" : "Encoder",
          "returnParam" : null,
          "params" : [ "char[]", "int", "String" ],
          "visibility" : "protected",
          "descriptor" : "#Encoder(char[], int, String)",
          "lineStart" : 128,
          "lineEnd" : 141,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : true
        }, {
          "name" : "writeBuffer",
          "returnParam" : "void",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "protected",
          "descriptor" : "#writeBuffer(char[], int, int):void",
          "lineStart" : 148,
          "lineEnd" : 148,
          "columnStart" : 17,
          "columnEnd" : 109,
          "initializer" : false
        }, {
          "name" : "wrap",
          "returnParam" : "void",
          "params" : [ ],
          "visibility" : "private",
          "descriptor" : "-wrap():void",
          "lineStart" : 150,
          "lineEnd" : 155,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        }, {
          "name" : "write",
          "returnParam" : "void",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+write(byte[], int, int):void",
          "lineStart" : 164,
          "lineEnd" : 188,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        }, {
          "name" : "flush",
          "returnParam" : "void",
          "params" : [ ],
          "visibility" : "public",
          "descriptor" : "+flush():void",
          "lineStart" : 193,
          "lineEnd" : 217,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        } ],
        "Decoder" : [ {
          "name" : "Decoder",
          "returnParam" : null,
          "params" : [ "int" ],
          "visibility" : "protected",
          "descriptor" : "#Decoder(int)",
          "lineStart" : 375,
          "lineEnd" : 377,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : true
        }, {
          "name" : "writeBuffer",
          "returnParam" : "void",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "protected",
          "descriptor" : "#writeBuffer(byte[], int, int):void",
          "lineStart" : 384,
          "lineEnd" : 384,
          "columnStart" : 17,
          "columnEnd" : 110,
          "initializer" : false
        }, {
          "name" : "write",
          "returnParam" : "void",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+write(char[], int, int):void",
          "lineStart" : 393,
          "lineEnd" : 450,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        }, {
          "name" : "flush",
          "returnParam" : "void",
          "params" : [ ],
          "visibility" : "public",
          "descriptor" : "+flush():void",
          "lineStart" : 456,
          "lineEnd" : 464,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        } ],
        "EncoderOutputStream" : [ {
          "name" : "EncoderOutputStream",
          "returnParam" : null,
          "params" : [ "Encoder" ],
          "visibility" : "public",
          "descriptor" : "+EncoderOutputStream(Encoder)",
          "lineStart" : 229,
          "lineEnd" : 231,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : true
        }, {
          "name" : "write",
          "returnParam" : "void",
          "params" : [ "int" ],
          "visibility" : "public",
          "descriptor" : "+write(int):void",
          "lineStart" : 233,
          "lineEnd" : 236,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        }, {
          "name" : "write",
          "returnParam" : "void",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+write(byte[], int, int):void",
          "lineStart" : 237,
          "lineEnd" : 239,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        }, {
          "name" : "close",
          "returnParam" : "void",
          "params" : [ ],
          "visibility" : "public",
          "descriptor" : "+close():void",
          "lineStart" : 240,
          "lineEnd" : 242,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 525,
        "lineEnd" : 527,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      } ],
      "failedMethods" : [ {
        "name" : null,
        "returnParam" : null,
        "params" : null,
        "visibility" : null,
        "descriptor" : "encode(byte[]):char[]",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : false
      } ],
      "artifactInfo" : {
        "name" : "Apache WebServices Common Utilities",
        "description" : "This is a small collection of utility classes, that allow high performance XML processing based on SAX. Basically, it is assumed, that you are using an JAXP 1.1 compliant XML parser and nothing else. In particular, no dependency on the javax.xml.transform package is introduced.",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : false
      },
      "values" : {
        "id" : [ "2585de1d-8a11-48fa-abef-6dcb8cf6be5f" ],
        "_version_" : [ 1521884645618089984 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "junit:junit:3.8.1", "xml-apis:xml-apis:1.0.b2" ] ],
        "method" : [ [ "true|||", "false|public static byte[] org.apache.ws.commons.util.Base64.decode(char[]) throws org.apache.ws.commons.util.Base64$DecodingException|org.apache.ws.commons.util.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public org.apache.ws.commons.util.Base64()|org.apache.ws.commons.util.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 3.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 3.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "uncalledClasses_ckjm_ext_loc_sum" : 548.0,
        "calledClasses_ckjm_ext_cam_sum" : 1.5148809523809523,
        "uncalledClasses_ckjm_ext_wmc_min" : 1.0,
        "uncalledClasses_ckjm_ext_cbo_sum" : 15.0,
        "sf_complexity_necf" : 68.0,
        "calledClasses_ckjm_ext_ca_max" : 4.0,
        "uncalledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.5777777777777778,
        "uncalledClasses_ckjm_ext_npm_quadmean" : 2.1984843263788196,
        "uncalledClasses_ckjm_ext_moa_safe" : 1.0,
        "jmh_thrpt_score_sum" : 37619.476196885254,
        "uncalledClasses_ckjm_ext_dam_geomean" : 0.0,
        "calledClasses_ckjm_ext_mfa_mean" : 0.25,
        "uncalledClasses_ckjm_ext_rfc_N" : 6.0,
        "fs_dynamic" : 0.5,
        "sf_complexity_covered" : 26.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 138.1153846153846,
        "sf_line_balance" : 1.5573770491803278,
        "calledClasses_ckjm_ext_noc_max" : 2.0,
        "uncalledClasses_ckjm_ext_rfc_min" : 2.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_cam_geomean" : 0.6214465011907718,
        "uncalledClasses_ckjm_ext_dam_sum" : 3.333333333333333,
        "entryClass_ckjm_ext_rfc" : 28.0,
        "uncalledClasses_ckjm_ext_dam_mean" : 0.5555555555555556,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 74.0,
        "uncalledClasses_ckjm_ext_npm_safe" : 1.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 4.702669375441515,
        "uncalledClasses_ckjm_ext_ce_sum" : 8.0,
        "sf_method_error_prop" : 0.0,
        "entryClass_ckjm_ext_loc" : 883.0,
        "jmh_thrpt_score_geomean" : 37619.47619688523,
        "uncalledClasses_ckjm_ext_cbm_mean" : 1.0,
        "uncalledClasses_ckjm_ext_loc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_rfc_max" : 14.0,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 61.0,
        "calledClasses_ckjm_ext_wmc_N" : 3.0,
        "uncalledClasses_ckjm_ext_dit_mean" : 2.1666666666666665,
        "uncalledClasses_ckjm_ext_ce_N" : 6.0,
        "calledClasses_ckjm_ext_cbo_mean" : 4.666666666666667,
        "entryClass_ckjm_ext_dam" : 0.5,
        "calledClasses_ckjm_ext_amc_geomean" : 31.09883342358459,
        "calledClasses_ckjm_ext_rfc_sum" : 45.0,
        "calledClasses_ckjm_ext_wmc_min" : 2.0,
        "uncalledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_dit_geomean" : 2.0,
        "sf_instruction_necf" : 893.0,
        "calledClasses_ckjm_ext_npm_sum" : 12.0,
        "uncalledClasses_ckjm_ext_cbm_N" : 6.0,
        "calledClasses_ckjm_ext_loc_geomean" : 158.84502918016477,
        "uncalledClasses_ckjm_ext_mfa_safe" : 1.0,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 24.666666666666664,
        "calledClasses_ckjm_ext_loc_min" : 17.0,
        "uncalledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 1.1547005383792515,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.4330127018922193,
        "sf_instruction_total" : 893.0,
        "uncalledClasses_ckjm_ext_cam_quadmean" : 0.6883434220406749,
        "uncalledClasses_ckjm_ext_lcom3_mean" : 0.5462962962962963,
        "calledClasses_ckjm_ext_noc_N" : 3.0,
        "uncalledClasses_ckjm_ext_dit_safe" : 1.0,
        "uncalledClasses_ckjm_ext_noc_sum" : 2.0,
        "calledClasses_ckjm_ext_cbm_N" : 3.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 11.334102216194125,
        "calledClasses_ckjm_ext_moa_N" : 3.0,
        "sf_method_balance" : 3.0,
        "uncalledClasses_ckjm_ext_amc_quadmean" : 34.248394122936624,
        "uncalledClasses_ckjm_ext_cbm_sum" : 6.0,
        "uncalledClasses_ckjm_ext_dit_sum" : 13.0,
        "uncalledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "uncalledClasses_ckjm_ext_moa_mean" : 0.6666666666666667,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "uncalledClasses_ckjm_ext_moa_sum" : 4.0,
        "uncalledClasses_ckjm_ext_cam_sum" : 3.93,
        "calledClasses_ckjm_ext_dit_sum" : 4.0,
        "sf_line_necf" : 156.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_mfa_N" : 6.0,
        "uncalledClasses_ckjm_ext_lcom_max" : 0.0,
        "uncalledClasses_numberOfClasses" : 6.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 7.937253933193772,
        "noUncalledMethods" : 24.0,
        "uncalledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.44033628610721015,
        "uncalledClasses_ckjm_ext_dit_max" : 4.0,
        "uncalledClasses_ckjm_ext_ca_min" : 1.0,
        "sf_line_leanmetric" : 61.0,
        "uncalledClasses_ckjm_ext_dam_N" : 6.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.5049603174603174,
        "uncalledClasses_ckjm_ext_npm_min" : 0.0,
        "uncalledClasses_ckjm_ext_loc_quadmean" : 175.01333282543553,
        "calledClasses_ckjm_ext_lcom_sum" : 74.0,
        "uncalledClasses_ckjm_ext_lcom_quadmean" : 0.0,
        "uncalledClasses_ckjm_ext_moa_max" : 2.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 0.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "uncalledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "sf_complexity_sf" : 42.0,
        "uncalledClasses_ckjm_ext_dit_quadmean" : 2.345207879911715,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 7.0,
        "calledClasses_ckjm_ext_loc_sum" : 1167.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_lcom3_max" : 1.0,
        "calledClasses_ckjm_ext_cam_min" : 0.20238095238095238,
        "sf_method_sf" : 24.0,
        "entryClass_ckjm_ext_amc" : 66.61538461538461,
        "uncalledClasses_ckjm_ext_cbo_min" : 2.0,
        "uncalledClasses_ckjm_ext_wmc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_noc_quadmean" : 0.816496580927726,
        "calledClasses_ckjm_ext_noc_sum" : 2.0,
        "calledClasses_ckjm_ext_dam_min" : 0.0,
        "uncalledClasses_ckjm_ext_wmc_quadmean" : 3.3166247903554,
        "uncalledClasses_ckjm_ext_cbo_geomean" : 2.4018739103520055,
        "calledClasses_ckjm_ext_ca_N" : 3.0,
        "calledClasses_ckjm_ext_amc_mean" : 46.03846153846154,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "uncalledClasses_ckjm_ext_mfa_sum" : 3.9875,
        "uncalledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_npm_max" : 10.0,
        "calledClasses_ckjm_ext_ce_sum" : 10.0,
        "calledClasses_ckjm_ext_ca_sum" : 8.0,
        "calledClasses_ckjm_ext_cbo_min" : 2.0,
        "sf_instruction_balance" : 1.8713826366559485,
        "entryClass_ckjm_ext_dit" : 1.0,
        "uncalledClasses_ckjm_ext_ce_max" : 3.0,
        "calledClasses_ckjm_ext_dam_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_N" : 3.0,
        "entryClass_ckjm_ext_cam" : 0.20238095238095238,
        "jmh_thrpt_score_quadmean" : 37619.476196885254,
        "uncalledClasses_ckjm_ext_lcom_safe" : 1.0,
        "uncalledClasses_ckjm_ext_lcom3_geomean" : 0.0,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_mfa_quadmean" : 0.7363515068679269,
        "uncalledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "uncalledClasses_ckjm_ext_amc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "uncalledClasses_ckjm_ext_cbo_mean" : 2.5,
        "sf_complexity_leanmetric" : 26.0,
        "uncalledClasses_ckjm_ext_loc_min" : 6.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 42.72391992003231,
        "sf_line_total" : 156.0,
        "uncalledClasses_ckjm_ext_amc_N" : 6.0,
        "uncalledClasses_ckjm_ext_rfc_safe" : 1.0,
        "entryClass_ckjm_ext_lcom" : 74.0,
        "uncalledClasses_ckjm_ext_amc_max" : 82.2,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "uncalledClasses_ckjm_ext_noc_max" : 2.0,
        "calledClasses_ckjm_ext_amc_N" : 3.0,
        "calledClasses_ckjm_ext_ce_max" : 7.0,
        "uncalledClasses_ckjm_ext_lcom3_quadmean" : 0.8716499656120227,
        "uncalledClasses_ckjm_ext_lcom_N" : 6.0,
        "uncalledClasses_ckjm_ext_cam_max" : 1.0,
        "sf_instruction_nf" : 311.0,
        "sf_line_sf" : 95.0,
        "hashCodeCloneCountGlobal" : 3.0,
        "uncalledClasses_ckjm_ext_lcom3_min" : 0.0,
        "luceneScore" : 6.5310282707214355,
        "noCalledMethodsJava" : 2.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 0.6454972243679028,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_lcom_sum" : 0.0,
        "uncalledClasses_ckjm_ext_mfa_min" : 0.0,
        "uncalledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 3.0,
        "calledClasses_ckjm_ext_lcom_N" : 3.0,
        "calledClasses_ckjm_ext_ce_geomean" : 2.4101422641752297,
        "uncalledClasses_ckjm_ext_ca_N" : 6.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 32.0,
        "uncalledClasses_ckjm_ext_loc_geomean" : 33.55298609313876,
        "uncalledClasses_ckjm_ext_cbm_quadmean" : 1.2909944487358056,
        "uncalledClasses_ckjm_ext_cam_safe" : 1.0,
        "sf_instruction_covered" : 311.0,
        "calledClasses_ckjm_ext_dit_N" : 3.0,
        "calledClasses_ckjm_ext_rfc_max" : 28.0,
        "uncalledClasses_ckjm_ext_loc_N" : 6.0,
        "uncalledClasses_ckjm_ext_rfc_geomean" : 5.517848352762241,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.7159557197149783,
        "entryClass_ckjm_ext_lcom3" : 1.0,
        "uncalledClasses_ckjm_ext_dit_N" : 6.0,
        "uncalledClasses_ckjm_ext_amc_sum" : 118.7,
        "uncalledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.4142135623730951,
        "calledClasses_ckjm_ext_ca_min" : 1.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.75,
        "uncalledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 2.2894284851066637,
        "calledClasses_ckjm_ext_dam_sum" : 1.5,
        "sf_complexity_missed" : 42.0,
        "uncalledClasses_ckjm_ext_lcom3_sum" : 3.277777777777778,
        "calledClasses_ckjm_ext_mfa_sum" : 0.75,
        "uncalledClasses_ckjm_ext_ca_mean" : 1.8333333333333333,
        "calledClasses_ckjm_ext_loc_max" : 883.0,
        "uncalledClasses_ckjm_ext_ce_mean" : 1.3333333333333333,
        "uncalledClasses_ckjm_ext_ce_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 3.0,
        "calledClasses_ckjm_ext_mfa_N" : 3.0,
        "uncalledClasses_ckjm_ext_dit_min" : 1.0,
        "uncalledClasses_ckjm_ext_wmc_max" : 5.0,
        "sf_instruction_leanmetric" : 311.0,
        "calledClasses_ckjm_ext_cbm_sum" : 2.0,
        "uncalledClasses_ckjm_ext_wmc_mean" : 3.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 4.242640687119285,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 5.887840577551898,
        "calledClasses_numberOfClasses" : 3.0,
        "uncalledClasses_ckjm_ext_npm_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_cbm_max" : 2.0,
        "uncalledClasses_ckjm_ext_npm_sum" : 9.0,
        "uncalledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 14.0,
        "calledClasses_ckjm_ext_amc_max" : 66.61538461538461,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 3.0,
        "calledClasses_ckjm_ext_lcom_min" : 0.0,
        "entryClass_ckjm_ext_ce" : 7.0,
        "uncalledClasses_ckjm_ext_amc_mean" : 19.783333333333335,
        "uncalledClasses_ckjm_ext_ce_quadmean" : 1.632993161855452,
        "calledClasses_ckjm_ext_npm_N" : 3.0,
        "sf_method_leanmetric" : 8.0,
        "fs_unique" : 0.5,
        "uncalledClasses_ckjm_ext_cbo_N" : 6.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 53.68693033832232,
        "uncalledClasses_ckjm_ext_lcom_min" : 0.0,
        "uncalledClasses_ckjm_ext_cbo_quadmean" : 2.614064523559687,
        "uncalledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "sf_line_missed" : 95.0,
        "jmh_thrpt_score_mean" : 37619.476196885254,
        "calledClasses_ckjm_ext_cbo_quadmean" : 5.0990195135927845,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "uncalledClasses_ckjm_ext_ca_max" : 4.0,
        "uncalledClasses_ckjm_ext_rfc_quadmean" : 7.767453465154029,
        "uncalledClasses_ckjm_ext_moa_quadmean" : 1.0,
        "uncalledClasses_ckjm_ext_noc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.6666666666666667,
        "uncalledClasses_ckjm_ext_lcom3_N" : 6.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 2.943920288775949,
        "uncalledClasses_ckjm_ext_mfa_mean" : 0.6645833333333333,
        "sf_complexity_nf" : 26.0,
        "sf_line_leanness" : 0.391025641025641,
        "uncalledClasses_ckjm_ext_ca_quadmean" : 2.1213203435596424,
        "uncalledClasses_ckjm_ext_moa_N" : 6.0,
        "calledUncalledMethodRatio" : 0.2727272727272727,
        "calledClasses_ckjm_ext_cbo_N" : 3.0,
        "sf_instruction_missed" : 582.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 1.1547005383792515,
        "uncalledClasses_ckjm_ext_noc_mean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_loc_mean" : 389.0,
        "calledClasses_ckjm_ext_wmc_mean" : 6.333333333333333,
        "sf_method_error_size" : 0.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "hashCodeCloneCountLocal" : 2.0,
        "uncalledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_mfa_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.75,
        "uncalledClasses_ckjm_ext_npm_max" : 4.0,
        "calledClasses_ckjm_ext_lcom3_sum" : 1.7333333333333334,
        "uncalledClasses_ckjm_ext_lcom_geomean" : 0.0,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.5537340817536341,
        "calledClasses_ckjm_ext_npm_mean" : 4.0,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "sf_line_nf" : 61.0,
        "uncalledClasses_ckjm_ext_wmc_N" : 6.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_moa_min" : 0.0,
        "sf_instruction_sf" : 582.0,
        "uncalledClasses_ckjm_ext_ce_min" : 0.0,
        "uncalledClasses_ckjm_ext_dam_min" : 0.0,
        "sf_method_covered" : 8.0,
        "calledClasses_ckjm_ext_loc_N" : 3.0,
        "uncalledClasses_ckjm_ext_rfc_mean" : 6.666666666666667,
        "calledClasses_ckjm_ext_cbo_geomean" : 4.121285299808556,
        "uncalledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_mean" : 3.3333333333333335,
        "sf_complexity_leanness" : 0.38235294117647056,
        "calledClasses_ckjm_ext_cbo_max" : 7.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.6666666666666666,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "uncalledClasses_ckjm_ext_loc_mean" : 91.33333333333333,
        "calledClasses_ckjm_ext_dit_geomean" : 1.2599210498948732,
        "sf_method_necf" : 32.0,
        "calledClasses_ckjm_ext_cbm_max" : 2.0,
        "uncalledClasses_ckjm_ext_cbo_max" : 4.0,
        "uncalledClasses_ckjm_ext_dit_estimated_N" : 6.0,
        "sf_complexity_total" : 68.0,
        "noCalledMethods" : 9.0,
        "calledClasses_ckjm_ext_dam_mean" : 0.5,
        "sf_complexity_balance" : 1.6153846153846154,
        "uncalledClasses_ckjm_ext_dam_quadmean" : 0.7200822998230956,
        "uncalledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_wmc_sum" : 18.0,
        "calledClasses_ckjm_ext_npm_min" : 0.0,
        "uncalledClasses_ckjm_ext_lcom_mean" : 0.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.3482642777155655,
        "calledClasses_ckjm_ext_dit_mean" : 1.3333333333333333,
        "uncalledClasses_ckjm_ext_noc_N" : 6.0,
        "sf_method_leanness" : 0.25,
        "uncalledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.0,
        "calledClasses_ckjm_ext_wmc_max" : 13.0,
        "calledClasses_ckjm_ext_rfc_mean" : 15.0,
        "calledClasses_ckjm_ext_dit_max" : 2.0,
        "uncalledClasses_ckjm_ext_loc_max" : 424.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "uncalledClasses_ckjm_ext_ca_sum" : 11.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "uncalledClasses_ckjm_ext_cam_mean" : 0.655,
        "uncalledClasses_ckjm_ext_cbm_min" : 0.0,
        "sf_method_missed" : 24.0,
        "sf_method_nf" : 8.0,
        "uncalledClasses_ckjm_ext_cam_min" : 0.4,
        "uncalledClasses_ckjm_ext_amc_min" : 4.0,
        "uncalledClasses_ckjm_ext_amc_geomean" : 10.60695786020561,
        "calledClasses_ckjm_ext_npm_geomean" : 0.0,
        "calledClasses_ckjm_ext_amc_min" : 7.0,
        "calledClasses_ckjm_ext_wmc_sum" : 19.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 17.97220075561143,
        "uncalledClasses_ckjm_ext_npm_mean" : 1.5,
        "calledClasses_ckjm_ext_loc_quadmean" : 532.6872127868912,
        "uncalledClasses_ckjm_ext_ca_geomean" : 1.5874010519681994,
        "calledClasses_ckjm_ext_ca_mean" : 2.6666666666666665,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "uncalledClasses_ckjm_ext_cam_N" : 6.0,
        "entryClass_ckjm_ext_npm" : 10.0,
        "uncalledClasses_ckjm_ext_ca_safe" : 1.0,
        "uncalledClasses_ckjm_ext_rfc_sum" : 40.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 3.0,
        "calledClasses_ckjm_ext_rfc_min" : 4.0,
        "uncalledClasses_ckjm_ext_noc_min" : 0.0,
        "calledClasses_ckjm_ext_ce_min" : 1.0,
        "projectDeps" : 2.0,
        "uncalledClasses_ckjm_ext_npm_N" : 6.0,
        "jmh_thrpt_score_0" : 37619.476196885254,
        "uncalledClasses_ckjm_ext_lcom3_max" : 2.0,
        "uncalledClasses_ckjm_ext_wmc_geomean" : 2.615320972023661,
        "entryClass_ckjm_ext_wmc" : 13.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 19.0,
        "SINGLE_SMOOP_po" : 10.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.apache.ws.commons.util.Base64",
      "uri" : "org.apache.ws.commons:ws-commons-util:1.0.1"
    }, {
      "id" : "78074f03-c4bf-47ed-898e-ed895026b6e7",
      "groupId" : "org.apache.ws.commons.util",
      "artifactId" : "ws-commons-util",
      "version" : "1.0.2",
      "name" : "Base64",
      "packagename" : "org.apache.ws.commons.util",
      "score" : 6.5310283,
      "hash" : "75b3a8afe154d3e3307308f325b50290",
      "content" : "/*\n * Copyright 1999,2005 The Apache Software Foundation.\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.apache.ws.commons.util;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.StringWriter;\nimport java.io.Writer;\nimport java.lang.reflect.UndeclaredThrowableException;\n\nimport org.xml.sax.ContentHandler;\nimport org.xml.sax.SAXException;\n\n\n/** Performs Base64 encoding and/or decoding. This is an on-the-fly decoder: Unlike,\n * for example, the commons-codec classes, it doesn't depend on byte arrays. In\n * other words, it has an extremely low memory profile. This is well suited even\n * for very large byte streams.\n */\npublic class Base64 {\n\t/** An exception of this type is thrown, if the decoded\n\t * character stream contains invalid input.\n\t */\n\tpublic static class DecodingException extends IOException {\n\t\tprivate static final long serialVersionUID = 3257006574836135478L;\n\t\tDecodingException(String pMessage) { super(pMessage); }\n\t}\n\n\t/** An exception of this type is thrown by the {@link SAXEncoder},\n\t * if writing to the target handler causes a SAX exception.\n\t * This class is required, because the {@link IOException}\n\t * allows no cause until Java 1.3.\n\t */\n\tpublic static class SAXIOException extends IOException {\n\t\tprivate static final long serialVersionUID = 3258131345216451895L;\n\t\tfinal SAXException saxException;\n\t\tSAXIOException(SAXException e) {\n\t\t\tsuper();\n\t\t\tsaxException = e;\n\t\t}\n\t\t/** Returns the encapsulated {@link SAXException}.\n\t\t * @return An exception, which was thrown when invoking\n\t\t * {@link ContentHandler#characters(char[], int, int)}.\n\t\t */\n\t\tpublic SAXException getSAXException() { return saxException; }\n\t}\n\n\n\t/** Default line separator: \\n\n\t */\n\tpublic static final String LINE_SEPARATOR = \"\\n\";\n\n\t/** Default size for line wrapping.\n\t */\n\tpublic static final int LINE_SIZE = 76;\n\n\t/**\n     * This array is a lookup table that translates 6-bit positive integer\n     * index values into their \"Base64 Alphabet\" equivalents as specified \n     * in Table 1 of RFC 2045.\n     */\n    private static final char intToBase64[] = {\n        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n        'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',\n        'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',\n        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'\n    };\n\n    /**\n     * This array is a lookup table that translates unicode characters\n     * drawn from the \"Base64 Alphabet\" (as specified in Table 1 of RFC 2045)\n     * into their 6-bit positive integer equivalents.  Characters that\n     * are not in the Base64 alphabet but fall within the bounds of the\n     * array are translated to -1.\n     */\n    private static final byte base64ToInt[] = {\n        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n        -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54,\n        55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4,\n        5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\n        24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34,\n        35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51\n    };\n\n\t/** An encoder is an object, which is able to encode byte array\n\t * in blocks of three bytes. Any such block is converted into an\n\t * array of four bytes.\n\t */\n\tpublic static abstract class Encoder {\n\t\tprivate int num, numBytes;\n\t\tprivate final char[] charBuffer;\n\t\tprivate int charOffset;\n\t\tprivate final int wrapSize;\n\t\tprivate final int skipChars;\n\t\tprivate final String sep;\n\t\tprivate int lineChars = 0;\n\t\t/** Creates a new instance.\n\t\t * @param pBuffer The encoders buffer. The encoder will\n\t\t * write to the buffer as long as possible. If the\n\t\t * buffer is full or the end of data is signaled, then\n\t\t * the method {@link #writeBuffer(char[], int, int)}\n\t\t * will be invoked.\n\t\t * @param pWrapSize A nonzero value indicates, that a line\n\t\t * wrap should be performed after the given number of\n\t\t * characters. The value must be a multiple of 4. Zero\n\t\t * indicates, that no line wrap should be performed.\n\t\t * @param pSep The eol sequence being used to terminate\n\t\t * a line in case of line wraps. May be null, in which\n\t\t * case the default value {@link Base64#LINE_SEPARATOR}\n\t\t * is being used.\n\t\t */\n\t\tprotected Encoder(char[] pBuffer, int pWrapSize, String pSep) {\n\t\t\tcharBuffer = pBuffer;\n\t\t\tsep = pSep == null ? null : Base64.LINE_SEPARATOR;\n\t\t\tskipChars = pWrapSize == 0 ? 4 : 4 + sep.length();\n\t\t\twrapSize = skipChars == 4 ? 0 : pWrapSize;\n\t\t\tif (wrapSize < 0  ||  wrapSize %4 > 0) {\n\t\t\t\tthrow new IllegalArgumentException(\"Illegal argument for wrap size: \" + pWrapSize\n\t\t\t\t\t\t\t\t\t\t\t\t   + \"(Expected nonnegative multiple of 4)\");\n\t\t\t}\n\t\t\tif (pBuffer.length < skipChars) {\n\t\t\t\tthrow new IllegalArgumentException(\"The buffer must contain at least \" + skipChars\n\t\t\t\t\t\t\t\t\t\t\t\t   + \" characters, but has \" + pBuffer.length);\n\t\t\t}\n\t\t}\n\t\t/** Called for writing the buffer contents to the target.\n\t\t * @param pChars The buffer being written.\n\t\t * @param pOffset Offset of first character being written.\n\t\t * @param pLen Number of characters being written.\n\t\t * @throws IOException Writing to the destination failed.\n\t\t */\n\t\tprotected abstract void writeBuffer(char[] pChars, int pOffset, int pLen) throws IOException;\n\n\t\tprivate void wrap() {\n\t\t\tfor (int j = 0;  j < sep.length();  j++) {\n\t\t\t\tcharBuffer[charOffset++] = sep.charAt(j);\n\t\t\t}\n\t\t\tlineChars = 0;\n\t\t}\n\n\t\t/** Encodes the given byte array.\n\t\t * @param pBuffer Byte array being encoded.\n\t\t * @param pOffset Offset of first byte being encoded.\n\t\t * @param pLen Number of bytes being encoded.\n\t\t * @throws IOException Invoking the {@link #writeBuffer(char[],int,int)} method\n\t\t * for writing the encoded data failed.\n\t\t */\n\t\tpublic void write(byte[] pBuffer, int pOffset, int pLen) throws IOException {\n\t\t\tfor(int i = 0;  i < pLen;  i++) {\n\t\t\t\tint b = pBuffer[pOffset++];\n\t\t\t\tif (b < 0) { b += 256; }\n\t\t\t\tnum = (num << 8) + b;\n\t\t\t\tif (++numBytes == 3) {\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[num >> 18];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[(num >> 12) & 0x3f];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[(num >> 6) & 0x3f];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[num & 0x3f];\n\t\t\t\t\tif (wrapSize > 0) {\n\t\t\t\t\t\tlineChars += 4;\n\t\t\t\t\t\tif (lineChars >= wrapSize) {\n\t\t\t\t\t\t\twrap();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnum = 0;\n\t\t\t\t\tnumBytes = 0;\n\t\t\t\t\tif (charOffset + skipChars > charBuffer.length) {\n\t\t\t\t\t\twriteBuffer(charBuffer, 0, charOffset);\n\t\t\t\t\t\tcharOffset = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t/** Writes any currently buffered data to the destination.\n\t\t * @throws IOException Invoking the {@link #writeBuffer(char[],int,int)}\n\t\t * method for writing the encoded data failed.\n\t\t */\n\t\tpublic void flush() throws IOException {\n\t\t\tif (numBytes > 0) {\n\t\t\t\tif (numBytes == 1) {\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[num >> 2];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[(num << 4) & 0x3f];\n\t\t\t\t\tcharBuffer[charOffset++] = '=';\n\t\t\t\t\tcharBuffer[charOffset++] = '=';\n\t\t\t\t} else {\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[num >> 10];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[(num >> 4) & 0x3f];\n\t\t\t\t\tcharBuffer[charOffset++] = intToBase64[(num << 2) & 0x3f];\n\t\t\t\t\tcharBuffer[charOffset++] = '=';\n\t\t\t\t}\n\t\t\t\tlineChars += 4;\n\t\t\t\tnum = 0;\n\t\t\t\tnumBytes = 0;\n\t\t\t}\n\t\t\tif (wrapSize > 0  &&  lineChars > 0) {\n\t\t\t\twrap();\n\t\t\t}\n\t\t\tif (charOffset > 0) {\n\t\t\t\twriteBuffer(charBuffer, 0, charOffset);\n\t\t\t\tcharOffset = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** An {@link OutputStream}, which is writing to the given\n\t * {@link Encoder}.\n\t */\n\tpublic static class EncoderOutputStream extends OutputStream {\n\t\tprivate final Encoder encoder;\n\t\t/** Creates a new instance, which is creating\n\t\t * output using the given {@link Encoder}.\n\t\t * @param pEncoder The base64 encoder being used.\n\t\t */\n\t\tpublic EncoderOutputStream(Encoder pEncoder) {\n\t\t\tencoder = pEncoder;\n\t\t}\n\t\tprivate final byte[] oneByte = new byte[1];\n\t\tpublic void write(int b) throws IOException {\n\t\t\toneByte[0] = (byte) b;\n\t\t\tencoder.write(oneByte, 0, 1);\n\t\t}\n\t\tpublic void write(byte[] pBuffer, int pOffset, int pLen) throws IOException {\n\t\t\tencoder.write(pBuffer, pOffset, pLen);\n\t\t}\n\t\tpublic void close() throws IOException {\n\t\t\tencoder.flush();\n\t\t}\n\t}\n\n\t/** Returns an {@link OutputStream}, that encodes its input in Base64\n\t * and writes it to the given {@link Writer}. If the Base64 stream\n\t * ends, then the output streams {@link OutputStream#close()} method\n\t * must be invoked. Note, that this will <em>not</em> close the\n\t * target {@link Writer}!\n\t * @param pWriter Target writer.\n\t * @return An output stream, encoding its input in Base64 and writing\n\t * the output to the writer <code>pWriter</code>.\n\t */\n\tpublic static OutputStream newEncoder(Writer pWriter) {\n\t\treturn newEncoder(pWriter, LINE_SIZE, LINE_SEPARATOR);\n\t}\n\n\t/** Returns an {@link OutputStream}, that encodes its input in Base64\n\t * and writes it to the given {@link Writer}. If the Base64 stream\n\t * ends, then the output streams {@link OutputStream#close()} method\n\t * must be invoked. Note, that this will <em>not</em> close the\n\t * target {@link Writer}!\n\t * @param pWriter Target writer.\n\t * @param pLineSize Size of one line in characters, must be a multiple\n\t * of four. Zero indicates, that no line wrapping should occur.\n\t * @param pSeparator Line separator or null, in which case the default value\n\t * {@link #LINE_SEPARATOR} is used.\n\t * @return An output stream, encoding its input in Base64 and writing\n\t * the output to the writer <code>pWriter</code>.\n\t */\n\tpublic static OutputStream newEncoder(final Writer pWriter, int pLineSize, String pSeparator) {\n\t\tfinal Encoder encoder = new Encoder(new char[4096], pLineSize, pSeparator){\n\t\t\tprotected void writeBuffer(char[] pBuffer, int pOffset, int pLen) throws IOException {\n\t\t\t\tpWriter.write(pBuffer, pOffset, pLen);\n\t\t\t}\n\t\t};\n\t\treturn new EncoderOutputStream(encoder);\n\t}\n\n\t/** An {@link Encoder}, which is writing to a SAX content handler.\n\t * This is typically used for embedding a base64 stream into an\n\t * XML document.\n\t */\n\tpublic static class SAXEncoder extends Encoder {\n\t\tprivate final ContentHandler handler;\n\t\t/** Creates a new instance.\n\t\t * @param pBuffer The encoders buffer.\n\t\t * @param pWrapSize A nonzero value indicates, that a line\n\t\t * wrap should be performed after the given number of\n\t\t * characters. The value must be a multiple of 4. Zero\n\t\t * indicates, that no line wrap should be performed.\n\t\t * @param pSep The eol sequence being used to terminate\n\t\t * a line in case of line wraps. May be null, in which\n\t\t * case the default value {@link Base64#LINE_SEPARATOR}\n\t\t * is being used.\n\t\t * @param pHandler The target handler.\n\t\t */\n\t\tpublic SAXEncoder(char[] pBuffer, int pWrapSize, String pSep,\n\t\t\t\t\t\t  ContentHandler pHandler) {\n\t\t\tsuper(pBuffer, pWrapSize, pSep);\n\t\t\thandler = pHandler;\n\t\t}\n\t\t/** Writes to the content handler.\n\t\t * @throws SAXIOException Writing to the content handler\n\t\t * caused a SAXException.\n\t\t */\n\t\tprotected void writeBuffer(char[] pChars, int pOffset, int pLen) throws IOException {\n\t\t\ttry {\n\t\t\t\thandler.characters(pChars, pOffset, pLen);\n\t\t\t} catch (SAXException e) {\n\t\t\t\tthrow new SAXIOException(e);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Converts the given byte array into a base64 encoded character\n\t * array.\n\t * @param pBuffer The buffer being encoded.\n\t * @param pOffset Offset in buffer, where to begin encoding.\n\t * @param pLength Number of bytes being encoded.\n\t * @return Character array of encoded bytes.\n\t */\n\tpublic static String encode(byte[] pBuffer, int pOffset, int pLength) {\n\t\treturn encode(pBuffer, pOffset, pLength, LINE_SIZE, LINE_SEPARATOR);\n\t}\n\n\t/** Converts the given byte array into a base64 encoded character\n\t * array.\n\t * @param pBuffer The buffer being encoded.\n\t * @param pOffset Offset in buffer, where to begin encoding.\n\t * @param pLength Number of bytes being encoded.\n\t * @param pLineSize Size of one line in characters, must be a multiple\n\t * of four. Zero indicates, that no line wrapping should occur.\n\t * @param pSeparator Line separator or null, in which case the default value\n\t * {@link #LINE_SEPARATOR} is used.\n\t * @return Character array of encoded bytes.\n\t */\n\tpublic static String encode(byte[] pBuffer, int pOffset, int pLength,\n\t\t\t\t\t\t\t\tint pLineSize, String pSeparator) {\n\t\tStringWriter sw = new StringWriter();\n\t\tOutputStream ostream = newEncoder(sw, pLineSize, pSeparator);\n\t\ttry {\n\t\t\tostream.write(pBuffer, pOffset, pLength);\n\t\t\tostream.close();\n\t\t} catch (IOException e) {\n\t\t\tthrow new UndeclaredThrowableException(e);\n\t\t}\n\t\treturn sw.toString();\n\t}\n\n\t/** Converts the given byte array into a base64 encoded character\n\t * array with the line size {@link #LINE_SIZE} and the separator\n\t * {@link #LINE_SEPARATOR}.\n\t * @param pBuffer The buffer being encoded.\n\t * @return Character array of encoded bytes.\n\t */\n\tpublic static String encode(byte[] pBuffer) {\n\t\treturn encode(pBuffer, 0, pBuffer.length);\n\t}\n\n\t/** An encoder is an object, which is able to decode char arrays\n\t * in blocks of four bytes. Any such block is converted into a\n\t * array of three bytes.\n\t */\n\tpublic static abstract class Decoder {\n\t\tprivate final byte[] byteBuffer;\n\t\tprivate int byteBufferOffset;\n\t\tprivate int num, numBytes;\n\t\tprivate int eofBytes;\n\t\t/** Creates a new instance.\n\t\t * @param pBufLen The decoders buffer size. The decoder will\n\t\t * store up to this number of decoded bytes before invoking\n\t\t * {@link #writeBuffer(byte[],int,int)}.\n\t\t */\n\t\tprotected Decoder(int pBufLen) {\n\t\t\tbyteBuffer = new byte[pBufLen];\n\t\t}\n\t\t/** Called for writing the decoded bytes to the destination.\n\t\t * @param pBuffer The byte array being written.\n\t\t * @param pOffset Offset of the first byte being written.\n\t\t * @param pLen Number of bytes being written.\n\t\t * @throws IOException Writing to the destination failed.\n\t\t */\n\t\tprotected abstract void writeBuffer(byte[] pBuffer, int pOffset, int pLen) throws IOException;\n\t\t/** Converts the Base64 encoded character array.\n\t\t * @param pData The character array being decoded.\n\t\t * @param pOffset Offset of first character being decoded.\n\t\t * @param pLen Number of characters being decoded.\n\t\t * @throws DecodingException Decoding failed.\n\t\t * @throws IOException An invocation of the {@link #writeBuffer(byte[],int,int)}\n\t\t * method failed.\n\t\t */\n\t\tpublic void write(char[] pData, int pOffset, int pLen) throws IOException {\n\t\t\tfor (int i = 0;  i < pLen;  i++) {\n\t\t\t\tchar c = pData[pOffset++];\n\t\t\t\tif (Character.isWhitespace(c)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (c == '=') {\n\t\t\t\t\t++eofBytes;\n\t\t\t\t\tnum = num << 6;\n\t\t\t\t\tswitch(++numBytes) {\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tthrow new DecodingException(\"Unexpected end of stream character (=)\");\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t// Wait for the next '='\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tbyteBuffer[byteBufferOffset++] = (byte) (num >> 16);\n\t\t\t\t\t\t\tif (eofBytes == 1) {\n\t\t\t\t\t\t\t\tbyteBuffer[byteBufferOffset++] = (byte) (num >> 8);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twriteBuffer(byteBuffer, 0, byteBufferOffset);\n\t\t\t\t\t\t\tbyteBufferOffset = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\tthrow new DecodingException(\"Trailing garbage detected\");\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new IllegalStateException(\"Invalid value for numBytes\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (eofBytes > 0) {\n\t\t\t\t\t\tthrow new DecodingException(\"Base64 characters after end of stream character (=) detected.\");\n\t\t\t\t\t}\n\t\t\t\t\tint result;\n\t\t\t\t\tif (c >= 0  &&  c < base64ToInt.length) {\n\t\t\t\t\t\tresult = base64ToInt[c];\n\t\t\t\t\t\tif (result >= 0) {\n\t\t\t\t\t\t\tnum = (num << 6) + result;\n\t\t\t\t\t\t\tif (++numBytes == 4) {\n\t\t\t\t\t\t\t\tbyteBuffer[byteBufferOffset++] = (byte) (num >> 16);\n\t\t\t\t\t\t\t\tbyteBuffer[byteBufferOffset++] = (byte) ((num >> 8) & 0xff);\n\t\t\t\t\t\t\t\tbyteBuffer[byteBufferOffset++] = (byte) (num & 0xff);\n\t\t\t\t\t\t\t\tif (byteBufferOffset + 3 > byteBuffer.length) {\n\t\t\t\t\t\t\t\t\twriteBuffer(byteBuffer, 0, byteBufferOffset);\n\t\t\t\t\t\t\t\t\tbyteBufferOffset = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tnum = 0;\n\t\t\t\t\t\t\t\tnumBytes = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t    }\n\t\t\t\t\tif (!Character.isWhitespace(c)) {\n\t\t\t\t\t\tthrow new DecodingException(\"Invalid Base64 character: \" + (int) c);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t/** Indicates, that no more data is being expected. Writes all currently\n\t\t * buffered data to the destination by invoking {@link #writeBuffer(byte[],int,int)}.\n\t\t * @throws DecodingException Decoding failed (Unexpected end of file).\n\t\t * @throws IOException An invocation of the {@link #writeBuffer(byte[],int,int)} method failed.\n\t\t */\n\t\tpublic void flush() throws IOException {\n\t\t\tif (numBytes != 0  &&  numBytes != 4) {\n\t\t\t\tthrow new DecodingException(\"Unexpected end of file\");\n\t\t\t}\n\t\t\tif (byteBufferOffset > 0) {\n\t\t\t\twriteBuffer(byteBuffer, 0, byteBufferOffset);\n\t\t\t\tbyteBufferOffset = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Returns a {@link Writer}, that decodes its Base64 encoded\n\t * input and writes it to the given {@link OutputStream}.\n\t * Note, that the writers {@link Writer#close()} method will\n\t * <em>not</em> close the output stream <code>pStream</code>!\n\t * @param pStream Target output stream.\n\t * @return An output stream, encoding its input in Base64 and writing\n\t * the output to the writer <code>pWriter</code>.\n\t */\n\tpublic static Writer newDecoder(final OutputStream pStream) {\n\t\treturn new Writer(){\n\t\t\tprivate final Decoder decoder = new Decoder(1024){\n\t\t\t\tprotected void writeBuffer(byte[] pBytes, int pOffset, int pLen) throws IOException {\n\t\t\t\t\tpStream.write(pBytes, pOffset, pLen);\n\t\t\t\t}\n\t\t\t};\n\t\t\tpublic void close() throws IOException {\n\t\t\t\tflush();\n\t\t\t}\n\t\t\tpublic void flush() throws IOException {\n\t\t\t\tdecoder.flush();\n\t\t\t\tpStream.flush();\n\t\t\t}\n\t\t\tpublic void write(char[] cbuf, int off, int len) throws IOException {\n\t\t\t\tdecoder.write(cbuf, off, len);\n\t\t\t}\n\t\t};\n\t}\n\n\t/** Converts the given base64 encoded character buffer into a byte array.\n\t * @param pBuffer The character buffer being decoded.\n\t * @param pOffset Offset of first character being decoded.\n\t * @param pLength Number of characters being decoded.\n\t * @return Converted byte array\n\t * @throws DecodingException The input character stream contained invalid data.\n\t */\n\tpublic static byte[] decode(char[] pBuffer, int pOffset, int pLength) throws DecodingException {\n\t\tfinal ByteArrayOutputStream baos = new ByteArrayOutputStream();\n\t\tDecoder d = new Decoder(1024){\n\t\t\tprotected void writeBuffer(byte[] pBuf, int pOff, int pLen) throws IOException {\n\t\t\t\tbaos.write(pBuf, pOff, pLen);\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\td.write(pBuffer, pOffset, pLength);\n\t\t\td.flush();\n\t\t} catch (DecodingException e) {\n\t\t\tthrow e;\n\t\t} catch (IOException e) {\n\t\t\tthrow new UndeclaredThrowableException(e);\n\t\t}\n\t\treturn baos.toByteArray();\n\t}\n\n\t/** Converts the given base64 encoded character buffer into a byte array.\n\t * @param pBuffer The character buffer being decoded.\n\t * @return Converted byte array\n\t * @throws DecodingException The input character stream contained invalid data.\n\t */\n\tpublic static byte[] decode(char[] pBuffer) throws DecodingException {\n\t\treturn decode(pBuffer, 0, pBuffer.length);\n\t}\n\n\t/** Converts the given base64 encoded String into a byte array.\n\t * @param pBuffer The string being decoded.\n\t * @return Converted byte array\n\t * @throws DecodingException The input character stream contained invalid data.\n\t */\n\tpublic static byte[] decode(String pBuffer) throws DecodingException {\n\t\treturn decode(pBuffer.toCharArray());\n\t}\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "newEncoder",
          "returnParam" : "OutputStream",
          "params" : [ "Writer" ],
          "visibility" : "public",
          "descriptor" : "+newEncoder(Writer):OutputStream",
          "lineStart" : 254,
          "lineEnd" : 256,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "newEncoder",
          "returnParam" : "OutputStream",
          "params" : [ "Writer", "int", "String" ],
          "visibility" : "public",
          "descriptor" : "+newEncoder(Writer, int, String):OutputStream",
          "lineStart" : 271,
          "lineEnd" : 278,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "String",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int):String",
          "lineStart" : 323,
          "lineEnd" : 325,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "String",
          "params" : [ "byte[]", "int", "int", "int", "String" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[], int, int, int, String):String",
          "lineStart" : 338,
          "lineEnd" : 349,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "String",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):String",
          "lineStart" : 357,
          "lineEnd" : 359,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "newDecoder",
          "returnParam" : "Writer",
          "params" : [ "OutputStream" ],
          "visibility" : "public",
          "descriptor" : "+newDecoder(OutputStream):Writer",
          "lineStart" : 475,
          "lineEnd" : 493,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], int, int):byte[]",
          "lineStart" : 502,
          "lineEnd" : 518,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 525,
          "lineEnd" : 527,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):byte[]",
          "lineStart" : 534,
          "lineEnd" : 536,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        } ],
        "SAXEncoder" : [ {
          "name" : "SAXEncoder",
          "returnParam" : null,
          "params" : [ "char[]", "int", "String", "ContentHandler" ],
          "visibility" : "public",
          "descriptor" : "+SAXEncoder(char[], int, String, ContentHandler)",
          "lineStart" : 298,
          "lineEnd" : 302,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : true
        }, {
          "name" : "writeBuffer",
          "returnParam" : "void",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "protected",
          "descriptor" : "#writeBuffer(char[], int, int):void",
          "lineStart" : 307,
          "lineEnd" : 313,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        } ],
        "DecodingException" : [ {
          "name" : "DecodingException",
          "returnParam" : null,
          "params" : [ "String" ],
          "visibility" : "",
          "descriptor" : "~DecodingException(String)",
          "lineStart" : 40,
          "lineEnd" : 40,
          "columnStart" : 17,
          "columnEnd" : 71,
          "initializer" : true
        } ],
        "SAXIOException" : [ {
          "name" : "SAXIOException",
          "returnParam" : null,
          "params" : [ "SAXException" ],
          "visibility" : "",
          "descriptor" : "~SAXIOException(SAXException)",
          "lineStart" : 51,
          "lineEnd" : 54,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : true
        }, {
          "name" : "getSAXException",
          "returnParam" : "SAXException",
          "params" : [ ],
          "visibility" : "public",
          "descriptor" : "+getSAXException():SAXException",
          "lineStart" : 59,
          "lineEnd" : 59,
          "columnStart" : 17,
          "columnEnd" : 78,
          "initializer" : false
        } ],
        "Encoder" : [ {
          "name" : "Encoder",
          "returnParam" : null,
          "params" : [ "char[]", "int", "String" ],
          "visibility" : "protected",
          "descriptor" : "#Encoder(char[], int, String)",
          "lineStart" : 128,
          "lineEnd" : 141,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : true
        }, {
          "name" : "writeBuffer",
          "returnParam" : "void",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "protected",
          "descriptor" : "#writeBuffer(char[], int, int):void",
          "lineStart" : 148,
          "lineEnd" : 148,
          "columnStart" : 17,
          "columnEnd" : 109,
          "initializer" : false
        }, {
          "name" : "wrap",
          "returnParam" : "void",
          "params" : [ ],
          "visibility" : "private",
          "descriptor" : "-wrap():void",
          "lineStart" : 150,
          "lineEnd" : 155,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        }, {
          "name" : "write",
          "returnParam" : "void",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+write(byte[], int, int):void",
          "lineStart" : 164,
          "lineEnd" : 188,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        }, {
          "name" : "flush",
          "returnParam" : "void",
          "params" : [ ],
          "visibility" : "public",
          "descriptor" : "+flush():void",
          "lineStart" : 193,
          "lineEnd" : 217,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        } ],
        "Decoder" : [ {
          "name" : "Decoder",
          "returnParam" : null,
          "params" : [ "int" ],
          "visibility" : "protected",
          "descriptor" : "#Decoder(int)",
          "lineStart" : 375,
          "lineEnd" : 377,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : true
        }, {
          "name" : "writeBuffer",
          "returnParam" : "void",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "protected",
          "descriptor" : "#writeBuffer(byte[], int, int):void",
          "lineStart" : 384,
          "lineEnd" : 384,
          "columnStart" : 17,
          "columnEnd" : 110,
          "initializer" : false
        }, {
          "name" : "write",
          "returnParam" : "void",
          "params" : [ "char[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+write(char[], int, int):void",
          "lineStart" : 393,
          "lineEnd" : 450,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        }, {
          "name" : "flush",
          "returnParam" : "void",
          "params" : [ ],
          "visibility" : "public",
          "descriptor" : "+flush():void",
          "lineStart" : 456,
          "lineEnd" : 464,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        } ],
        "EncoderOutputStream" : [ {
          "name" : "EncoderOutputStream",
          "returnParam" : null,
          "params" : [ "Encoder" ],
          "visibility" : "public",
          "descriptor" : "+EncoderOutputStream(Encoder)",
          "lineStart" : 229,
          "lineEnd" : 231,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : true
        }, {
          "name" : "write",
          "returnParam" : "void",
          "params" : [ "int" ],
          "visibility" : "public",
          "descriptor" : "+write(int):void",
          "lineStart" : 233,
          "lineEnd" : 236,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        }, {
          "name" : "write",
          "returnParam" : "void",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+write(byte[], int, int):void",
          "lineStart" : 237,
          "lineEnd" : 239,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        }, {
          "name" : "close",
          "returnParam" : "void",
          "params" : [ ],
          "visibility" : "public",
          "descriptor" : "+close():void",
          "lineStart" : 240,
          "lineEnd" : 242,
          "columnStart" : 17,
          "columnEnd" : 17,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 525,
        "lineEnd" : 527,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      } ],
      "failedMethods" : [ {
        "name" : null,
        "returnParam" : null,
        "params" : null,
        "visibility" : null,
        "descriptor" : "encode(byte[]):char[]",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : false
      } ],
      "artifactInfo" : {
        "name" : "Apache WebServices Common Utilities",
        "description" : "This is a small collection of utility classes, that allow high performance XML\n      processing based on SAX. Basically, it is assumed, that you are using an JAXP\n      1.1 compliant XML parser and nothing else. In particular, no dependency on the\n      javax.xml.transform package is introduced.",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "9f26bbc5-58aa-4b18-85b1-5bf97b170076" ],
        "_version_" : [ 1521884645692538880 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "junit:junit:3.8.1", "xml-apis:xml-apis:1.0.b2" ] ],
        "method" : [ [ "true|||", "false|public static byte[] org.apache.ws.commons.util.Base64.decode(char[]) throws org.apache.ws.commons.util.Base64$DecodingException|org.apache.ws.commons.util.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public org.apache.ws.commons.util.Base64()|org.apache.ws.commons.util.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 3.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 3.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "uncalledClasses_ckjm_ext_loc_sum" : 544.0,
        "calledClasses_ckjm_ext_cam_sum" : 1.5029761904761905,
        "uncalledClasses_ckjm_ext_wmc_min" : 1.0,
        "uncalledClasses_ckjm_ext_cbo_sum" : 15.0,
        "sf_complexity_necf" : 68.0,
        "calledClasses_ckjm_ext_ca_max" : 4.0,
        "uncalledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.5777777777777778,
        "uncalledClasses_ckjm_ext_npm_quadmean" : 2.1984843263788196,
        "uncalledClasses_ckjm_ext_moa_safe" : 1.0,
        "jmh_thrpt_score_sum" : 38443.2895784466,
        "uncalledClasses_ckjm_ext_dam_geomean" : 0.0,
        "calledClasses_ckjm_ext_mfa_mean" : 0.25,
        "uncalledClasses_ckjm_ext_rfc_N" : 6.0,
        "fs_dynamic" : 0.5,
        "sf_complexity_covered" : 26.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 138.03846153846155,
        "sf_line_balance" : 1.5573770491803278,
        "calledClasses_ckjm_ext_noc_max" : 2.0,
        "uncalledClasses_ckjm_ext_rfc_min" : 2.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_cam_geomean" : 0.6307976861004162,
        "uncalledClasses_ckjm_ext_dam_sum" : 3.5,
        "entryClass_ckjm_ext_rfc" : 28.0,
        "uncalledClasses_ckjm_ext_dam_mean" : 0.5833333333333334,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 74.0,
        "uncalledClasses_ckjm_ext_npm_safe" : 1.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 4.702669375441515,
        "uncalledClasses_ckjm_ext_ce_sum" : 7.0,
        "sf_method_error_prop" : 0.0,
        "entryClass_ckjm_ext_loc" : 882.0,
        "jmh_thrpt_score_geomean" : 38443.28957844658,
        "uncalledClasses_ckjm_ext_cbm_mean" : 1.0,
        "uncalledClasses_ckjm_ext_loc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_rfc_max" : 14.0,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 61.0,
        "calledClasses_ckjm_ext_wmc_N" : 3.0,
        "uncalledClasses_ckjm_ext_dit_mean" : 2.1666666666666665,
        "uncalledClasses_ckjm_ext_ce_N" : 6.0,
        "calledClasses_ckjm_ext_cbo_mean" : 4.666666666666667,
        "entryClass_ckjm_ext_dam" : 0.5,
        "calledClasses_ckjm_ext_amc_geomean" : 31.086858515422,
        "calledClasses_ckjm_ext_rfc_sum" : 45.0,
        "calledClasses_ckjm_ext_wmc_min" : 2.0,
        "uncalledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_dit_geomean" : 2.0,
        "sf_instruction_necf" : 889.0,
        "calledClasses_ckjm_ext_npm_sum" : 12.0,
        "uncalledClasses_ckjm_ext_cbm_N" : 6.0,
        "calledClasses_ckjm_ext_loc_geomean" : 158.78504238096326,
        "uncalledClasses_ckjm_ext_mfa_safe" : 1.0,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 24.666666666666664,
        "calledClasses_ckjm_ext_loc_min" : 17.0,
        "uncalledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 1.1547005383792515,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.4330127018922193,
        "sf_instruction_total" : 889.0,
        "uncalledClasses_ckjm_ext_cam_quadmean" : 0.6921351325186915,
        "uncalledClasses_ckjm_ext_lcom3_mean" : 0.49999999999999994,
        "calledClasses_ckjm_ext_noc_N" : 3.0,
        "uncalledClasses_ckjm_ext_dit_safe" : 1.0,
        "uncalledClasses_ckjm_ext_noc_sum" : 2.0,
        "calledClasses_ckjm_ext_cbm_N" : 3.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 11.334102216194125,
        "calledClasses_ckjm_ext_moa_N" : 3.0,
        "sf_method_balance" : 3.0,
        "uncalledClasses_ckjm_ext_amc_quadmean" : 34.21963982861304,
        "uncalledClasses_ckjm_ext_cbm_sum" : 6.0,
        "uncalledClasses_ckjm_ext_dit_sum" : 13.0,
        "uncalledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "uncalledClasses_ckjm_ext_moa_mean" : 0.5,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "uncalledClasses_ckjm_ext_moa_sum" : 3.0,
        "uncalledClasses_ckjm_ext_cam_sum" : 3.9675,
        "calledClasses_ckjm_ext_dit_sum" : 4.0,
        "sf_line_necf" : 156.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_mfa_N" : 6.0,
        "uncalledClasses_ckjm_ext_lcom_max" : 0.0,
        "uncalledClasses_numberOfClasses" : 6.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 7.937253933193772,
        "noUncalledMethods" : 24.0,
        "uncalledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.43152718699859105,
        "uncalledClasses_ckjm_ext_dit_max" : 4.0,
        "uncalledClasses_ckjm_ext_ca_min" : 1.0,
        "sf_line_leanmetric" : 61.0,
        "uncalledClasses_ckjm_ext_dam_N" : 6.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.5009920634920635,
        "uncalledClasses_ckjm_ext_npm_min" : 0.0,
        "uncalledClasses_ckjm_ext_loc_quadmean" : 174.86852203870197,
        "calledClasses_ckjm_ext_lcom_sum" : 74.0,
        "uncalledClasses_ckjm_ext_lcom_quadmean" : 0.0,
        "uncalledClasses_ckjm_ext_moa_max" : 1.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 0.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "uncalledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "sf_complexity_sf" : 42.0,
        "uncalledClasses_ckjm_ext_dit_quadmean" : 2.345207879911715,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 7.0,
        "calledClasses_ckjm_ext_loc_sum" : 1166.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_lcom3_max" : 1.0,
        "calledClasses_ckjm_ext_cam_min" : 0.19047619047619047,
        "sf_method_sf" : 24.0,
        "entryClass_ckjm_ext_amc" : 66.53846153846153,
        "uncalledClasses_ckjm_ext_cbo_min" : 2.0,
        "uncalledClasses_ckjm_ext_wmc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_noc_quadmean" : 0.816496580927726,
        "calledClasses_ckjm_ext_noc_sum" : 2.0,
        "calledClasses_ckjm_ext_dam_min" : 0.0,
        "uncalledClasses_ckjm_ext_wmc_quadmean" : 3.3166247903554,
        "uncalledClasses_ckjm_ext_cbo_geomean" : 2.4018739103520055,
        "calledClasses_ckjm_ext_ca_N" : 3.0,
        "calledClasses_ckjm_ext_amc_mean" : 46.01282051282051,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "uncalledClasses_ckjm_ext_mfa_sum" : 3.9875,
        "uncalledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_npm_max" : 10.0,
        "calledClasses_ckjm_ext_ce_sum" : 10.0,
        "calledClasses_ckjm_ext_ca_sum" : 7.0,
        "calledClasses_ckjm_ext_cbo_min" : 2.0,
        "sf_instruction_balance" : 1.8585209003215435,
        "entryClass_ckjm_ext_dit" : 1.0,
        "uncalledClasses_ckjm_ext_ce_max" : 2.0,
        "calledClasses_ckjm_ext_dam_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_N" : 3.0,
        "entryClass_ckjm_ext_cam" : 0.19047619047619047,
        "jmh_thrpt_score_quadmean" : 38443.2895784466,
        "uncalledClasses_ckjm_ext_lcom_safe" : 1.0,
        "uncalledClasses_ckjm_ext_lcom3_geomean" : 0.0,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_mfa_quadmean" : 0.7363515068679269,
        "uncalledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "uncalledClasses_ckjm_ext_amc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "uncalledClasses_ckjm_ext_cbo_mean" : 2.5,
        "sf_complexity_leanmetric" : 26.0,
        "uncalledClasses_ckjm_ext_loc_min" : 6.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 42.72391992003231,
        "sf_line_total" : 156.0,
        "uncalledClasses_ckjm_ext_amc_N" : 6.0,
        "uncalledClasses_ckjm_ext_rfc_safe" : 1.0,
        "entryClass_ckjm_ext_lcom" : 74.0,
        "uncalledClasses_ckjm_ext_amc_max" : 82.2,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "uncalledClasses_ckjm_ext_noc_max" : 2.0,
        "calledClasses_ckjm_ext_amc_N" : 3.0,
        "calledClasses_ckjm_ext_ce_max" : 7.0,
        "uncalledClasses_ckjm_ext_lcom3_quadmean" : 0.8552669065744807,
        "uncalledClasses_ckjm_ext_lcom_N" : 6.0,
        "uncalledClasses_ckjm_ext_cam_max" : 1.0,
        "sf_instruction_nf" : 311.0,
        "sf_line_sf" : 95.0,
        "hashCodeCloneCountGlobal" : 2.0,
        "uncalledClasses_ckjm_ext_lcom3_min" : 0.0,
        "luceneScore" : 6.5310282707214355,
        "noCalledMethodsJava" : 2.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 0.6454972243679028,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_lcom_sum" : 0.0,
        "uncalledClasses_ckjm_ext_mfa_min" : 0.0,
        "uncalledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 3.0,
        "calledClasses_ckjm_ext_lcom_N" : 3.0,
        "calledClasses_ckjm_ext_ce_geomean" : 2.4101422641752297,
        "uncalledClasses_ckjm_ext_ca_N" : 6.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 32.0,
        "uncalledClasses_ckjm_ext_loc_geomean" : 32.96893576855209,
        "uncalledClasses_ckjm_ext_cbm_quadmean" : 1.2909944487358056,
        "uncalledClasses_ckjm_ext_cam_safe" : 1.0,
        "sf_instruction_covered" : 311.0,
        "calledClasses_ckjm_ext_dit_N" : 3.0,
        "calledClasses_ckjm_ext_rfc_max" : 28.0,
        "uncalledClasses_ckjm_ext_loc_N" : 6.0,
        "uncalledClasses_ckjm_ext_rfc_geomean" : 5.517848352762241,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.7159557197149783,
        "entryClass_ckjm_ext_lcom3" : 1.0,
        "uncalledClasses_ckjm_ext_dit_N" : 6.0,
        "uncalledClasses_ckjm_ext_amc_sum" : 117.95,
        "uncalledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.4142135623730951,
        "calledClasses_ckjm_ext_ca_min" : 1.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.75,
        "uncalledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 2.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.5,
        "sf_complexity_missed" : 42.0,
        "uncalledClasses_ckjm_ext_lcom3_sum" : 3.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.75,
        "uncalledClasses_ckjm_ext_ca_mean" : 1.8333333333333333,
        "calledClasses_ckjm_ext_loc_max" : 882.0,
        "uncalledClasses_ckjm_ext_ce_mean" : 1.1666666666666665,
        "uncalledClasses_ckjm_ext_ce_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 3.0,
        "calledClasses_ckjm_ext_mfa_N" : 3.0,
        "uncalledClasses_ckjm_ext_dit_min" : 1.0,
        "uncalledClasses_ckjm_ext_wmc_max" : 5.0,
        "sf_instruction_leanmetric" : 311.0,
        "calledClasses_ckjm_ext_cbm_sum" : 2.0,
        "uncalledClasses_ckjm_ext_wmc_mean" : 3.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 4.242640687119285,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 5.887840577551898,
        "calledClasses_numberOfClasses" : 3.0,
        "uncalledClasses_ckjm_ext_npm_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_cbm_max" : 2.0,
        "uncalledClasses_ckjm_ext_npm_sum" : 9.0,
        "uncalledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 14.0,
        "calledClasses_ckjm_ext_amc_max" : 66.53846153846153,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 2.0,
        "calledClasses_ckjm_ext_lcom_min" : 0.0,
        "entryClass_ckjm_ext_ce" : 7.0,
        "uncalledClasses_ckjm_ext_amc_mean" : 19.65833333333333,
        "uncalledClasses_ckjm_ext_ce_quadmean" : 1.35400640077266,
        "calledClasses_ckjm_ext_npm_N" : 3.0,
        "sf_method_leanmetric" : 8.0,
        "fs_unique" : 0.5,
        "uncalledClasses_ckjm_ext_cbo_N" : 6.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 53.65512359475506,
        "uncalledClasses_ckjm_ext_lcom_min" : 0.0,
        "uncalledClasses_ckjm_ext_cbo_quadmean" : 2.614064523559687,
        "uncalledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "sf_line_missed" : 95.0,
        "jmh_thrpt_score_mean" : 38443.2895784466,
        "calledClasses_ckjm_ext_cbo_quadmean" : 5.0990195135927845,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "uncalledClasses_ckjm_ext_ca_max" : 4.0,
        "uncalledClasses_ckjm_ext_rfc_quadmean" : 7.767453465154029,
        "uncalledClasses_ckjm_ext_moa_quadmean" : 0.7071067811865476,
        "uncalledClasses_ckjm_ext_noc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.6666666666666667,
        "uncalledClasses_ckjm_ext_lcom3_N" : 6.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 2.6457513110645907,
        "uncalledClasses_ckjm_ext_mfa_mean" : 0.6645833333333333,
        "sf_complexity_nf" : 26.0,
        "sf_line_leanness" : 0.391025641025641,
        "uncalledClasses_ckjm_ext_ca_quadmean" : 2.1213203435596424,
        "uncalledClasses_ckjm_ext_moa_N" : 6.0,
        "calledUncalledMethodRatio" : 0.2727272727272727,
        "calledClasses_ckjm_ext_cbo_N" : 3.0,
        "sf_instruction_missed" : 578.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 1.1547005383792515,
        "uncalledClasses_ckjm_ext_noc_mean" : 0.3333333333333333,
        "calledClasses_ckjm_ext_loc_mean" : 388.6666666666667,
        "calledClasses_ckjm_ext_wmc_mean" : 6.333333333333333,
        "sf_method_error_size" : 0.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "hashCodeCloneCountLocal" : 1.0,
        "uncalledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_mfa_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.75,
        "uncalledClasses_ckjm_ext_npm_max" : 4.0,
        "calledClasses_ckjm_ext_lcom3_sum" : 1.7333333333333334,
        "uncalledClasses_ckjm_ext_lcom_geomean" : 0.0,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.5523246114192637,
        "calledClasses_ckjm_ext_npm_mean" : 4.0,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "sf_line_nf" : 61.0,
        "uncalledClasses_ckjm_ext_wmc_N" : 6.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_moa_min" : 0.0,
        "sf_instruction_sf" : 578.0,
        "uncalledClasses_ckjm_ext_ce_min" : 0.0,
        "uncalledClasses_ckjm_ext_dam_min" : 0.0,
        "sf_method_covered" : 8.0,
        "calledClasses_ckjm_ext_loc_N" : 3.0,
        "uncalledClasses_ckjm_ext_rfc_mean" : 6.666666666666667,
        "calledClasses_ckjm_ext_cbo_geomean" : 4.121285299808556,
        "uncalledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_mean" : 3.3333333333333335,
        "sf_complexity_leanness" : 0.38235294117647056,
        "calledClasses_ckjm_ext_cbo_max" : 7.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_noc_mean" : 0.6666666666666666,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "uncalledClasses_ckjm_ext_loc_mean" : 90.66666666666667,
        "calledClasses_ckjm_ext_dit_geomean" : 1.2599210498948732,
        "sf_method_necf" : 32.0,
        "calledClasses_ckjm_ext_cbm_max" : 2.0,
        "uncalledClasses_ckjm_ext_cbo_max" : 4.0,
        "uncalledClasses_ckjm_ext_dit_estimated_N" : 6.0,
        "sf_complexity_total" : 68.0,
        "noCalledMethods" : 9.0,
        "calledClasses_ckjm_ext_dam_mean" : 0.5,
        "sf_complexity_balance" : 1.6153846153846154,
        "uncalledClasses_ckjm_ext_dam_quadmean" : 0.7359800721939872,
        "uncalledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_wmc_sum" : 18.0,
        "calledClasses_ckjm_ext_npm_min" : 0.0,
        "uncalledClasses_ckjm_ext_lcom_mean" : 0.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.3498312710911136,
        "calledClasses_ckjm_ext_dit_mean" : 1.3333333333333333,
        "uncalledClasses_ckjm_ext_noc_N" : 6.0,
        "sf_method_leanness" : 0.25,
        "uncalledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_min" : 0.0,
        "calledClasses_ckjm_ext_wmc_max" : 13.0,
        "calledClasses_ckjm_ext_rfc_mean" : 15.0,
        "calledClasses_ckjm_ext_dit_max" : 2.0,
        "uncalledClasses_ckjm_ext_loc_max" : 424.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "uncalledClasses_ckjm_ext_ca_sum" : 11.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "uncalledClasses_ckjm_ext_cam_mean" : 0.66125,
        "uncalledClasses_ckjm_ext_cbm_min" : 0.0,
        "sf_method_missed" : 24.0,
        "sf_method_nf" : 8.0,
        "uncalledClasses_ckjm_ext_cam_min" : 0.4375,
        "uncalledClasses_ckjm_ext_amc_min" : 4.0,
        "uncalledClasses_ckjm_ext_amc_geomean" : 10.439797207734387,
        "calledClasses_ckjm_ext_npm_geomean" : 0.0,
        "calledClasses_ckjm_ext_amc_min" : 7.0,
        "calledClasses_ckjm_ext_wmc_sum" : 19.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 17.97220075561143,
        "uncalledClasses_ckjm_ext_npm_mean" : 1.5,
        "calledClasses_ckjm_ext_loc_quadmean" : 532.1346947280672,
        "uncalledClasses_ckjm_ext_ca_geomean" : 1.5874010519681994,
        "calledClasses_ckjm_ext_ca_mean" : 2.3333333333333335,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "uncalledClasses_ckjm_ext_cam_N" : 6.0,
        "entryClass_ckjm_ext_npm" : 10.0,
        "uncalledClasses_ckjm_ext_ca_safe" : 1.0,
        "uncalledClasses_ckjm_ext_rfc_sum" : 40.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 3.0,
        "calledClasses_ckjm_ext_rfc_min" : 4.0,
        "uncalledClasses_ckjm_ext_noc_min" : 0.0,
        "calledClasses_ckjm_ext_ce_min" : 1.0,
        "projectDeps" : 2.0,
        "uncalledClasses_ckjm_ext_npm_N" : 6.0,
        "jmh_thrpt_score_0" : 38443.2895784466,
        "uncalledClasses_ckjm_ext_lcom3_max" : 2.0,
        "uncalledClasses_ckjm_ext_wmc_geomean" : 2.615320972023661,
        "entryClass_ckjm_ext_wmc" : 13.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 20.0,
        "SINGLE_SMOOP_po" : 10.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.apache.ws.commons.util.Base64",
      "uri" : "org.apache.ws.commons.util:ws-commons-util:1.0.2"
    }, {
      "id" : "f4cb9abe-0e07-4c62-9756-e055051792eb",
      "groupId" : "ro.kuberam.libs.java",
      "artifactId" : "crypto",
      "version" : "1.2.1",
      "name" : "Base64",
      "packagename" : "ro.kuberam.libs.java.crypto.utils",
      "score" : 6.270091,
      "hash" : "9012e0c694d95203d251442787ea84f1",
      "content" : "package ro.kuberam.libs.java.crypto.utils;\n\nimport java.util.Arrays;\n\n/** A very fast and memory efficient class to encode and decode to and from BASE64 in full accordance\n * with RFC 2045.<br><br>\n * On Windows XP sp1 with 1.4.2_04 and later ;), this encoder and decoder is about 10 times faster\n * on small arrays (10 - 1000 bytes) and 2-3 times as fast on larger arrays (10000 - 1000000 bytes)\n * compared to <code>sun.misc.Encoder()/Decoder()</code>.<br><br>\n *\n * On byte arrays the encoder is about 20% faster than Jakarta Commons Base64 Codec for encode and\n * about 50% faster for decoding large arrays. This implementation is about twice as fast on very small\n * arrays (&lt 30 bytes). If source/destination is a <code>String</code> this\n * version is about three times as fast due to the fact that the Commons Codec result has to be recoded\n * to a <code>String</code> from <code>byte[]</code>, which is very expensive.<br><br>\n *\n * This encode/decode algorithm doesn't create any temporary arrays as many other codecs do, it only\n * allocates the resulting array. This produces less garbage and it is possible to handle arrays twice\n * as large as algorithms that create a temporary array. (E.g. Jakarta Commons Codec). It is unknown\n * whether Sun's <code>sun.misc.Encoder()/Decoder()</code> produce temporary arrays but since performance\n * is quite low it probably does.<br><br>\n *\n * The encoder produces the same output as the Sun one except that the Sun's encoder appends\n * a trailing line separator if the last character isn't a pad. Unclear why but it only adds to the\n * length and is probably a side effect. Both are in conformance with RFC 2045 though.<br>\n * Commons codec seem to always att a trailing line separator.<br><br>\n *\n * <b>Note!</b>\n * The encode/decode method pairs (types) come in three versions with the <b>exact</b> same algorithm and\n * thus a lot of code redundancy. This is to not create any temporary arrays for transcoding to/from different\n * format types. The methods not used can simply be commented out.<br><br>\n *\n * There is also a \"fast\" version of all decode methods that works the same way as the normal ones, but\n * har a few demands on the decoded input. Normally though, these fast verions should be used if the source if\n * the input is known and it hasn't bee tampered with.<br><br>\n *\n * If you find the code useful or you find a bug, please send me a note at base64 @ miginfocom . com.\n *\n * Licence (BSD):\n * ==============\n *\n * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (base64 @ miginfocom . com)\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright notice, this list\n * of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this\n * list of conditions and the following disclaimer in the documentation and/or other\n * materials provided with the distribution.\n * Neither the name of the MiG InfoCom AB nor the names of its contributors may be\n * used to endorse or promote products derived from this software without specific\n * prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\n * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * @version 2.2\n * @author Mikael Grev\n *         Date: 2004-aug-02\n *         Time: 11:31:11\n */\n\npublic class Base64\n{\n\tprivate static final char[] CA = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".toCharArray();\n\tprivate static final int[] IA = new int[256];\n\tstatic {\n\t\tArrays.fill(IA, -1);\n\t\tfor (int i = 0, iS = CA.length; i < iS; i++)\n\t\t\tIA[CA[i]] = i;\n\t\tIA['='] = 0;\n\t}\n\n\t// ****************************************************************************************\n\t// *  char[] version\n\t// ****************************************************************************************\n\n\t/** Encodes a raw byte array into a BASE64 <code>char[]</code> representation i accordance with RFC 2045.\n\t * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n\t * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n\t * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n\t * little faster.\n\t * @return A BASE64 encoded array. Never <code>null</code>.\n\t */\n\tpublic final static char[] encodeToChar(byte[] sArr, boolean lineSep)\n\t{\n\t\t// Check special case\n\t\tint sLen = sArr != null ? sArr.length : 0;\n\t\tif (sLen == 0)\n\t\t\treturn new char[0];\n\n\t\tint eLen = (sLen / 3) * 3;              // Length of even 24-bits.\n\t\tint cCnt = ((sLen - 1) / 3 + 1) << 2;   // Returned character count\n\t\tint dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array\n\t\tchar[] dArr = new char[dLen];\n\n\t\t// Encode even 24-bits\n\t\tfor (int s = 0, d = 0, cc = 0; s < eLen;) {\n\t\t\t// Copy next three bytes into lower 24 bits of int, paying attension to sign.\n\t\t\tint i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff);\n\n\t\t\t// Encode the int into four chars\n\t\t\tdArr[d++] = CA[(i >>> 18) & 0x3f];\n\t\t\tdArr[d++] = CA[(i >>> 12) & 0x3f];\n\t\t\tdArr[d++] = CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[d++] = CA[i & 0x3f];\n\n\t\t\t// Add optional line separator\n\t\t\tif (lineSep && ++cc == 19 && d < dLen - 2) {\n\t\t\t\tdArr[d++] = '\\r';\n\t\t\t\tdArr[d++] = '\\n';\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\t// Pad and encode last bits if source isn't even 24 bits.\n\t\tint left = sLen - eLen; // 0 - 2.\n\t\tif (left > 0) {\n\t\t\t// Prepare the int\n\t\t\tint i = ((sArr[eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0);\n\n\t\t\t// Set last four chars\n\t\t\tdArr[dLen - 4] = CA[i >> 12];\n\t\t\tdArr[dLen - 3] = CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[dLen - 2] = left == 2 ? CA[i & 0x3f] : '=';\n\t\t\tdArr[dLen - 1] = '=';\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t/** Decodes a BASE64 encoded char array. All illegal characters will be ignored and can handle both arrays with\n\t * and without line separators.\n\t * @param sArr The source array. <code>null</code> or length 0 will return an empty array.\n\t * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n\t * (including '=') isn't divideable by 4.  (I.e. definitely corrupted).\n\t */\n\tpublic final static byte[] decode(char[] sArr)\n\t{\n\t\t// Check special case\n\t\tint sLen = sArr != null ? sArr.length : 0;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\t// Count illegal characters (including '\\r', '\\n') to know what size the returned array will be,\n\t\t// so we don't have to reallocate & copy it later.\n\t\tint sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)\n\t\tfor (int i = 0; i < sLen; i++)  // If input is \"pure\" (I.e. no line separators or illegal chars) base64 this loop can be commented out.\n\t\t\tif (IA[sArr[i]] < 0)\n\t\t\t\tsepCnt++;\n\n\t\t// Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.\n\t\tif ((sLen - sepCnt) % 4 != 0)\n\t\t\treturn null;\n\n\t\tint pad = 0;\n\t\tfor (int i = sLen; i > 1 && IA[sArr[--i]] <= 0;)\n\t\t\tif (sArr[i] == '=')\n\t\t\t\tpad++;\n\n\t\tint len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\tfor (int s = 0, d = 0; d < len;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; j < 4; j++) {   // j only increased if a valid char was found.\n\t\t\t\tint c = IA[sArr[s++]];\n\t\t\t\tif (c >= 0)\n\t\t\t\t    i |= c << (18 - j * 6);\n\t\t\t\telse\n\t\t\t\t\tj--;\n\t\t\t}\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tif (d < len) {\n\t\t\t\tdArr[d++]= (byte) (i >> 8);\n\t\t\t\tif (d < len)\n\t\t\t\t\tdArr[d++] = (byte) i;\n\t\t\t}\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t/** Decodes a BASE64 encoded char array that is known to be resonably well formatted. The method is about twice as\n\t * fast as {@link #decode(char[])}. The preconditions are:<br>\n\t * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n\t * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n\t * + The array must not contain illegal characters within the encoded string<br>\n\t * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n\t * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0.\n\t */\n\tpublic final static byte[] decodeFast(char[] sArr)\n\t{\n\t\t// Check special case\n\t\tint sLen = sArr.length;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint sIx = 0, eIx = sLen - 1;    // Start and end index after trimming.\n\n\t\t// Trim illegal chars from start\n\t\twhile (sIx < eIx && IA[sArr[sIx]] < 0)\n\t\t\tsIx++;\n\n\t\t// Trim illegal chars from end\n\t\twhile (eIx > 0 && IA[sArr[eIx]] < 0)\n\t\t\teIx--;\n\n\t\t// get the padding count (=) (0, 1 or 2)\n\t\tint pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0;  // Count '=' at end.\n\t\tint cCnt = eIx - sIx + 1;   // Content count including possible separators\n\t\tint sepCnt = sLen > 76 ? (sArr[76] == '\\r' ? cCnt / 78 : 0) << 1 : 0;\n\n\t\tint len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\t// Decode all but the last 0 - 2 bytes.\n\t\tint d = 0;\n\t\tfor (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12 | IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]];\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\tdArr[d++] = (byte) i;\n\n\t\t\t// If line separator, jump over it.\n\t\t\tif (sepCnt > 0 && ++cc == 19) {\n\t\t\t\tsIx += 2;\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (d < len) {\n\t\t\t// Decode last 1-3 bytes (incl '=') into 1-3 bytes\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; sIx <= eIx - pad; j++)\n\t\t\t\ti |= IA[sArr[sIx++]] << (18 - j * 6);\n\n\t\t\tfor (int r = 16; d < len; r -= 8)\n\t\t\t\tdArr[d++] = (byte) (i >> r);\n\t\t}\n\n\t\treturn dArr;\n\t}\n\n\t// ****************************************************************************************\n\t// *  byte[] version\n\t// ****************************************************************************************\n\n\t/** Encodes a raw byte array into a BASE64 <code>byte[]</code> representation i accordance with RFC 2045.\n\t * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n\t * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n\t * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n\t * little faster.\n\t * @return A BASE64 encoded array. Never <code>null</code>.\n\t */\n\tpublic final static byte[] encodeToByte(byte[] sArr, boolean lineSep)\n\t{\n\t\t// Check special case\n\t\tint sLen = sArr != null ? sArr.length : 0;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint eLen = (sLen / 3) * 3;                              // Length of even 24-bits.\n\t\tint cCnt = ((sLen - 1) / 3 + 1) << 2;                   // Returned character count\n\t\tint dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array\n\t\tbyte[] dArr = new byte[dLen];\n\n\t\t// Encode even 24-bits\n\t\tfor (int s = 0, d = 0, cc = 0; s < eLen;) {\n\t\t\t// Copy next three bytes into lower 24 bits of int, paying attension to sign.\n\t\t\tint i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff);\n\n\t\t\t// Encode the int into four chars\n\t\t\tdArr[d++] = (byte) CA[(i >>> 18) & 0x3f];\n\t\t\tdArr[d++] = (byte) CA[(i >>> 12) & 0x3f];\n\t\t\tdArr[d++] = (byte) CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[d++] = (byte) CA[i & 0x3f];\n\n\t\t\t// Add optional line separator\n\t\t\tif (lineSep && ++cc == 19 && d < dLen - 2) {\n\t\t\t\tdArr[d++] = '\\r';\n\t\t\t\tdArr[d++] = '\\n';\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\t// Pad and encode last bits if source isn't an even 24 bits.\n\t\tint left = sLen - eLen; // 0 - 2.\n\t\tif (left > 0) {\n\t\t\t// Prepare the int\n\t\t\tint i = ((sArr[eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0);\n\n\t\t\t// Set last four chars\n\t\t\tdArr[dLen - 4] = (byte) CA[i >> 12];\n\t\t\tdArr[dLen - 3] = (byte) CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[dLen - 2] = left == 2 ? (byte) CA[i & 0x3f] : (byte) '=';\n\t\t\tdArr[dLen - 1] = '=';\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t/** Decodes a BASE64 encoded byte array. All illegal characters will be ignored and can handle both arrays with\n\t * and without line separators.\n\t * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n\t * (including '=') isn't divideable by 4. (I.e. definitely corrupted).\n\t */\n\tpublic final static byte[] decode(byte[] sArr)\n\t{\n\t\t// Check special case\n\t\tint sLen = sArr.length;\n\n\t\t// Count illegal characters (including '\\r', '\\n') to know what size the returned array will be,\n\t\t// so we don't have to reallocate & copy it later.\n\t\tint sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)\n\t\tfor (int i = 0; i < sLen; i++)      // If input is \"pure\" (I.e. no line separators or illegal chars) base64 this loop can be commented out.\n\t\t\tif (IA[sArr[i] & 0xff] < 0)\n\t\t\t\tsepCnt++;\n\n\t\t// Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.\n\t\tif ((sLen - sepCnt) % 4 != 0)\n\t\t\treturn null;\n\n\t\tint pad = 0;\n\t\tfor (int i = sLen; i > 1 && IA[sArr[--i] & 0xff] <= 0;)\n\t\t\tif (sArr[i] == '=')\n\t\t\t\tpad++;\n\n\t\tint len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\tfor (int s = 0, d = 0; d < len;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; j < 4; j++) {   // j only increased if a valid char was found.\n\t\t\t\tint c = IA[sArr[s++] & 0xff];\n\t\t\t\tif (c >= 0)\n\t\t\t\t    i |= c << (18 - j * 6);\n\t\t\t\telse\n\t\t\t\t\tj--;\n\t\t\t}\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tif (d < len) {\n\t\t\t\tdArr[d++]= (byte) (i >> 8);\n\t\t\t\tif (d < len)\n\t\t\t\t\tdArr[d++] = (byte) i;\n\t\t\t}\n\t\t}\n\n\t\treturn dArr;\n\t}\n\n\n\t/** Decodes a BASE64 encoded byte array that is known to be resonably well formatted. The method is about twice as\n\t * fast as {@link #decode(byte[])}. The preconditions are:<br>\n\t * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n\t * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n\t * + The array must not contain illegal characters within the encoded string<br>\n\t * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n\t * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0.\n\t */\n\tpublic final static byte[] decodeFast(byte[] sArr)\n\t{\n\t\t// Check special case\n\t\tint sLen = sArr.length;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint sIx = 0, eIx = sLen - 1;    // Start and end index after trimming.\n\n\t\t// Trim illegal chars from start\n\t\twhile (sIx < eIx && IA[sArr[sIx] & 0xff] < 0)\n\t\t\tsIx++;\n\n\t\t// Trim illegal chars from end\n\t\twhile (eIx > 0 && IA[sArr[eIx] & 0xff] < 0)\n\t\t\teIx--;\n\n\t\t// get the padding count (=) (0, 1 or 2)\n\t\tint pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0;  // Count '=' at end.\n\t\tint cCnt = eIx - sIx + 1;   // Content count including possible separators\n\t\tint sepCnt = sLen > 76 ? (sArr[76] == '\\r' ? cCnt / 78 : 0) << 1 : 0;\n\n\t\tint len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\t// Decode all but the last 0 - 2 bytes.\n\t\tint d = 0;\n\t\tfor (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12 | IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]];\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\tdArr[d++] = (byte) i;\n\n\t\t\t// If line separator, jump over it.\n\t\t\tif (sepCnt > 0 && ++cc == 19) {\n\t\t\t\tsIx += 2;\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (d < len) {\n\t\t\t// Decode last 1-3 bytes (incl '=') into 1-3 bytes\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; sIx <= eIx - pad; j++)\n\t\t\t\ti |= IA[sArr[sIx++]] << (18 - j * 6);\n\n\t\t\tfor (int r = 16; d < len; r -= 8)\n\t\t\t\tdArr[d++] = (byte) (i >> r);\n\t\t}\n\n\t\treturn dArr;\n\t}\n\n\t// ****************************************************************************************\n\t// * String version\n\t// ****************************************************************************************\n\n\t/** Encodes a raw byte array into a BASE64 <code>String</code> representation i accordance with RFC 2045.\n\t * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n\t * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n\t * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n\t * little faster.\n\t * @return A BASE64 encoded array. Never <code>null</code>.\n\t */\n\tpublic final static String encodeToString(byte[] sArr, boolean lineSep)\n\t{\n\t\t// Reuse char[] since we can't create a String incrementally anyway and StringBuffer/Builder would be slower.\n\t\treturn new String(encodeToChar(sArr, lineSep));\n\t}\n\n\t/** Decodes a BASE64 encoded <code>String</code>. All illegal characters will be ignored and can handle both strings with\n\t * and without line separators.<br>\n\t * <b>Note!</b> It can be up to about 2x the speed to call <code>decode(str.toCharArray())</code> instead. That\n\t * will create a temporary array though. This version will use <code>str.charAt(i)</code> to iterate the string.\n\t * @param str The source string. <code>null</code> or length 0 will return an empty array.\n\t * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n\t * (including '=') isn't divideable by 4.  (I.e. definitely corrupted).\n\t */\n\tpublic final static byte[] decode(String str)\n\t{\n\t\t// Check special case\n\t\tint sLen = str != null ? str.length() : 0;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\t// Count illegal characters (including '\\r', '\\n') to know what size the returned array will be,\n\t\t// so we don't have to reallocate & copy it later.\n\t\tint sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)\n\t\tfor (int i = 0; i < sLen; i++)  // If input is \"pure\" (I.e. no line separators or illegal chars) base64 this loop can be commented out.\n\t\t\tif (IA[str.charAt(i)] < 0)\n\t\t\t\tsepCnt++;\n\n\t\t// Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.\n\t\tif ((sLen - sepCnt) % 4 != 0)\n\t\t\treturn null;\n\n\t\t// Count '=' at end\n\t\tint pad = 0;\n\t\tfor (int i = sLen; i > 1 && IA[str.charAt(--i)] <= 0;)\n\t\t\tif (str.charAt(i) == '=')\n\t\t\t\tpad++;\n\n\t\tint len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\tfor (int s = 0, d = 0; d < len;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; j < 4; j++) {   // j only increased if a valid char was found.\n\t\t\t\tint c = IA[str.charAt(s++)];\n\t\t\t\tif (c >= 0)\n\t\t\t\t    i |= c << (18 - j * 6);\n\t\t\t\telse\n\t\t\t\t\tj--;\n\t\t\t}\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tif (d < len) {\n\t\t\t\tdArr[d++]= (byte) (i >> 8);\n\t\t\t\tif (d < len)\n\t\t\t\t\tdArr[d++] = (byte) i;\n\t\t\t}\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t/** Decodes a BASE64 encoded string that is known to be resonably well formatted. The method is about twice as\n\t * fast as {@link #decode(String)}. The preconditions are:<br>\n\t * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n\t * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n\t * + The array must not contain illegal characters within the encoded string<br>\n\t * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n\t * @param s The source string. Length 0 will return an empty array. <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0.\n\t */\n\tpublic final static byte[] decodeFast(String s)\n\t{\n\t\t// Check special case\n\t\tint sLen = s.length();\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint sIx = 0, eIx = sLen - 1;    // Start and end index after trimming.\n\n\t\t// Trim illegal chars from start\n\t\twhile (sIx < eIx && IA[s.charAt(sIx) & 0xff] < 0)\n\t\t\tsIx++;\n\n\t\t// Trim illegal chars from end\n\t\twhile (eIx > 0 && IA[s.charAt(eIx) & 0xff] < 0)\n\t\t\teIx--;\n\n\t\t// get the padding count (=) (0, 1 or 2)\n\t\tint pad = s.charAt(eIx) == '=' ? (s.charAt(eIx - 1) == '=' ? 2 : 1) : 0;  // Count '=' at end.\n\t\tint cCnt = eIx - sIx + 1;   // Content count including possible separators\n\t\tint sepCnt = sLen > 76 ? (s.charAt(76) == '\\r' ? cCnt / 78 : 0) << 1 : 0;\n\n\t\tint len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\t// Decode all but the last 0 - 2 bytes.\n\t\tint d = 0;\n\t\tfor (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = IA[s.charAt(sIx++)] << 18 | IA[s.charAt(sIx++)] << 12 | IA[s.charAt(sIx++)] << 6 | IA[s.charAt(sIx++)];\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\tdArr[d++] = (byte) i;\n\n\t\t\t// If line separator, jump over it.\n\t\t\tif (sepCnt > 0 && ++cc == 19) {\n\t\t\t\tsIx += 2;\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (d < len) {\n\t\t\t// Decode last 1-3 bytes (incl '=') into 1-3 bytes\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; sIx <= eIx - pad; j++)\n\t\t\t\ti |= IA[s.charAt(sIx++)] << (18 - j * 6);\n\n\t\t\tfor (int r = 16; d < len; r -= 8)\n\t\t\t\tdArr[d++] = (byte) (i >> r);\n\t\t}\n\n\t\treturn dArr;\n\t}\n}",
      "methods" : {
        "Base64" : [ {
          "name" : "encodeToChar",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToChar(byte[], boolean):char[]",
          "lineStart" : 95,
          "lineEnd" : 139,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 147,
          "lineEnd" : 193,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(char[]):byte[]",
          "lineStart" : 204,
          "lineEnd" : 258,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encodeToByte",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToByte(byte[], boolean):byte[]",
          "lineStart" : 271,
          "lineEnd" : 315,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[]):byte[]",
          "lineStart" : 323,
          "lineEnd" : 369,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(byte[]):byte[]",
          "lineStart" : 381,
          "lineEnd" : 435,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encodeToString",
          "returnParam" : "String",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToString(byte[], boolean):String",
          "lineStart" : 448,
          "lineEnd" : 452,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):byte[]",
          "lineStart" : 462,
          "lineEnd" : 509,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(String):byte[]",
          "lineStart" : 520,
          "lineEnd" : 574,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "decodeFast",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decodeFast(char[]):byte[]",
        "lineStart" : 204,
        "lineEnd" : 258,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      } ],
      "failedMethods" : [ {
        "name" : null,
        "returnParam" : null,
        "params" : null,
        "visibility" : null,
        "descriptor" : "encode(byte[]):char[]",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : false
      } ],
      "artifactInfo" : {
        "name" : "Library for EXPath Cryptographic Module",
        "description" : null,
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "6534a7ee-db49-4fe0-9611-8e8f2be6d0bb" ],
        "mavenDependencyResolved" : [ [ "org.slf4j:log4j-over-slf4j:1.5.8", "org.slf4j:slf4j-api:1.5.8" ] ],
        "_version_" : [ 1521885033504178176 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "commons-io:commons-io:1.3.2" ] ],
        "method" : [ [ "true|||", "false|public static final byte[] ro.kuberam.libs.java.crypto.utils.Base64.decodeFast(char[])|ro.kuberam.libs.java.crypto.utils.Base64.decodeFast([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public ro.kuberam.libs.java.crypto.utils.Base64()|ro.kuberam.libs.java.crypto.utils.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.26,
        "sf_complexity_necf" : 112.0,
        "calledClasses_ckjm_ext_ca_max" : 2.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.55,
        "jmh_thrpt_score_sum" : 39634.37335331816,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 0.5,
        "sf_complexity_covered" : 17.0,
        "sf_line_balance" : 6.387096774193548,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 140.8181818181818,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 17.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 7.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 11.000000000000002,
        "entryClass_ckjm_ext_loc" : 1562.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 39634.37335331814,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 31.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 140.81818181818178,
        "calledClasses_ckjm_ext_cbo_mean" : 2.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 11.0,
        "calledClasses_ckjm_ext_rfc_sum" : 17.0,
        "sf_instruction_necf" : 1519.0,
        "calledClasses_ckjm_ext_npm_sum" : 10.0,
        "calledClasses_ckjm_ext_loc_geomean" : 1562.0000000000005,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 7.0,
        "calledClasses_ckjm_ext_loc_min" : 1562.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 1519.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 17.0,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 4.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 229.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 8.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 11.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.26,
        "sf_line_leanmetric" : 31.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.26,
        "calledClasses_ckjm_ext_lcom_sum" : 7.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 6.999999999999999,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 95.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 2.0,
        "calledClasses_ckjm_ext_loc_sum" : 1562.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.26,
        "calledClasses_ckjm_ext_lcom3_max" : 0.55,
        "entryClass_ckjm_ext_amc" : 140.8181818181818,
        "sf_method_sf" : 8.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 140.8181818181818,
        "calledClasses_ckjm_ext_npm_max" : 10.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 2.0,
        "calledClasses_ckjm_ext_ca_sum" : 2.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 5.967889908256881,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.26,
        "jmh_thrpt_score_quadmean" : 39634.37335331816,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 17.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 7.0,
        "sf_line_total" : 229.0,
        "entryClass_ckjm_ext_lcom" : 7.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 218.0,
        "sf_line_sf" : 198.0,
        "hashCodeCloneCountGlobal" : 1.0,
        "luceneScore" : 6.2700910568237305,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 10.0,
        "sf_instruction_covered" : 218.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 17.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.55,
        "entryClass_ckjm_ext_lcom3" : 0.55,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 2.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 2.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 95.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 1562.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 218.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 10.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 2.0,
        "calledClasses_ckjm_ext_amc_max" : 140.8181818181818,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 2.0,
        "calledClasses_ckjm_ext_lcom_min" : 7.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 2.0,
        "fs_unique" : 0.5,
        "calledClasses_ckjm_ext_amc_quadmean" : 140.8181818181818,
        "jmh_thrpt_score_mean" : 39634.37335331816,
        "sf_line_missed" : 198.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 2.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 17.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 2.0,
        "sf_line_leanness" : 0.13537117903930132,
        "calledUncalledMethodRatio" : 0.2727272727272727,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 1301.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 1562.0,
        "calledClasses_ckjm_ext_wmc_mean" : 11.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 1.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.26,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.55,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.26,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 10.0,
        "sf_line_nf" : 31.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 1301.0,
        "sf_method_covered" : 2.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 2.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.55,
        "sf_complexity_leanness" : 0.15178571428571427,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 2.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 10.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 112.0,
        "noCalledMethods" : 3.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 5.588235294117647,
        "calledClasses_ckjm_ext_npm_min" : 10.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.14351547070441079,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.2,
        "calledClasses_ckjm_ext_lcom3_min" : 0.55,
        "calledClasses_ckjm_ext_wmc_max" : 11.0,
        "calledClasses_ckjm_ext_rfc_mean" : 17.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 8.0,
        "sf_method_nf" : 2.0,
        "calledClasses_ckjm_ext_npm_geomean" : 10.000000000000002,
        "calledClasses_ckjm_ext_amc_min" : 140.8181818181818,
        "calledClasses_ckjm_ext_wmc_sum" : 11.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 17.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 1562.0,
        "calledClasses_ckjm_ext_ca_mean" : 2.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 10.0,
        "projectDepsResolved" : 2.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 17.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 1.0,
        "jmh_thrpt_score_0" : 39634.37335331816,
        "entryClass_ckjm_ext_wmc" : 11.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 29.0,
        "SINGLE_SMOOP_po" : 15.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "ro.kuberam.libs.java.crypto.utils.Base64",
      "uri" : "ro.kuberam.libs.java:crypto:1.2.1"
    }, {
      "id" : "636c817b-9fbc-48b1-9a86-087e1e5bcf3f",
      "groupId" : "com.wizzardo.tools",
      "artifactId" : "tools-security",
      "version" : "0.13",
      "name" : "Base64",
      "packagename" : "com.wizzardo.tools.security",
      "score" : 6.31395,
      "hash" : "f6774e8ddc2dc79fe479a8e9fd25fde7",
      "content" : "package com.wizzardo.tools.security;\n\nimport java.util.Arrays;\n\npublic class Base64 {\n\n    private static final char[] CA = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".toCharArray();\n    private static final char[] CA_URL_SAFE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\".toCharArray();\n    private static final int[] IA = new int[256];\n    private static final int[] IA_URL_SAFE = new int[256];\n\n    static {\n        Arrays.fill(IA, -1);\n        for (int i = 0, iS = CA.length; i < iS; i++) {\n            IA[CA[i]] = i;\n        }\n        IA['='] = 0;\n        Arrays.fill(IA_URL_SAFE, -1);\n        for (int i = 0, iS = CA_URL_SAFE.length; i < iS; i++) {\n            IA_URL_SAFE[CA_URL_SAFE[i]] = i;\n        }\n        IA_URL_SAFE['='] = 0;\n    }\n\n    /** Encodes a raw byte array into a BASE64 <code>char[]</code> representation i accordance with RFC 2045.\n     * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n     * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n     * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n     * little faster.\n     * @return A BASE64 encoded array. Never <code>null</code>.\n     */\n    public final static char[] encodeToChar(byte[] sArr, boolean lineSep) {\n        return encodeToChar(sArr, lineSep, false);\n    }\n\n    /** Encodes a raw byte array into a BASE64 <code>char[]</code> representation i accordance with RFC 2045.\n     * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n     * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n     * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n     * little faster.\n     * @return A BASE64 encoded array. Never <code>null</code>.\n     */\n    public final static char[] encodeToChar(byte[] sArr, boolean lineSep, boolean urlSafe) {\n        // Check special case\n        int sLen = sArr != null ? sArr.length : 0;\n        if (sLen == 0) {\n            return new char[0];\n        }\n\n        int eLen = (sLen / 3) * 3;              // Length of even 24-bits.\n        int cCnt = ((sLen - 1) / 3 + 1) << 2;   // Returned character count\n        int dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array\n        char[] dArr = new char[dLen];\n\n        // Encode even 24-bits\n        for (int s = 0, d = 0, cc = 0; s < eLen;) {\n            // Copy next three bytes into lower 24 bits of int, paying attension to sign.\n            int i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff);\n\n            // Encode the int into four chars\n            if (!urlSafe) {\n                dArr[d++] = CA[(i >>> 18) & 0x3f];\n                dArr[d++] = CA[(i >>> 12) & 0x3f];\n                dArr[d++] = CA[(i >>> 6) & 0x3f];\n                dArr[d++] = CA[i & 0x3f];\n            } else {\n                dArr[d++] = CA_URL_SAFE[(i >>> 18) & 0x3f];\n                dArr[d++] = CA_URL_SAFE[(i >>> 12) & 0x3f];\n                dArr[d++] = CA_URL_SAFE[(i >>> 6) & 0x3f];\n                dArr[d++] = CA_URL_SAFE[i & 0x3f];\n            }\n            // Add optional line separator\n            if (lineSep && ++cc == 19 && d < dLen - 2) {\n                dArr[d++] = '\\r';\n                dArr[d++] = '\\n';\n                cc = 0;\n            }\n        }\n\n        // Pad and encode last bits if source isn't even 24 bits.\n        int left = sLen - eLen; // 0 - 2.\n        if (left > 0) {\n            // Prepare the int\n            int i = ((sArr[eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0);\n\n            // Set last four chars\n            if (!urlSafe) {\n                dArr[dLen - 4] = CA[i >> 12];\n                dArr[dLen - 3] = CA[(i >>> 6) & 0x3f];\n                dArr[dLen - 2] = left == 2 ? CA[i & 0x3f] : '=';\n                dArr[dLen - 1] = '=';\n            } else {\n                dArr[dLen - 4] = CA_URL_SAFE[i >> 12];\n                dArr[dLen - 3] = CA_URL_SAFE[(i >>> 6) & 0x3f];\n                dArr[dLen - 2] = left == 2 ? CA_URL_SAFE[i & 0x3f] : '=';\n                dArr[dLen - 1] = '=';\n            }\n        }\n        return dArr;\n    }\n\n    /** Decodes a BASE64 encoded char array. All illegal characters will be ignored and can handle both arrays with\n     * and without line separators.\n     * @param sArr The source array. <code>null</code> or length 0 will return an empty array.\n     * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n     * (including '=') isn't divideable by 4.  (I.e. definitely corrupted).\n     */\n    public final static byte[] decode(char[] sArr) {\n        return decode(sArr, false);\n    }\n\n    /** Decodes a BASE64 encoded char array. All illegal characters will be ignored and can handle both arrays with\n     * and without line separators.\n     * @param sArr The source array. <code>null</code> or length 0 will return an empty array.\n     * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n     * (including '=') isn't divideable by 4.  (I.e. definitely corrupted).\n     */\n    public final static byte[] decode(char[] sArr, boolean urlSafe) {\n        // Check special case\n        int sLen = sArr != null ? sArr.length : 0;\n        if (sLen == 0) {\n            return new byte[0];\n        }\n\n        // Count illegal characters (including '\\r', '\\n') to know what size the returned array will be,\n        // so we don't have to reallocate & copy it later.\n        int sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)\n        for (int i = 0; i < sLen; i++) // If input is \"pure\" (I.e. no line separators or illegal chars) base64 this loop can be commented out.\n        {\n            if (!urlSafe) {\n                if (IA[sArr[i]] < 0) {\n                    sepCnt++;\n                }\n            } else {\n                if (IA_URL_SAFE[sArr[i]] < 0) {\n                    sepCnt++;\n                }\n            }\n        }\n\n        // Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.\n        if ((sLen - sepCnt) % 4 != 0) {\n            return null;\n        }\n\n        int pad = 0;\n        if (!urlSafe) {\n            for (int i = sLen; i > 1 && IA[sArr[--i]] <= 0;) {\n                if (sArr[i] == '=') {\n                    pad++;\n                }\n            }\n        } else {\n            for (int i = sLen; i > 1 && IA_URL_SAFE[sArr[--i]] <= 0;) {\n                if (sArr[i] == '=') {\n                    pad++;\n                }\n            }\n        }\n\n        int len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n        byte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n        for (int s = 0, d = 0; d < len;) {\n            // Assemble three bytes into an int from four \"valid\" characters.\n            int i = 0;\n            for (int j = 0; j < 4; j++) {   // j only increased if a valid char was found.\n                int c;\n                if (!urlSafe) {\n                    c = IA[sArr[s++]];\n                } else {\n                    c = IA_URL_SAFE[sArr[s++]];\n                }\n                if (c >= 0) {\n                    i |= c << (18 - j * 6);\n                } else {\n                    j--;\n                }\n            }\n            // Add the bytes\n            dArr[d++] = (byte) (i >> 16);\n            if (d < len) {\n                dArr[d++] = (byte) (i >> 8);\n                if (d < len) {\n                    dArr[d++] = (byte) i;\n                }\n            }\n        }\n        return dArr;\n    }\n\n    /** Decodes a BASE64 encoded char array that is known to be resonably well formatted. The method is about twice as\n     * fast as {@link #decode(char[])}. The preconditions are:<br>\n     * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n     * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n     * + The array must not contain illegal characters within the encoded string<br>\n     * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n     * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n     * @return The decoded array of bytes. May be of length 0.\n     */\n    public final static byte[] decodeFast(char[] sArr) {\n        return decodeFast(sArr, false);\n    }\n\n    /** Decodes a BASE64 encoded char array that is known to be resonably well formatted. The method is about twice as\n     * fast as {@link #decode(char[])}. The preconditions are:<br>\n     * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n     * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n     * + The array must not contain illegal characters within the encoded string<br>\n     * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n     * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n     * @return The decoded array of bytes. May be of length 0.\n     */\n    public final static byte[] decodeFast(char[] sArr, boolean urlSafe) {\n        // Check special case\n        int sLen = sArr.length;\n        if (sLen == 0) {\n            return new byte[0];\n        }\n\n        int sIx = 0, eIx = sLen - 1;    // Start and end index after trimming.\n\n        // Trim illegal chars from start\n        if (!urlSafe) {\n            while (sIx < eIx && IA[sArr[sIx]] < 0) {\n                sIx++;\n            }\n        } else {\n            while (sIx < eIx && IA_URL_SAFE[sArr[sIx]] < 0) {\n                sIx++;\n            }\n        }\n\n        // Trim illegal chars from end\n        if (!urlSafe) {\n            while (eIx > 0 && IA[sArr[eIx]] < 0) {\n                eIx--;\n            }\n        } else {\n            while (eIx > 0 && IA_URL_SAFE[sArr[eIx]] < 0) {\n                eIx--;\n            }\n        }\n\n        // get the padding count (=) (0, 1 or 2)\n        int pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0;  // Count '=' at end.\n        int cCnt = eIx - sIx + 1;   // Content count including possible separators\n        int sepCnt = sLen > 76 ? (sArr[76] == '\\r' ? cCnt / 78 : 0) << 1 : 0;\n\n        int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes\n        byte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n        // Decode all but the last 0 - 2 bytes.\n        int d = 0;\n        for (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n            // Assemble three bytes into an int from four \"valid\" characters.\n            int i;\n            if (!urlSafe) {\n                i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12 | IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]];\n            } else {\n                i = IA_URL_SAFE[sArr[sIx++]] << 18 | IA_URL_SAFE[sArr[sIx++]] << 12 | IA_URL_SAFE[sArr[sIx++]] << 6 | IA_URL_SAFE[sArr[sIx++]];\n            }\n\n            // Add the bytes\n            dArr[d++] = (byte) (i >> 16);\n            dArr[d++] = (byte) (i >> 8);\n            dArr[d++] = (byte) i;\n\n            // If line separator, jump over it.\n            if (sepCnt > 0 && ++cc == 19) {\n                sIx += 2;\n                cc = 0;\n            }\n        }\n\n        if (d < len) {\n            // Decode last 1-3 bytes (incl '=') into 1-3 bytes\n            int i = 0;\n            for (int j = 0; sIx <= eIx - pad; j++) {\n                if (!urlSafe) {\n                    i |= IA[sArr[sIx++]] << (18 - j * 6);\n                } else {\n                    i |= IA_URL_SAFE[sArr[sIx++]] << (18 - j * 6);\n                }\n            }\n\n            for (int r = 16; d < len; r -= 8) {\n                dArr[d++] = (byte) (i >> r);\n            }\n        }\n\n        return dArr;\n    }\n\n    // ****************************************************************************************\n    // *  byte[] version\n    // ****************************************************************************************\n    /** Encodes a raw byte array into a BASE64 <code>byte[]</code> representation i accordance with RFC 2045.\n     * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n     * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n     * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n     * little faster.\n     * @return A BASE64 encoded array. Never <code>null</code>.\n     */\n    public final static byte[] encodeToByte(byte[] sArr, boolean lineSep) {\n        return encodeToByte(sArr, lineSep, false);\n    }\n    // ****************************************************************************************\n    // *  byte[] version\n    // ****************************************************************************************\n\n    /** Encodes a raw byte array into a BASE64 <code>byte[]</code> representation i accordance with RFC 2045.\n     * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n     * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n     * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n     * little faster.\n     * @return A BASE64 encoded array. Never <code>null</code>.\n     */\n    public final static byte[] encodeToByte(byte[] sArr, boolean lineSep, boolean urlSafe) {\n        // Check special case\n        int sLen = sArr != null ? sArr.length : 0;\n        if (sLen == 0) {\n            return new byte[0];\n        }\n\n        int eLen = (sLen / 3) * 3;                              // Length of even 24-bits.\n        int cCnt = ((sLen - 1) / 3 + 1) << 2;                   // Returned character count\n        int dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array\n        byte[] dArr = new byte[dLen];\n\n        // Encode even 24-bits\n        for (int s = 0, d = 0, cc = 0; s < eLen;) {\n            // Copy next three bytes into lower 24 bits of int, paying attension to sign.\n            int i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff);\n\n            // Encode the int into four chars\n            if (!urlSafe) {\n                dArr[d++] = (byte) CA[(i >>> 18) & 0x3f];\n                dArr[d++] = (byte) CA[(i >>> 12) & 0x3f];\n                dArr[d++] = (byte) CA[(i >>> 6) & 0x3f];\n                dArr[d++] = (byte) CA[i & 0x3f];\n            } else {\n                dArr[d++] = (byte) CA_URL_SAFE[(i >>> 18) & 0x3f];\n                dArr[d++] = (byte) CA_URL_SAFE[(i >>> 12) & 0x3f];\n                dArr[d++] = (byte) CA_URL_SAFE[(i >>> 6) & 0x3f];\n                dArr[d++] = (byte) CA_URL_SAFE[i & 0x3f];\n            }\n\n            // Add optional line separator\n            if (lineSep && ++cc == 19 && d < dLen - 2) {\n                dArr[d++] = '\\r';\n                dArr[d++] = '\\n';\n                cc = 0;\n            }\n        }\n\n        // Pad and encode last bits if source isn't an even 24 bits.\n        int left = sLen - eLen; // 0 - 2.\n        if (left > 0) {\n            // Prepare the int\n            int i = ((sArr[eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0);\n\n            // Set last four chars\n            if (!urlSafe) {\n                dArr[dLen - 4] = (byte) CA[i >> 12];\n                dArr[dLen - 3] = (byte) CA[(i >>> 6) & 0x3f];\n                dArr[dLen - 2] = left == 2 ? (byte) CA[i & 0x3f] : (byte) '=';\n                dArr[dLen - 1] = '=';\n            } else {\n                dArr[dLen - 4] = (byte) CA_URL_SAFE[i >> 12];\n                dArr[dLen - 3] = (byte) CA_URL_SAFE[(i >>> 6) & 0x3f];\n                dArr[dLen - 2] = left == 2 ? (byte) CA_URL_SAFE[i & 0x3f] : (byte) '=';\n                dArr[dLen - 1] = '=';\n            }\n        }\n        return dArr;\n    }\n\n    /** Decodes a BASE64 encoded byte array. All illegal characters will be ignored and can handle both arrays with\n     * and without line separators.\n     * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n     * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n     * (including '=') isn't divideable by 4. (I.e. definitely corrupted).\n     */\n    public final static byte[] decode(byte[] sArr) {\n        return decode(sArr, false);\n    }\n\n    /** Decodes a BASE64 encoded byte array. All illegal characters will be ignored and can handle both arrays with\n     * and without line separators.\n     * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n     * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n     * (including '=') isn't divideable by 4. (I.e. definitely corrupted).\n     */\n    public final static byte[] decode(byte[] sArr, boolean urlSafe) {\n        // Check special case\n        int sLen = sArr.length;\n\n        // Count illegal characters (including '\\r', '\\n') to know what size the returned array will be,\n        // so we don't have to reallocate & copy it later.\n        int sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)\n        for (int i = 0; i < sLen; i++) // If input is \"pure\" (I.e. no line separators or illegal chars) base64 this loop can be commented out.\n        {\n            if (!urlSafe) {\n                if (IA[sArr[i] & 0xff] < 0) {\n                    sepCnt++;\n                }\n            } else {\n                if (IA_URL_SAFE[sArr[i] & 0xff] < 0) {\n                    sepCnt++;\n                }\n            }\n        }\n\n        // Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.\n        if ((sLen - sepCnt) % 4 != 0) {\n            return null;\n        }\n\n        int pad = 0;\n        if (!urlSafe) {\n            for (int i = sLen; i > 1 && IA[sArr[--i] & 0xff] <= 0;) {\n                if (sArr[i] == '=') {\n                    pad++;\n                }\n            }\n        } else {\n            for (int i = sLen; i > 1 && IA_URL_SAFE[sArr[--i] & 0xff] <= 0;) {\n                if (sArr[i] == '=') {\n                    pad++;\n                }\n            }\n        }\n\n        int len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n        byte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n        for (int s = 0, d = 0; d < len;) {\n            // Assemble three bytes into an int from four \"valid\" characters.\n            int i = 0;\n            for (int j = 0; j < 4; j++) {   // j only increased if a valid char was found.\n                int c;\n                if (!urlSafe) {\n                    c = IA[sArr[s++] & 0xff];\n                } else {\n                    c = IA_URL_SAFE[sArr[s++] & 0xff];\n                }\n                if (c >= 0) {\n                    i |= c << (18 - j * 6);\n                } else {\n                    j--;\n                }\n            }\n\n            // Add the bytes\n            dArr[d++] = (byte) (i >> 16);\n            if (d < len) {\n                dArr[d++] = (byte) (i >> 8);\n                if (d < len) {\n                    dArr[d++] = (byte) i;\n                }\n            }\n        }\n\n        return dArr;\n    }\n\n    /** Decodes a BASE64 encoded byte array that is known to be resonably well formatted. The method is about twice as\n     * fast as {@link #decode(byte[])}. The preconditions are:<br>\n     * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n     * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n     * + The array must not contain illegal characters within the encoded string<br>\n     * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n     * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n     * @return The decoded array of bytes. May be of length 0.\n     */\n    public final static byte[] decodeFast(byte[] sArr) {\n        return decodeFast(sArr, false);\n    }\n\n    /** Decodes a BASE64 encoded byte array that is known to be resonably well formatted. The method is about twice as\n     * fast as {@link #decode(byte[])}. The preconditions are:<br>\n     * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n     * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n     * + The array must not contain illegal characters within the encoded string<br>\n     * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n     * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n     * @return The decoded array of bytes. May be of length 0.\n     */\n    public final static byte[] decodeFast(byte[] sArr, boolean urlSafe) {\n        // Check special case\n        int sLen = sArr.length;\n        if (sLen == 0) {\n            return new byte[0];\n        }\n\n        int sIx = 0, eIx = sLen - 1;    // Start and end index after trimming.\n\n        // Trim illegal chars from start\n        if (!urlSafe) {\n            while (sIx < eIx && IA[sArr[sIx] & 0xff] < 0) {\n                sIx++;\n            }\n        } else {\n            while (sIx < eIx && IA_URL_SAFE[sArr[sIx] & 0xff] < 0) {\n                sIx++;\n            }\n        }\n\n        // Trim illegal chars from end\n        if (!urlSafe) {\n            while (eIx > 0 && IA[sArr[eIx] & 0xff] < 0) {\n                eIx--;\n            }\n        } else {\n            while (eIx > 0 && IA_URL_SAFE[sArr[eIx] & 0xff] < 0) {\n                eIx--;\n            }\n        }\n\n        // get the padding count (=) (0, 1 or 2)\n        int pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0;  // Count '=' at end.\n        int cCnt = eIx - sIx + 1;   // Content count including possible separators\n        int sepCnt = sLen > 76 ? (sArr[76] == '\\r' ? cCnt / 78 : 0) << 1 : 0;\n\n        int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes\n        byte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n        // Decode all but the last 0 - 2 bytes.\n        int d = 0;\n        for (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n            // Assemble three bytes into an int from four \"valid\" characters.\n            int i;\n            if (!urlSafe) {\n                i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12 | IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]];\n            } else {\n                i = IA_URL_SAFE[sArr[sIx++]] << 18 | IA_URL_SAFE[sArr[sIx++]] << 12 | IA_URL_SAFE[sArr[sIx++]] << 6 | IA_URL_SAFE[sArr[sIx++]];\n            }\n\n            // Add the bytes\n            dArr[d++] = (byte) (i >> 16);\n            dArr[d++] = (byte) (i >> 8);\n            dArr[d++] = (byte) i;\n\n            // If line separator, jump over it.\n            if (sepCnt > 0 && ++cc == 19) {\n                sIx += 2;\n                cc = 0;\n            }\n        }\n\n        if (d < len) {\n            // Decode last 1-3 bytes (incl '=') into 1-3 bytes\n            int i = 0;\n            for (int j = 0; sIx <= eIx - pad; j++) {\n                if (!urlSafe) {\n                    i |= IA[sArr[sIx++]] << (18 - j * 6);\n                } else {\n                    i |= IA_URL_SAFE[sArr[sIx++]] << (18 - j * 6);\n                }\n            }\n\n            for (int r = 16; d < len; r -= 8) {\n                dArr[d++] = (byte) (i >> r);\n            }\n        }\n\n        return dArr;\n    }\n\n    // ****************************************************************************************\n    // * String version\n    // ****************************************************************************************\n\n    /** Encodes a raw byte array into a BASE64 <code>String</code> representation i accordance with RFC 2045.\n     * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n     * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n     * little faster.\n     * @return A BASE64 encoded array. Never <code>null</code>.\n     */\n    public final static String encodeToString(byte[] sArr) {\n        return encodeToString(sArr, false, false);\n    }\n\n    /** Encodes a raw byte array into a BASE64 <code>String</code> representation i accordance with RFC 2045.\n     * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n     * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n     * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n     * little faster.\n     * @return A BASE64 encoded array. Never <code>null</code>.\n     */\n    public final static String encodeToString(byte[] sArr, boolean lineSep) {\n        return encodeToString(sArr, lineSep, false);\n    }\n    // ****************************************************************************************\n    // * String version\n    // ****************************************************************************************\n\n    /** Encodes a raw byte array into a BASE64 <code>String</code> representation i accordance with RFC 2045.\n     * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n     * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n     * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n     * little faster.\n     * @return A BASE64 encoded array. Never <code>null</code>.\n     */\n    public final static String encodeToString(byte[] sArr, boolean lineSep, boolean urlSafe) {\n        // Reuse char[] since we can't create a String incrementally anyway and StringBuffer/Builder would be slower.\n        return new String(encodeToChar(sArr, lineSep, urlSafe));\n    }\n\n    /** Decodes a BASE64 encoded <code>String</code>. All illegal characters will be ignored and can handle both strings with\n     * and without line separators.<br>\n     * <b>Note!</b> It can be up to about 2x the speed to call <code>decode(str.toCharArray())</code> instead. That\n     * will create a temporary array though. This version will use <code>str.charAt(i)</code> to iterate the string.\n     * @param str The source string. <code>null</code> or length 0 will return an empty array.\n     * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n     * (including '=') isn't divideable by 4.  (I.e. definitely corrupted).\n     */\n    public final static byte[] decode(String str) {\n        return decode(str, false);\n    }\n\n    /** Decodes a BASE64 encoded <code>String</code>. All illegal characters will be ignored and can handle both strings with\n     * and without line separators.<br>\n     * <b>Note!</b> It can be up to about 2x the speed to call <code>decode(str.toCharArray())</code> instead. That\n     * will create a temporary array though. This version will use <code>str.charAt(i)</code> to iterate the string.\n     * @param str The source string. <code>null</code> or length 0 will return an empty array.\n     * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n     * (including '=') isn't divideable by 4.  (I.e. definitely corrupted).\n     */\n    public final static byte[] decode(String str, boolean urlSafe) {\n        // Check special case\n        int sLen = str != null ? str.length() : 0;\n        if (sLen == 0) {\n            return new byte[0];\n        }\n\n        // Count illegal characters (including '\\r', '\\n') to know what size the returned array will be,\n        // so we don't have to reallocate & copy it later.\n        int sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)\n        for (int i = 0; i < sLen; i++) // If input is \"pure\" (I.e. no line separators or illegal chars) base64 this loop can be commented out.\n        {\n            if (!urlSafe) {\n                if (IA[str.charAt(i)] < 0) {\n                    sepCnt++;\n                }\n            } else {\n                if (IA_URL_SAFE[str.charAt(i)] < 0) {\n                    sepCnt++;\n                }\n            }\n        }\n\n        // Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.\n        if ((sLen - sepCnt) % 4 != 0) {\n            return null;\n        }\n\n        // Count '=' at end\n        int pad = 0;\n        if (!urlSafe) {\n            for (int i = sLen; i > 1 && IA[str.charAt(--i)] <= 0;) {\n                if (str.charAt(i) == '=') {\n                    pad++;\n                }\n            }\n        } else {\n            for (int i = sLen; i > 1 && IA_URL_SAFE[str.charAt(--i)] <= 0;) {\n                if (str.charAt(i) == '=') {\n                    pad++;\n                }\n            }\n        }\n\n        int len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n        byte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n        for (int s = 0, d = 0; d < len;) {\n            // Assemble three bytes into an int from four \"valid\" characters.\n            int i = 0;\n            for (int j = 0; j < 4; j++) {   // j only increased if a valid char was found.\n                int c;\n                if (!urlSafe) {\n                    c = IA[str.charAt(s++)];\n                } else {\n                    c = IA_URL_SAFE[str.charAt(s++)];\n                }\n                if (c >= 0) {\n                    i |= c << (18 - j * 6);\n                } else {\n                    j--;\n                }\n            }\n            // Add the bytes\n            dArr[d++] = (byte) (i >> 16);\n            if (d < len) {\n                dArr[d++] = (byte) (i >> 8);\n                if (d < len) {\n                    dArr[d++] = (byte) i;\n                }\n            }\n        }\n        return dArr;\n    }\n\n    /** Decodes a BASE64 encoded string that is known to be resonably well formatted. The method is about twice as\n     * fast as {@link #decode(String)}. The preconditions are:<br>\n     * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n     * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n     * + The array must not contain illegal characters within the encoded string<br>\n     * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n     * @param s The source string. Length 0 will return an empty array. <code>null</code> will throw an exception.\n     * @return The decoded array of bytes. May be of length 0.\n     */\n    public final static byte[] decodeFast(String s) {\n        return decodeFast(s, false);\n    }\n\n    /** Decodes a BASE64 encoded string that is known to be resonably well formatted. The method is about twice as\n     * fast as {@link #decode(String)}. The preconditions are:<br>\n     * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n     * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n     * + The array must not contain illegal characters within the encoded string<br>\n     * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n     * @param s The source string. Length 0 will return an empty array. <code>null</code> will throw an exception.\n     * @return The decoded array of bytes. May be of length 0.\n     */\n    public final static byte[] decodeFast(String s, boolean urlSafe) {\n        // Check special case\n        int sLen = s.length();\n        if (sLen == 0) {\n            return new byte[0];\n        }\n\n        int sIx = 0, eIx = sLen - 1;    // Start and end index after trimming.\n\n        // Trim illegal chars from start\n        if (!urlSafe) {\n            while (sIx < eIx && IA[s.charAt(sIx) & 0xff] < 0) {\n                sIx++;\n            }\n        } else {\n            while (sIx < eIx && IA_URL_SAFE[s.charAt(sIx) & 0xff] < 0) {\n                sIx++;\n            }\n        }\n\n        // Trim illegal chars from end\n        if (!urlSafe) {\n            while (eIx > 0 && IA[s.charAt(eIx) & 0xff] < 0) {\n                eIx--;\n            }\n        } else {\n            while (eIx > 0 && IA_URL_SAFE[s.charAt(eIx) & 0xff] < 0) {\n                eIx--;\n            }\n        }\n\n        // get the padding count (=) (0, 1 or 2)\n        int pad = s.charAt(eIx) == '=' ? (s.charAt(eIx - 1) == '=' ? 2 : 1) : 0;  // Count '=' at end.\n        int cCnt = eIx - sIx + 1;   // Content count including possible separators\n        int sepCnt = sLen > 76 ? (s.charAt(76) == '\\r' ? cCnt / 78 : 0) << 1 : 0;\n\n        int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes\n        byte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n        // Decode all but the last 0 - 2 bytes.\n        int d = 0;\n        for (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n            // Assemble three bytes into an int from four \"valid\" characters.\n            int i;\n            if (!urlSafe) {\n                i = IA[s.charAt(sIx++)] << 18 | IA[s.charAt(sIx++)] << 12 | IA[s.charAt(sIx++)] << 6 | IA[s.charAt(sIx++)];\n            } else {\n                i = IA_URL_SAFE[s.charAt(sIx++)] << 18 | IA_URL_SAFE[s.charAt(sIx++)] << 12 | IA_URL_SAFE[s.charAt(sIx++)] << 6 | IA_URL_SAFE[s.charAt(sIx++)];\n            }\n\n            // Add the bytes\n            dArr[d++] = (byte) (i >> 16);\n            dArr[d++] = (byte) (i >> 8);\n            dArr[d++] = (byte) i;\n\n            // If line separator, jump over it.\n            if (sepCnt > 0 && ++cc == 19) {\n                sIx += 2;\n                cc = 0;\n            }\n        }\n\n        if (d < len) {\n            // Decode last 1-3 bytes (incl '=') into 1-3 bytes\n            int i = 0;\n            for (int j = 0; sIx <= eIx - pad; j++) {\n                if (!urlSafe) {\n                    i |= IA[s.charAt(sIx++)] << (18 - j * 6);\n                } else {\n                    i |= IA_URL_SAFE[s.charAt(sIx++)] << (18 - j * 6);\n                }\n            }\n\n            for (int r = 16; d < len; r -= 8) {\n                dArr[d++] = (byte) (i >> r);\n            }\n        }\n\n        return dArr;\n    }\n}",
      "methods" : {
        "Base64" : [ {
          "name" : "encodeToChar",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToChar(byte[], boolean):char[]",
          "lineStart" : 32,
          "lineEnd" : 34,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encodeToChar",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "boolean", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToChar(byte[], boolean, boolean):char[]",
          "lineStart" : 43,
          "lineEnd" : 100,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 108,
          "lineEnd" : 110,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], boolean):byte[]",
          "lineStart" : 118,
          "lineEnd" : 191,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(char[]):byte[]",
          "lineStart" : 202,
          "lineEnd" : 204,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(char[], boolean):byte[]",
          "lineStart" : 215,
          "lineEnd" : 294,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encodeToByte",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToByte(byte[], boolean):byte[]",
          "lineStart" : 306,
          "lineEnd" : 308,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encodeToByte",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "boolean", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToByte(byte[], boolean, boolean):byte[]",
          "lineStart" : 320,
          "lineEnd" : 378,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[]):byte[]",
          "lineStart" : 386,
          "lineEnd" : 388,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[], boolean):byte[]",
          "lineStart" : 396,
          "lineEnd" : 468,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(byte[]):byte[]",
          "lineStart" : 479,
          "lineEnd" : 481,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(byte[], boolean):byte[]",
          "lineStart" : 492,
          "lineEnd" : 571,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encodeToString",
          "returnParam" : "String",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encodeToString(byte[]):String",
          "lineStart" : 583,
          "lineEnd" : 585,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encodeToString",
          "returnParam" : "String",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToString(byte[], boolean):String",
          "lineStart" : 594,
          "lineEnd" : 596,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encodeToString",
          "returnParam" : "String",
          "params" : [ "byte[]", "boolean", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToString(byte[], boolean, boolean):String",
          "lineStart" : 608,
          "lineEnd" : 611,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):byte[]",
          "lineStart" : 621,
          "lineEnd" : 623,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+decode(String, boolean):byte[]",
          "lineStart" : 633,
          "lineEnd" : 707,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(String):byte[]",
          "lineStart" : 718,
          "lineEnd" : 720,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "String", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(String, boolean):byte[]",
          "lineStart" : 731,
          "lineEnd" : 810,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "decodeFast",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decodeFast(char[]):byte[]",
        "lineStart" : 202,
        "lineEnd" : 204,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : [ {
        "name" : null,
        "returnParam" : null,
        "params" : null,
        "visibility" : null,
        "descriptor" : "encode(byte[]):char[]",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : false
      } ],
      "artifactInfo" : {
        "name" : "tools-security",
        "description" : "security tools",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "be4cd1b2-dd35-4dc6-8a7e-da188dc97aa6" ],
        "_version_" : [ 1521884837659541504 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "com.wizzardo.tools:tools-io:0.13", "com.wizzardo.tools:tools-exception:0.13" ] ],
        "method" : [ [ "true|||", "false|public static final byte[] com.wizzardo.tools.security.Base64.decodeFast(char[])|com.wizzardo.tools.security.Base64.decodeFast([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public com.wizzardo.tools.security.Base64()|com.wizzardo.tools.security.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.32,
        "sf_complexity_necf" : 173.0,
        "calledClasses_ckjm_ext_ca_max" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.575,
        "jmh_thrpt_score_sum" : 39346.91966939505,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 0.5,
        "sf_complexity_covered" : 26.0,
        "sf_line_balance" : 6.523809523809524,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 104.38095238095238,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 27.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 162.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 21.0,
        "entryClass_ckjm_ext_loc" : 2217.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 39346.91966939505,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 42.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 104.38095238095238,
        "calledClasses_ckjm_ext_cbo_mean" : 0.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 21.0,
        "calledClasses_ckjm_ext_rfc_sum" : 27.0,
        "sf_instruction_necf" : 2133.0,
        "calledClasses_ckjm_ext_npm_sum" : 20.0,
        "calledClasses_ckjm_ext_loc_geomean" : 2217.0,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 162.0,
        "calledClasses_ckjm_ext_loc_min" : 2217.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 2133.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 27.0,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 5.666666666666667,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 316.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 17.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 21.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.32,
        "sf_line_leanmetric" : 42.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.32,
        "calledClasses_ckjm_ext_lcom_sum" : 162.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 161.99999999999994,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 147.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 0.0,
        "calledClasses_ckjm_ext_loc_sum" : 2217.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.32,
        "calledClasses_ckjm_ext_lcom3_max" : 0.575,
        "entryClass_ckjm_ext_amc" : 104.38095238095238,
        "sf_method_sf" : 17.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 104.38095238095238,
        "calledClasses_ckjm_ext_npm_max" : 20.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 0.0,
        "calledClasses_ckjm_ext_ca_sum" : 0.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 6.062913907284768,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.32,
        "jmh_thrpt_score_quadmean" : 39346.91966939505,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 26.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 162.0,
        "sf_line_total" : 316.0,
        "entryClass_ckjm_ext_lcom" : 162.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 302.0,
        "sf_line_sf" : 274.0,
        "hashCodeCloneCountGlobal" : 5.0,
        "luceneScore" : 6.313950061798096,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 20.0,
        "sf_instruction_covered" : 302.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 27.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.575,
        "entryClass_ckjm_ext_lcom3" : 0.575,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 0.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 0.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 147.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 2217.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 302.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 20.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_max" : 104.38095238095238,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 0.0,
        "calledClasses_ckjm_ext_lcom_min" : 162.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 0.5,
        "calledClasses_ckjm_ext_amc_quadmean" : 104.38095238095238,
        "jmh_thrpt_score_mean" : 39346.91966939505,
        "sf_line_missed" : 274.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 0.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 26.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 0.0,
        "sf_line_leanness" : 0.13291139240506328,
        "calledUncalledMethodRatio" : 0.19047619047619047,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 1831.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 2217.0,
        "calledClasses_ckjm_ext_wmc_mean" : 21.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 2.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.32,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.575,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.32,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 20.0,
        "sf_line_nf" : 42.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 1831.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.575,
        "sf_complexity_leanness" : 0.15028901734104047,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 20.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 173.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 5.653846153846154,
        "calledClasses_ckjm_ext_npm_min" : 20.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.14158462259728083,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.15,
        "calledClasses_ckjm_ext_lcom3_min" : 0.575,
        "calledClasses_ckjm_ext_wmc_max" : 21.0,
        "calledClasses_ckjm_ext_rfc_mean" : 27.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 17.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 19.999999999999996,
        "calledClasses_ckjm_ext_amc_min" : 104.38095238095238,
        "calledClasses_ckjm_ext_wmc_sum" : 21.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 27.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 2217.0,
        "calledClasses_ckjm_ext_ca_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 20.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 27.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 2.0,
        "jmh_thrpt_score_0" : 39346.91966939505,
        "entryClass_ckjm_ext_wmc" : 21.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 28.0,
        "SINGLE_SMOOP_po" : 14.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.wizzardo.tools.security.Base64",
      "uri" : "com.wizzardo.tools:tools-security:0.13"
    }, {
      "id" : "ec25445a-5f9f-480c-907a-cfd2615d8c94",
      "groupId" : "com.github.nitram509",
      "artifactId" : "jmacaroons",
      "version" : "0.3.1",
      "name" : "Base64",
      "packagename" : "com.github.nitram509.jmacaroons.util",
      "score" : 6.4412675,
      "hash" : "18d38a2bd17004ae3802fc452e3090fa",
      "content" : "// Copyright (C) 2011 - Will Glozer.  All rights reserved.\n\npackage com.github.nitram509.jmacaroons.util;\n\nimport java.util.Arrays;\n\n/**\n * High-performance base64 codec based on the algorithm used in Mikael Grev's MiG Base64.\n * This implementation is designed to handle base64 without line splitting and with\n * optional padding. Alternative character tables may be supplied to the {@code encode}\n * and {@code decode} methods to implement modified base64 schemes.\n * <p/>\n * Decoding assumes correct input, the caller is responsible for ensuring that the input\n * contains no invalid characters.\n * <p/>\n * Switched the alphabet to make base64 URL and filename safe.\n * See <a href=\"https://tools.ietf.org/html/rfc4648#page-7\">RFC 4648</a> for details.\n *\n * @author Will Glozer\n * @author Martin W. Kirst\n */\npublic class Base64 {\n\n  private static final char[] alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\".toCharArray();\n  private static final int[] decode = new int[128];\n  private static final char pad = '=';\n\n  static {\n    Arrays.fill(decode, -1);\n    for (int i = 0; i < alphabet.length; i++) {\n      decode[alphabet[i]] = i;\n    }\n    decode[pad] = 0;\n    decode['+'] = 62; // backward compatible with regular base64\n    decode['/'] = 63; // backward compatible with regular base64\n  }\n\n  /**\n   * Decode base64 chars to bytes.\n   *\n   * @param chars Chars to encode.\n   * @return Decoded bytes.\n   */\n  public static byte[] decode(char[] chars) {\n    return decode(chars, decode, pad);\n  }\n\n  /**\n   * Decode base64 chars to bytes.\n   *\n   * @param str String to encode.\n   * @return Decoded bytes.\n   */\n  public static byte[] decode(String str) {\n    return decode(str.toCharArray(), decode, pad);\n  }\n\n  /**\n   * Encode bytes to base64 chars, with padding.\n   *\n   * @param bytes Bytes to encode.\n   * @return Encoded chars.\n   */\n  public static char[] encodeUrlSafe(byte[] bytes) {\n    return encodeUrlSafe(bytes, alphabet, pad);\n  }\n\n  /**\n   * Encode bytes to base64 chars, with optional padding.\n   *\n   * @param bytes  Bytes to encode.\n   * @param padded Add padding to output.\n   * @return Encoded chars.\n   */\n  public static char[] encodeUrlSafe(byte[] bytes, boolean padded) {\n    return encodeUrlSafe(bytes, alphabet, padded ? pad : 0);\n  }\n\n  /**\n   * Decode base64 chars to bytes using the supplied decode table and padding\n   * character.\n   *\n   * @param src   Base64 encoded data.\n   * @param table Decode table.\n   * @param pad   Padding character.\n   * @return Decoded bytes.\n   */\n  public static byte[] decode(char[] src, int[] table, char pad) {\n    int len = src.length;\n\n    if (len == 0) return new byte[0];\n\n    int padCount = (src[len - 1] == pad ? (src[len - 2] == pad ? 2 : 1) : 0);\n    int bytes = (len * 6 >> 3) - padCount;\n    int blocks = (bytes / 3) * 3;\n\n    byte[] dst = new byte[bytes];\n    int si = 0, di = 0;\n\n    while (di < blocks) {\n      int n = table[src[si++]] << 18 | table[src[si++]] << 12 | table[src[si++]] << 6 | table[src[si++]];\n      dst[di++] = (byte) (n >> 16);\n      dst[di++] = (byte) (n >> 8);\n      dst[di++] = (byte) n;\n    }\n\n    if (di < bytes) {\n      int n = 0;\n      switch (len - si) {\n        case 4:\n          n |= table[src[si + 3]];\n        case 3:\n          n |= table[src[si + 2]] << 6;\n        case 2:\n          n |= table[src[si + 1]] << 12;\n        case 1:\n          n |= table[src[si]] << 18;\n      }\n      for (int r = 16; di < bytes; r -= 8) {\n        dst[di++] = (byte) (n >> r);\n      }\n    }\n\n    return dst;\n  }\n\n  /**\n   * Encode bytes to base64 chars using the supplied encode table and with\n   * optional padding.\n   *\n   * @param src   Bytes to encode.\n   * @param table Encoding table.\n   * @param pad   Padding character, or 0 for no padding.\n   * @return Encoded chars.\n   */\n  public static char[] encodeUrlSafe(byte[] src, char[] table, char pad) {\n    int len = src.length;\n\n    if (len == 0) return new char[0];\n\n    int blocks = (len / 3) * 3;\n    int chars = ((len - 1) / 3 + 1) << 2;\n    int tail = len - blocks;\n    if (pad == 0 && tail > 0) chars -= 3 - tail;\n\n    char[] dst = new char[chars];\n    int si = 0, di = 0;\n\n    while (si < blocks) {\n      int n = (src[si++] & 0xff) << 16 | (src[si++] & 0xff) << 8 | (src[si++] & 0xff);\n      dst[di++] = table[(n >>> 18) & 0x3f];\n      dst[di++] = table[(n >>> 12) & 0x3f];\n      dst[di++] = table[(n >>> 6) & 0x3f];\n      dst[di++] = table[n & 0x3f];\n    }\n\n    if (tail > 0) {\n      int n = (src[si] & 0xff) << 10;\n      if (tail == 2) n |= (src[++si] & 0xff) << 2;\n\n      dst[di++] = table[(n >>> 12) & 0x3f];\n      dst[di++] = table[(n >>> 6) & 0x3f];\n      if (tail == 2) dst[di++] = table[n & 0x3f];\n\n      if (pad != 0) {\n        if (tail == 1) dst[di++] = pad;\n        dst[di] = pad;\n      }\n    }\n\n    return dst;\n  }\n\n  /**\n   * Encode to String without padding\n   * @param bytes bytes\n   * @return\n   */\n  public static String encodeUrlSafeToString(byte[] bytes) {\n    return new String(encodeUrlSafe(bytes, false));\n  }\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 44,
          "lineEnd" : 46,
          "columnStart" : 3,
          "columnEnd" : 3,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):byte[]",
          "lineStart" : 54,
          "lineEnd" : 56,
          "columnStart" : 3,
          "columnEnd" : 3,
          "initializer" : false
        }, {
          "name" : "encodeUrlSafe",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encodeUrlSafe(byte[]):char[]",
          "lineStart" : 64,
          "lineEnd" : 66,
          "columnStart" : 3,
          "columnEnd" : 3,
          "initializer" : false
        }, {
          "name" : "encodeUrlSafe",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeUrlSafe(byte[], boolean):char[]",
          "lineStart" : 75,
          "lineEnd" : 77,
          "columnStart" : 3,
          "columnEnd" : 3,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]", "int[]", "char" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[], int[], char):byte[]",
          "lineStart" : 88,
          "lineEnd" : 125,
          "columnStart" : 3,
          "columnEnd" : 3,
          "initializer" : false
        }, {
          "name" : "encodeUrlSafe",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "char[]", "char" ],
          "visibility" : "public",
          "descriptor" : "+encodeUrlSafe(byte[], char[], char):char[]",
          "lineStart" : 136,
          "lineEnd" : 172,
          "columnStart" : 3,
          "columnEnd" : 3,
          "initializer" : false
        }, {
          "name" : "encodeUrlSafeToString",
          "returnParam" : "String",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encodeUrlSafeToString(byte[]):String",
          "lineStart" : 179,
          "lineEnd" : 181,
          "columnStart" : 3,
          "columnEnd" : 3,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encodeUrlSafe",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encodeUrlSafe(byte[]):char[]",
        "lineStart" : 64,
        "lineEnd" : 66,
        "columnStart" : 3,
        "columnEnd" : 3,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 44,
        "lineEnd" : 46,
        "columnStart" : 3,
        "columnEnd" : 3,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "${project.groupId}:${project.artifactId}",
        "description" : "Pure Java implementation of Macaroons: Cookies with Contextual Caveats for Decentralized Authorization in the Cloud",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "e761f859-732d-43c9-9a3c-9393ee631c24" ],
        "_version_" : [ 1521884703956664320 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] com.github.nitram509.jmacaroons.util.Base64.encodeUrlSafe(byte[])|com.github.nitram509.jmacaroons.util.Base64.encodeUrlSafe([B)[C|[0]", "false|public static byte[] com.github.nitram509.jmacaroons.util.Base64.decode(char[])|com.github.nitram509.jmacaroons.util.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public com.github.nitram509.jmacaroons.util.Base64()|com.github.nitram509.jmacaroons.util.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.23214285714285715,
        "sf_complexity_necf" : 28.0,
        "calledClasses_ckjm_ext_ca_max" : 3.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.8333333333333333,
        "jmh_thrpt_score_sum" : 225308.7647691442,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 24.0,
        "sf_line_balance" : 0.058823529411764705,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 48.888888888888886,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 13.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 24.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 9.000000000000002,
        "entryClass_ckjm_ext_loc" : 452.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 225308.7647691444,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 51.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 48.888888888888886,
        "calledClasses_ckjm_ext_cbo_mean" : 3.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 9.0,
        "calledClasses_ckjm_ext_rfc_sum" : 13.0,
        "sf_instruction_necf" : 404.0,
        "calledClasses_ckjm_ext_npm_sum" : 8.0,
        "calledClasses_ckjm_ext_loc_geomean" : 452.00000000000017,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 24.0,
        "calledClasses_ckjm_ext_loc_min" : 452.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 404.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 13.0,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 0.6,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 54.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 3.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 9.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.23214285714285715,
        "sf_line_leanmetric" : 51.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.23214285714285715,
        "calledClasses_ckjm_ext_lcom_sum" : 24.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 24.000000000000004,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 4.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 3.0,
        "calledClasses_ckjm_ext_loc_sum" : 452.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.23214285714285715,
        "calledClasses_ckjm_ext_lcom3_max" : 0.8333333333333333,
        "entryClass_ckjm_ext_amc" : 48.888888888888886,
        "sf_method_sf" : 3.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 48.888888888888886,
        "calledClasses_ckjm_ext_npm_max" : 8.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 3.0,
        "calledClasses_ckjm_ext_ca_sum" : 3.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.05759162303664921,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.23214285714285715,
        "jmh_thrpt_score_quadmean" : 225308.7647691442,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 24.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 24.0,
        "sf_line_total" : 54.0,
        "entryClass_ckjm_ext_lcom" : 24.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 382.0,
        "sf_line_sf" : 3.0,
        "hashCodeCloneCountGlobal" : 2.0,
        "luceneScore" : 6.441267490386963,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 8.0,
        "sf_instruction_covered" : 382.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 13.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.8333333333333333,
        "entryClass_ckjm_ext_lcom3" : 0.8333333333333333,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 3.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 4.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 452.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 382.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 8.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 3.0,
        "calledClasses_ckjm_ext_amc_max" : 48.888888888888886,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 3.0,
        "calledClasses_ckjm_ext_lcom_min" : 24.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 5.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 48.888888888888886,
        "jmh_thrpt_score_mean" : 225308.7647691442,
        "sf_line_missed" : 3.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 3.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 24.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 3.0,
        "sf_line_leanness" : 0.9444444444444444,
        "calledUncalledMethodRatio" : 0.6666666666666666,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 22.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 452.0,
        "calledClasses_ckjm_ext_wmc_mean" : 9.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 2.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.23214285714285715,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.8333333333333333,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.23214285714285715,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 8.0,
        "sf_line_nf" : 51.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 22.0,
        "sf_method_covered" : 5.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.8333333333333333,
        "sf_complexity_leanness" : 0.8571428571428571,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 8.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 28.0,
        "noCalledMethods" : 6.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.16666666666666666,
        "calledClasses_ckjm_ext_npm_min" : 8.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.9455445544554455,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.625,
        "calledClasses_ckjm_ext_lcom3_min" : 0.8333333333333333,
        "calledClasses_ckjm_ext_wmc_max" : 9.0,
        "calledClasses_ckjm_ext_rfc_mean" : 13.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 3.0,
        "sf_method_nf" : 5.0,
        "calledClasses_ckjm_ext_npm_geomean" : 7.999999999999998,
        "calledClasses_ckjm_ext_amc_min" : 48.888888888888886,
        "calledClasses_ckjm_ext_wmc_sum" : 9.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 13.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 452.0,
        "calledClasses_ckjm_ext_ca_mean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 8.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 13.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 225308.7647691442,
        "entryClass_ckjm_ext_wmc" : 9.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 25.0,
        "SINGLE_SMOOP_po" : 12.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.github.nitram509.jmacaroons.util.Base64",
      "uri" : "com.github.nitram509:jmacaroons:0.3.1"
    }, {
      "id" : "4b00b6f1-a730-4cf5-9331-de0ef76184d9",
      "groupId" : "org.codehaus.jtstand",
      "artifactId" : "jtstand-common",
      "version" : "1.5.9",
      "name" : "Base64",
      "packagename" : "org.jfree.xml.util",
      "score" : 6.4814553,
      "hash" : "9d28ccc31333a61c994f25e5ad7aac38",
      "content" : "/*\n * Copyright (c) 2009 Albert Kurucz. \n *\n * This file, Base64.java is part of JTStand.\n *\n * JTStand is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * JTStand is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with GTStand.  If not, see <http://www.gnu.org/licenses/>.\n */\npackage org.jfree.xml.util;\n\nimport java.io.BufferedInputStream;\nimport java.io.BufferedOutputStream;\nimport java.io.BufferedReader;\nimport java.io.BufferedWriter;\nimport java.io.ByteArrayOutputStream;\nimport java.io.CharArrayWriter;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.FileReader;\nimport java.io.FileWriter;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.Reader;\nimport java.io.Writer;\n\n/**\n * Provides encoding of raw bytes to base64-encoded characters, and\n * decoding of base64 characters to raw bytes.\n * date: 06 August 1998\n * modified: 14 February 2000\n * modified: 22 September 2000\n *\n * @author Kevin Kelley (kelley@ruralnet.net)\n * @version 1.3\n */\npublic class Base64 {\n\n  private Base64 ()\n  {\n  }\n\n    /**\n     * returns an array of base64-encoded characters to represent the\n     * passed data array.\n     *\n     * @param data the array of bytes to encode\n     * @return base64-coded character array.\n     */\n    public static char[] encode(final byte[] data) {\n        final char[] out = new char[((data.length + 2) / 3) * 4];\n\n        //\n        // 3 bytes encode to 4 chars.  Output is always an even\n        // multiple of 4 characters.\n        //\n        for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {\n            boolean quad = false;\n            boolean trip = false;\n\n            int val = (0xFF & data[i]);\n            val <<= 8;\n            if ((i + 1) < data.length) {\n                val |= (0xFF & data[i + 1]);\n                trip = true;\n            }\n            val <<= 8;\n            if ((i + 2) < data.length) {\n                val |= (0xFF & data[i + 2]);\n                quad = true;\n            }\n            out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];\n            val >>= 6;\n            out[index + 1] = alphabet[val & 0x3F];\n            val >>= 6;\n            out[index + 0] = alphabet[val & 0x3F];\n        }\n        return out;\n    }\n\n    /**\n     * Decodes a BASE-64 encoded stream to recover the original\n     * data. White space before and after will be trimmed away,\n     * but no other manipulation of the input will be performed.\n     *\n     * As of version 1.2 this method will properly handle input\n     * containing junk characters (newlines and the like) rather\n     * than throwing an error. It does this by pre-parsing the\n     * input and generating from that a count of VALID input\n     * characters.\n     * \n     * @param data  the character data.\n     * \n     * @return The decoded data.\n     */\n    public static byte[] decode(final char[] data) {\n        // as our input could contain non-BASE64 data (newlines,\n        // whitespace of any sort, whatever) we must first adjust\n        // our count of USABLE data so that...\n        // (a) we don't misallocate the output array, and\n        // (b) think that we miscalculated our data length\n        //     just because of extraneous throw-away junk\n\n        int tempLen = data.length;\n        for (int ix = 0; ix < data.length; ix++) {\n            if ((data[ix] > 255) || codes[data[ix]] < 0) {\n                --tempLen; // ignore non-valid chars and padding\n            }\n        }\n        // calculate required length:\n        //  -- 3 bytes for every 4 valid base64 chars\n        //  -- plus 2 bytes if there are 3 extra base64 chars,\n        //     or plus 1 byte if there are 2 extra.\n\n        int len = (tempLen / 4) * 3;\n        if ((tempLen % 4) == 3) {\n            len += 2;\n        }\n        if ((tempLen % 4) == 2) {\n            len += 1;\n        }\n\n        final byte[] out = new byte[len];\n\n\n        int shift = 0; // # of excess bits stored in accum\n        int accum = 0; // excess bits\n        int index = 0;\n\n        // we now go through the entire array (NOT using the 'tempLen' value)\n        for (int ix = 0; ix < data.length; ix++) {\n            final int value = (data[ix] > 255) ? -1 : codes[data[ix]];\n\n            if (value >= 0) { // skip over non-code\n                accum <<= 6; // bits shift up by 6 each time thru\n                shift += 6; // loop, with new bits being put in\n                accum |= value; // at the bottom.\n                if (shift >= 8) { // whenever there are 8 or more shifted in,\n                    shift -= 8; // write them out (from the top, leaving any\n                    out[index++] = // excess at the bottom for next iteration.\n                        (byte) ((accum >> shift) & 0xff);\n                }\n            }\n            // we will also have skipped processing a padding null byte ('=') here;\n            // these are used ONLY for padding to an even length and do not legally\n            // occur as encoded data. for this reason we can ignore the fact that\n            // no index++ operation occurs in that special case: the out[] array is\n            // initialized to all-zero bytes to start with and that works to our\n            // advantage in this combination.\n        }\n\n        // if there is STILL something wrong we just have to throw up now!\n        if (index != out.length) {\n            throw new Error(\"Miscalculated data length (wrote \" \n                + index + \" instead of \" + out.length + \")\");\n        }\n\n        return out;\n    }\n\n\n    //\n    // code characters for values 0..63\n    //\n    private static char[] alphabet =\n        \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".toCharArray();\n\n    //\n    // lookup table for converting base64 characters to value in range 0..63\n    //\n    private static byte[] codes = new byte[256];\n\n    static {\n        for (int i = 0; i < 256; i++) {\n            codes[i] = -1;\n        }\n        for (int i = 'A'; i <= 'Z'; i++) {\n            codes[i] = (byte) (i - 'A');\n        }\n        for (int i = 'a'; i <= 'z'; i++) {\n            codes[i] = (byte) (26 + i - 'a');\n        }\n        for (int i = '0'; i <= '9'; i++) {\n            codes[i] = (byte) (52 + i - '0');\n        }\n        codes['+'] = 62;\n        codes['/'] = 63;\n    }\n\n\n\n\n    ///////////////////////////////////////////////////\n    // remainder (main method and helper functions) is\n    // for testing purposes only, feel free to clip it.\n    ///////////////////////////////////////////////////\n\n    /**\n     * Entry point.\n     * \n     * @param args  the command line arguments.\n     */\n    public static void main(final String[] args) {\n        boolean decode = false;\n\n        if (args.length == 0) {\n            System.out.println(\"usage:  java Base64 [-d[ecode]] filename\");\n            System.exit(0);\n        }\n        for (int i = 0; i < args.length; i++) {\n            if (\"-decode\".equalsIgnoreCase(args[i])) {\n                decode = true;\n            }\n            else if (\"-d\".equalsIgnoreCase(args[i])) {\n                decode = true;\n            }   \n        }\n\n        final String filename = args[args.length - 1];\n        final File file = new File(filename);\n        if (!file.exists()) {\n            System.out.println(\"Error:  file '\" + filename + \"' doesn't exist!\");\n            System.exit(0);\n        }\n\n        if (decode) {\n            final char[] encoded = readChars(file);\n            final byte[] decoded = decode(encoded);\n            writeBytes(file, decoded);\n        }\n        else {\n            final byte[] decoded = readBytes(file);\n            final char[] encoded = encode(decoded);\n            writeChars(file, encoded);\n        }\n    }\n\n    private static byte[] readBytes(final File file) {\n        final ByteArrayOutputStream baos = new ByteArrayOutputStream();\n        try {\n            final InputStream fis = new FileInputStream(file);\n            final InputStream is = new BufferedInputStream(fis);\n\n            int count;\n            final byte[] buf = new byte[16384];\n            while ((count = is.read(buf)) != -1) {\n                if (count > 0) {\n                    baos.write(buf, 0, count);\n                }   \n            }\n            is.close();\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        return baos.toByteArray();\n    }\n\n    private static char[] readChars(final File file) {\n        final CharArrayWriter caw = new CharArrayWriter();\n        try {\n            final Reader fr = new FileReader(file);\n            final Reader in = new BufferedReader(fr);\n            int count;\n            final char[] buf = new char[16384];\n            while ((count = in.read(buf)) != -1) {\n                if (count > 0) {\n                    caw.write(buf, 0, count);\n                }\n            }\n            in.close();\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        return caw.toCharArray();\n    }\n\n    private static void writeBytes(final File file, final byte[] data) {\n        try {\n            final OutputStream fos = new FileOutputStream(file);\n            final OutputStream os = new BufferedOutputStream(fos);\n            os.write(data);\n            os.close();\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    private static void writeChars(final File file, final char[] data) {\n        try {\n            final Writer fos = new FileWriter(file);\n            final Writer os = new BufferedWriter(fos);\n            os.write(data);\n            os.close();\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n    ///////////////////////////////////////////////////\n    // end of test code.\n    ///////////////////////////////////////////////////\n\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "Base64",
          "returnParam" : null,
          "params" : [ ],
          "visibility" : "private",
          "descriptor" : "-Base64()",
          "lineStart" : 49,
          "lineEnd" : 51,
          "columnStart" : 3,
          "columnEnd" : 3,
          "initializer" : true
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 60,
          "lineEnd" : 91,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 108,
          "lineEnd" : 171,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "main",
          "returnParam" : "void",
          "params" : [ "String[]" ],
          "visibility" : "public",
          "descriptor" : "+main(String[]):void",
          "lineStart" : 215,
          "lineEnd" : 248,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "readBytes",
          "returnParam" : "byte[]",
          "params" : [ "File" ],
          "visibility" : "private",
          "descriptor" : "-readBytes(File):byte[]",
          "lineStart" : 250,
          "lineEnd" : 270,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "readChars",
          "returnParam" : "char[]",
          "params" : [ "File" ],
          "visibility" : "private",
          "descriptor" : "-readChars(File):char[]",
          "lineStart" : 272,
          "lineEnd" : 291,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "writeBytes",
          "returnParam" : "void",
          "params" : [ "File", "byte[]" ],
          "visibility" : "private",
          "descriptor" : "-writeBytes(File, byte[]):void",
          "lineStart" : 293,
          "lineEnd" : 303,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "writeChars",
          "returnParam" : "void",
          "params" : [ "File", "char[]" ],
          "visibility" : "private",
          "descriptor" : "-writeChars(File, char[]):void",
          "lineStart" : 305,
          "lineEnd" : 315,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : [ ],
        "visibility" : "private",
        "descriptor" : "-Base64()",
        "lineStart" : 49,
        "lineEnd" : 51,
        "columnStart" : 3,
        "columnEnd" : 3,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 60,
        "lineEnd" : 91,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 108,
        "lineEnd" : 171,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "jtstand-common",
        "description" : "jtstand-common is a library derived from jcommon, used by jtstand-chart, which is derived from jfreechart",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "8265f703-bf8d-4622-ad54-4ba239db4b7d" ],
        "_version_" : [ 1521884749264584704 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "mavenDependency" : [ [ "org.jboss.logging:jboss-logging:3.1.3.GA" ] ],
        "method" : [ [ "false|public static char[] org.jfree.xml.util.Base64.encode(byte[])|org.jfree.xml.util.Base64.encode([B)[C|[0]", "false|public static byte[] org.jfree.xml.util.Base64.decode(char[])|org.jfree.xml.util.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|private org.jfree.xml.util.Base64()|org.jfree.xml.util.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.25,
        "sf_complexity_necf" : 33.0,
        "calledClasses_ckjm_ext_ca_max" : 1.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.75,
        "jmh_thrpt_score_sum" : 221547.85819825664,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 18.0,
        "sf_line_balance" : 1.3125,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 60.111111111111114,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 44.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 32.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 9.000000000000002,
        "entryClass_ckjm_ext_loc" : 552.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 221547.8581982568,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 48.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 60.1111111111111,
        "calledClasses_ckjm_ext_cbo_mean" : 1.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 9.0,
        "calledClasses_ckjm_ext_rfc_sum" : 44.0,
        "sf_instruction_necf" : 469.0,
        "calledClasses_ckjm_ext_npm_sum" : 3.0,
        "calledClasses_ckjm_ext_loc_geomean" : 551.9999999999998,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 32.0,
        "calledClasses_ckjm_ext_loc_min" : 552.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 469.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 43.99999999999999,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 1.6666666666666667,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 111.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 5.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 9.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.25,
        "sf_line_leanmetric" : 48.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.25,
        "calledClasses_ckjm_ext_lcom_sum" : 32.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 32.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 15.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 1.0,
        "calledClasses_ckjm_ext_loc_sum" : 552.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.25,
        "calledClasses_ckjm_ext_lcom3_max" : 0.75,
        "entryClass_ckjm_ext_amc" : 60.111111111111114,
        "sf_method_sf" : 5.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 60.111111111111114,
        "calledClasses_ckjm_ext_npm_max" : 3.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 1.0,
        "calledClasses_ckjm_ext_ca_sum" : 1.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.7969348659003831,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.25,
        "jmh_thrpt_score_quadmean" : 221547.85819825664,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 18.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 32.0,
        "sf_line_total" : 111.0,
        "entryClass_ckjm_ext_lcom" : 32.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 261.0,
        "sf_line_sf" : 63.0,
        "hashCodeCloneCountGlobal" : 5.0,
        "luceneScore" : 6.481455326080322,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 8.0,
        "sf_instruction_covered" : 261.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 44.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.75,
        "entryClass_ckjm_ext_lcom3" : 0.75,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 1.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 1.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 15.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 552.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 261.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 3.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 1.0,
        "calledClasses_ckjm_ext_amc_max" : 60.111111111111114,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 1.0,
        "calledClasses_ckjm_ext_lcom_min" : 32.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 60.111111111111114,
        "jmh_thrpt_score_mean" : 221547.85819825664,
        "sf_line_missed" : 63.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 18.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 1.0,
        "sf_line_leanness" : 0.43243243243243246,
        "calledUncalledMethodRatio" : 0.4444444444444444,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 208.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 552.0,
        "calledClasses_ckjm_ext_wmc_mean" : 9.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 5.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.25,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.75,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.25,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 3.0,
        "sf_line_nf" : 48.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 208.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.75,
        "sf_complexity_leanness" : 0.5454545454545454,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 8.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 33.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.8333333333333334,
        "calledClasses_ckjm_ext_npm_min" : 3.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.5565031982942431,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.375,
        "calledClasses_ckjm_ext_lcom3_min" : 0.75,
        "calledClasses_ckjm_ext_wmc_max" : 9.0,
        "calledClasses_ckjm_ext_rfc_mean" : 44.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 5.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 3.0000000000000004,
        "calledClasses_ckjm_ext_amc_min" : 60.111111111111114,
        "calledClasses_ckjm_ext_wmc_sum" : 9.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 44.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 552.0,
        "calledClasses_ckjm_ext_ca_mean" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 3.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 44.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 1.0,
        "jmh_thrpt_score_0" : 221547.85819825664,
        "entryClass_ckjm_ext_wmc" : 9.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 23.0,
        "SINGLE_SMOOP_po" : 11.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.jfree.xml.util.Base64",
      "uri" : "org.codehaus.jtstand:jtstand-common:1.5.9"
    }, {
      "id" : "cc3bc18e-489e-4243-9ef7-1939ecd35959",
      "groupId" : "com.brsanthu",
      "artifactId" : "migbase64",
      "version" : "2.2",
      "name" : "Base64",
      "packagename" : "com.migcomponents.migbase64",
      "score" : 6.3204794,
      "hash" : "46601583cf75da4eba3a19875c57db7e",
      "content" : "package com.migcomponents.migbase64;\n\nimport java.util.Arrays;\n\n/** A very fast and memory efficient class to encode and decode to and from BASE64 in full accordance\n * with RFC 2045.<br><br>\n * On Windows XP sp1 with 1.4.2_04 and later ;), this encoder and decoder is about 10 times faster\n * on small arrays (10 - 1000 bytes) and 2-3 times as fast on larger arrays (10000 - 1000000 bytes)\n * compared to <code>sun.misc.Encoder()/Decoder()</code>.<br><br>\n *\n * On byte arrays the encoder is about 20% faster than Jakarta Commons Base64 Codec for encode and\n * about 50% faster for decoding large arrays. This implementation is about twice as fast on very small\n * arrays (&lt 30 bytes). If source/destination is a <code>String</code> this\n * version is about three times as fast due to the fact that the Commons Codec result has to be recoded\n * to a <code>String</code> from <code>byte[]</code>, which is very expensive.<br><br>\n *\n * This encode/decode algorithm doesn't create any temporary arrays as many other codecs do, it only\n * allocates the resulting array. This produces less garbage and it is possible to handle arrays twice\n * as large as algorithms that create a temporary array. (E.g. Jakarta Commons Codec). It is unknown\n * whether Sun's <code>sun.misc.Encoder()/Decoder()</code> produce temporary arrays but since performance\n * is quite low it probably does.<br><br>\n *\n * The encoder produces the same output as the Sun one except that the Sun's encoder appends\n * a trailing line separator if the last character isn't a pad. Unclear why but it only adds to the\n * length and is probably a side effect. Both are in conformance with RFC 2045 though.<br>\n * Commons codec seem to always att a trailing line separator.<br><br>\n *\n * <b>Note!</b>\n * The encode/decode method pairs (types) come in three versions with the <b>exact</b> same algorithm and\n * thus a lot of code redundancy. This is to not create any temporary arrays for transcoding to/from different\n * format types. The methods not used can simply be commented out.<br><br>\n *\n * There is also a \"fast\" version of all decode methods that works the same way as the normal ones, but\n * har a few demands on the decoded input. Normally though, these fast verions should be used if the source if\n * the input is known and it hasn't bee tampered with.<br><br>\n *\n * If you find the code useful or you find a bug, please send me a note at base64 @ miginfocom . com.\n *\n * Licence (BSD):\n * ==============\n *\n * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (base64 @ miginfocom . com)\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright notice, this list\n * of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this\n * list of conditions and the following disclaimer in the documentation and/or other\n * materials provided with the distribution.\n * Neither the name of the MiG InfoCom AB nor the names of its contributors may be\n * used to endorse or promote products derived from this software without specific\n * prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\n * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * @version 2.2\n * @author Mikael Grev\n *         Date: 2004-aug-02\n *         Time: 11:31:11\n */\n\npublic class Base64\n{\n\tprivate static final char[] CA = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".toCharArray();\n\tprivate static final int[] IA = new int[256];\n\tstatic {\n\t\tArrays.fill(IA, -1);\n\t\tfor (int i = 0, iS = CA.length; i < iS; i++)\n\t\t\tIA[CA[i]] = i;\n\t\tIA['='] = 0;\n\t}\n\n\t// ****************************************************************************************\n\t// *  char[] version\n\t// ****************************************************************************************\n\n\t/** Encodes a raw byte array into a BASE64 <code>char[]</code> representation i accordance with RFC 2045.\n\t * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n\t * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n\t * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n\t * little faster.\n\t * @return A BASE64 encoded array. Never <code>null</code>.\n\t */\n\tpublic final static char[] encodeToChar(byte[] sArr, boolean lineSep)\n\t{\n\t\t// Check special case\n\t\tint sLen = sArr != null ? sArr.length : 0;\n\t\tif (sLen == 0)\n\t\t\treturn new char[0];\n\n\t\tint eLen = (sLen / 3) * 3;              // Length of even 24-bits.\n\t\tint cCnt = ((sLen - 1) / 3 + 1) << 2;   // Returned character count\n\t\tint dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array\n\t\tchar[] dArr = new char[dLen];\n\n\t\t// Encode even 24-bits\n\t\tfor (int s = 0, d = 0, cc = 0; s < eLen;) {\n\t\t\t// Copy next three bytes into lower 24 bits of int, paying attension to sign.\n\t\t\tint i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff);\n\n\t\t\t// Encode the int into four chars\n\t\t\tdArr[d++] = CA[(i >>> 18) & 0x3f];\n\t\t\tdArr[d++] = CA[(i >>> 12) & 0x3f];\n\t\t\tdArr[d++] = CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[d++] = CA[i & 0x3f];\n\n\t\t\t// Add optional line separator\n\t\t\tif (lineSep && ++cc == 19 && d < dLen - 2) {\n\t\t\t\tdArr[d++] = '\\r';\n\t\t\t\tdArr[d++] = '\\n';\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\t// Pad and encode last bits if source isn't even 24 bits.\n\t\tint left = sLen - eLen; // 0 - 2.\n\t\tif (left > 0) {\n\t\t\t// Prepare the int\n\t\t\tint i = ((sArr[eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0);\n\n\t\t\t// Set last four chars\n\t\t\tdArr[dLen - 4] = CA[i >> 12];\n\t\t\tdArr[dLen - 3] = CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[dLen - 2] = left == 2 ? CA[i & 0x3f] : '=';\n\t\t\tdArr[dLen - 1] = '=';\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t/** Decodes a BASE64 encoded char array. All illegal characters will be ignored and can handle both arrays with\n\t * and without line separators.\n\t * @param sArr The source array. <code>null</code> or length 0 will return an empty array.\n\t * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n\t * (including '=') isn't divideable by 4.  (I.e. definitely corrupted).\n\t */\n\tpublic final static byte[] decode(char[] sArr)\n\t{\n\t\t// Check special case\n\t\tint sLen = sArr != null ? sArr.length : 0;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\t// Count illegal characters (including '\\r', '\\n') to know what size the returned array will be,\n\t\t// so we don't have to reallocate & copy it later.\n\t\tint sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)\n\t\tfor (int i = 0; i < sLen; i++)  // If input is \"pure\" (I.e. no line separators or illegal chars) base64 this loop can be commented out.\n\t\t\tif (IA[sArr[i]] < 0)\n\t\t\t\tsepCnt++;\n\n\t\t// Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.\n\t\tif ((sLen - sepCnt) % 4 != 0)\n\t\t\treturn null;\n\n\t\tint pad = 0;\n\t\tfor (int i = sLen; i > 1 && IA[sArr[--i]] <= 0;)\n\t\t\tif (sArr[i] == '=')\n\t\t\t\tpad++;\n\n\t\tint len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\tfor (int s = 0, d = 0; d < len;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; j < 4; j++) {   // j only increased if a valid char was found.\n\t\t\t\tint c = IA[sArr[s++]];\n\t\t\t\tif (c >= 0)\n\t\t\t\t    i |= c << (18 - j * 6);\n\t\t\t\telse\n\t\t\t\t\tj--;\n\t\t\t}\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tif (d < len) {\n\t\t\t\tdArr[d++]= (byte) (i >> 8);\n\t\t\t\tif (d < len)\n\t\t\t\t\tdArr[d++] = (byte) i;\n\t\t\t}\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t/** Decodes a BASE64 encoded char array that is known to be resonably well formatted. The method is about twice as\n\t * fast as {@link #decode(char[])}. The preconditions are:<br>\n\t * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n\t * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n\t * + The array must not contain illegal characters within the encoded string<br>\n\t * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n\t * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0.\n\t */\n\tpublic final static byte[] decodeFast(char[] sArr)\n\t{\n\t\t// Check special case\n\t\tint sLen = sArr.length;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint sIx = 0, eIx = sLen - 1;    // Start and end index after trimming.\n\n\t\t// Trim illegal chars from start\n\t\twhile (sIx < eIx && IA[sArr[sIx]] < 0)\n\t\t\tsIx++;\n\n\t\t// Trim illegal chars from end\n\t\twhile (eIx > 0 && IA[sArr[eIx]] < 0)\n\t\t\teIx--;\n\n\t\t// get the padding count (=) (0, 1 or 2)\n\t\tint pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0;  // Count '=' at end.\n\t\tint cCnt = eIx - sIx + 1;   // Content count including possible separators\n\t\tint sepCnt = sLen > 76 ? (sArr[76] == '\\r' ? cCnt / 78 : 0) << 1 : 0;\n\n\t\tint len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\t// Decode all but the last 0 - 2 bytes.\n\t\tint d = 0;\n\t\tfor (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12 | IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]];\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\tdArr[d++] = (byte) i;\n\n\t\t\t// If line separator, jump over it.\n\t\t\tif (sepCnt > 0 && ++cc == 19) {\n\t\t\t\tsIx += 2;\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (d < len) {\n\t\t\t// Decode last 1-3 bytes (incl '=') into 1-3 bytes\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; sIx <= eIx - pad; j++)\n\t\t\t\ti |= IA[sArr[sIx++]] << (18 - j * 6);\n\n\t\t\tfor (int r = 16; d < len; r -= 8)\n\t\t\t\tdArr[d++] = (byte) (i >> r);\n\t\t}\n\n\t\treturn dArr;\n\t}\n\n\t// ****************************************************************************************\n\t// *  byte[] version\n\t// ****************************************************************************************\n\n\t/** Encodes a raw byte array into a BASE64 <code>byte[]</code> representation i accordance with RFC 2045.\n\t * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n\t * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n\t * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n\t * little faster.\n\t * @return A BASE64 encoded array. Never <code>null</code>.\n\t */\n\tpublic final static byte[] encodeToByte(byte[] sArr, boolean lineSep)\n\t{\n\t\treturn encodeToByte(sArr, 0, sArr != null ? sArr.length : 0, lineSep);\n\t}\n\n\t/** Encodes a raw byte array into a BASE64 <code>byte[]</code> representation i accordance with RFC 2045.\n\t * @param sArr The bytes to convert. If <code>null</code> an empty array will be returned.\n\t * @param sOff The starting position in the bytes to convert.\n\t * @param sLen The number of bytes to convert. If 0 an empty array will be returned.\n\t * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n\t * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n\t * little faster.\n\t * @return A BASE64 encoded array. Never <code>null</code>.\n\t */\n\tpublic final static byte[] encodeToByte(byte[] sArr, int sOff, int sLen, boolean lineSep)\n\t{\n\t\t// Check special case\n\t\tif (sArr == null || sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint eLen = (sLen / 3) * 3;                              // Length of even 24-bits.\n\t\tint cCnt = ((sLen - 1) / 3 + 1) << 2;                   // Returned character count\n\t\tint dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array\n\t\tbyte[] dArr = new byte[dLen];\n\n\t\t// Encode even 24-bits\n\t\tfor (int s = sOff, d = 0, cc = 0; s < sOff + eLen;) {\n\t\t\t// Copy next three bytes into lower 24 bits of int, paying attension to sign.\n\t\t\tint i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff);\n\n\t\t\t// Encode the int into four chars\n\t\t\tdArr[d++] = (byte) CA[(i >>> 18) & 0x3f];\n\t\t\tdArr[d++] = (byte) CA[(i >>> 12) & 0x3f];\n\t\t\tdArr[d++] = (byte) CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[d++] = (byte) CA[i & 0x3f];\n\n\t\t\t// Add optional line separator\n\t\t\tif (lineSep && ++cc == 19 && d < dLen - 2) {\n\t\t\t\tdArr[d++] = '\\r';\n\t\t\t\tdArr[d++] = '\\n';\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\t// Pad and encode last bits if source isn't an even 24 bits.\n\t\tint left = sLen - eLen; // 0 - 2.\n\t\tif (left > 0) {\n\t\t\t// Prepare the int\n\t\t\tint i = ((sArr[sOff + eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sOff + sLen - 1] & 0xff) << 2) : 0);\n\n\t\t\t// Set last four chars\n\t\t\tdArr[dLen - 4] = (byte) CA[i >> 12];\n\t\t\tdArr[dLen - 3] = (byte) CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[dLen - 2] = left == 2 ? (byte) CA[i & 0x3f] : (byte) '=';\n\t\t\tdArr[dLen - 1] = '=';\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t/** Decodes a BASE64 encoded byte array. All illegal characters will be ignored and can handle both arrays with\n\t * and without line separators.\n\t * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n\t * (including '=') isn't divideable by 4. (I.e. definitely corrupted).\n\t */\n\tpublic final static byte[] decode(byte[] sArr)\n\t{\n\t\treturn decode(sArr, 0, sArr.length);\n\t}\n\n\t/** Decodes a BASE64 encoded byte array. All illegal characters will be ignored and can handle both arrays with\n\t * and without line separators.\n\t * @param sArr The source array. <code>null</code> will throw an exception.\n\t * @param sOff The starting position in the source array.\n\t * @param sLen The number of bytes to decode from the source array. Length 0 will return an empty array.\n\t * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n\t * (including '=') isn't divideable by 4. (I.e. definitely corrupted).\n\t */\n\tpublic final static byte[] decode(byte[] sArr, int sOff, int sLen)\n\t{\n\t\t// Count illegal characters (including '\\r', '\\n') to know what size the returned array will be,\n\t\t// so we don't have to reallocate & copy it later.\n\t\tint sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)\n\t\tfor (int i = 0; i < sLen; i++)      // If input is \"pure\" (I.e. no line separators or illegal chars) base64 this loop can be commented out.\n\t\t\tif (IA[sArr[sOff + i] & 0xff] < 0)\n\t\t\t\tsepCnt++;\n\n\t\t// Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.\n\t\tif ((sLen - sepCnt) % 4 != 0)\n\t\t\treturn null;\n\n\t\tint pad = 0;\n\t\tfor (int i = sLen; i > 1 && IA[sArr[sOff + --i] & 0xff] <= 0;)\n\t\t\tif (sArr[sOff + i] == '=')\n\t\t\t\tpad++;\n\n\t\tint len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\tfor (int s = 0, d = 0; d < len;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; j < 4; j++) {   // j only increased if a valid char was found.\n\t\t\t\tint c = IA[sArr[sOff + s++] & 0xff];\n\t\t\t\tif (c >= 0)\n\t\t\t\t    i |= c << (18 - j * 6);\n\t\t\t\telse\n\t\t\t\t\tj--;\n\t\t\t}\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tif (d < len) {\n\t\t\t\tdArr[d++]= (byte) (i >> 8);\n\t\t\t\tif (d < len)\n\t\t\t\t\tdArr[d++] = (byte) i;\n\t\t\t}\n\t\t}\n\n\t\treturn dArr;\n\t}\n\n\n\t/** Decodes a BASE64 encoded byte array that is known to be resonably well formatted. The method is about twice as\n\t * fast as {@link #decode(byte[])}. The preconditions are:<br>\n\t * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n\t * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n\t * + The array must not contain illegal characters within the encoded string<br>\n\t * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n\t * @param sArr The source array. Length 0 will return an empty array. <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0.\n\t */\n\tpublic final static byte[] decodeFast(byte[] sArr)\n\t{\n\t\t// Check special case\n\t\tint sLen = sArr.length;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint sIx = 0, eIx = sLen - 1;    // Start and end index after trimming.\n\n\t\t// Trim illegal chars from start\n\t\twhile (sIx < eIx && IA[sArr[sIx] & 0xff] < 0)\n\t\t\tsIx++;\n\n\t\t// Trim illegal chars from end\n\t\twhile (eIx > 0 && IA[sArr[eIx] & 0xff] < 0)\n\t\t\teIx--;\n\n\t\t// get the padding count (=) (0, 1 or 2)\n\t\tint pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0;  // Count '=' at end.\n\t\tint cCnt = eIx - sIx + 1;   // Content count including possible separators\n\t\tint sepCnt = sLen > 76 ? (sArr[76] == '\\r' ? cCnt / 78 : 0) << 1 : 0;\n\n\t\tint len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\t// Decode all but the last 0 - 2 bytes.\n\t\tint d = 0;\n\t\tfor (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12 | IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]];\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\tdArr[d++] = (byte) i;\n\n\t\t\t// If line separator, jump over it.\n\t\t\tif (sepCnt > 0 && ++cc == 19) {\n\t\t\t\tsIx += 2;\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (d < len) {\n\t\t\t// Decode last 1-3 bytes (incl '=') into 1-3 bytes\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; sIx <= eIx - pad; j++)\n\t\t\t\ti |= IA[sArr[sIx++]] << (18 - j * 6);\n\n\t\t\tfor (int r = 16; d < len; r -= 8)\n\t\t\t\tdArr[d++] = (byte) (i >> r);\n\t\t}\n\n\t\treturn dArr;\n\t}\n\n\t// ****************************************************************************************\n\t// * String version\n\t// ****************************************************************************************\n\n\t/** Encodes a raw byte array into a BASE64 <code>String</code> representation i accordance with RFC 2045.\n\t * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.\n\t * @param lineSep Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n\t * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a\n\t * little faster.\n\t * @return A BASE64 encoded array. Never <code>null</code>.\n\t */\n\tpublic final static String encodeToString(byte[] sArr, boolean lineSep)\n\t{\n\t\t// Reuse char[] since we can't create a String incrementally anyway and StringBuffer/Builder would be slower.\n\t\treturn new String(encodeToChar(sArr, lineSep));\n\t}\n\n\t/** Decodes a BASE64 encoded <code>String</code>. All illegal characters will be ignored and can handle both strings with\n\t * and without line separators.<br>\n\t * <b>Note!</b> It can be up to about 2x the speed to call <code>decode(str.toCharArray())</code> instead. That\n\t * will create a temporary array though. This version will use <code>str.charAt(i)</code> to iterate the string.\n\t * @param str The source string. <code>null</code> or length 0 will return an empty array.\n\t * @return The decoded array of bytes. May be of length 0. Will be <code>null</code> if the legal characters\n\t * (including '=') isn't divideable by 4.  (I.e. definitely corrupted).\n\t */\n\tpublic final static byte[] decode(String str)\n\t{\n\t\t// Check special case\n\t\tint sLen = str != null ? str.length() : 0;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\t// Count illegal characters (including '\\r', '\\n') to know what size the returned array will be,\n\t\t// so we don't have to reallocate & copy it later.\n\t\tint sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)\n\t\tfor (int i = 0; i < sLen; i++)  // If input is \"pure\" (I.e. no line separators or illegal chars) base64 this loop can be commented out.\n\t\t\tif (IA[str.charAt(i)] < 0)\n\t\t\t\tsepCnt++;\n\n\t\t// Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.\n\t\tif ((sLen - sepCnt) % 4 != 0)\n\t\t\treturn null;\n\n\t\t// Count '=' at end\n\t\tint pad = 0;\n\t\tfor (int i = sLen; i > 1 && IA[str.charAt(--i)] <= 0;)\n\t\t\tif (str.charAt(i) == '=')\n\t\t\t\tpad++;\n\n\t\tint len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\tfor (int s = 0, d = 0; d < len;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; j < 4; j++) {   // j only increased if a valid char was found.\n\t\t\t\tint c = IA[str.charAt(s++)];\n\t\t\t\tif (c >= 0)\n\t\t\t\t    i |= c << (18 - j * 6);\n\t\t\t\telse\n\t\t\t\t\tj--;\n\t\t\t}\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tif (d < len) {\n\t\t\t\tdArr[d++]= (byte) (i >> 8);\n\t\t\t\tif (d < len)\n\t\t\t\t\tdArr[d++] = (byte) i;\n\t\t\t}\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t/** Decodes a BASE64 encoded string that is known to be resonably well formatted. The method is about twice as\n\t * fast as {@link #decode(String)}. The preconditions are:<br>\n\t * + The array must have a line length of 76 chars OR no line separators at all (one line).<br>\n\t * + Line separator must be \"\\r\\n\", as specified in RFC 2045\n\t * + The array must not contain illegal characters within the encoded string<br>\n\t * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.<br>\n\t * @param s The source string. Length 0 will return an empty array. <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0.\n\t */\n\tpublic final static byte[] decodeFast(String s)\n\t{\n\t\t// Check special case\n\t\tint sLen = s.length();\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint sIx = 0, eIx = sLen - 1;    // Start and end index after trimming.\n\n\t\t// Trim illegal chars from start\n\t\twhile (sIx < eIx && IA[s.charAt(sIx) & 0xff] < 0)\n\t\t\tsIx++;\n\n\t\t// Trim illegal chars from end\n\t\twhile (eIx > 0 && IA[s.charAt(eIx) & 0xff] < 0)\n\t\t\teIx--;\n\n\t\t// get the padding count (=) (0, 1 or 2)\n\t\tint pad = s.charAt(eIx) == '=' ? (s.charAt(eIx - 1) == '=' ? 2 : 1) : 0;  // Count '=' at end.\n\t\tint cCnt = eIx - sIx + 1;   // Content count including possible separators\n\t\tint sepCnt = sLen > 76 ? (s.charAt(76) == '\\r' ? cCnt / 78 : 0) << 1 : 0;\n\n\t\tint len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes\n\t\tbyte[] dArr = new byte[len];       // Preallocate byte[] of exact length\n\n\t\t// Decode all but the last 0 - 2 bytes.\n\t\tint d = 0;\n\t\tfor (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = IA[s.charAt(sIx++)] << 18 | IA[s.charAt(sIx++)] << 12 | IA[s.charAt(sIx++)] << 6 | IA[s.charAt(sIx++)];\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\tdArr[d++] = (byte) i;\n\n\t\t\t// If line separator, jump over it.\n\t\t\tif (sepCnt > 0 && ++cc == 19) {\n\t\t\t\tsIx += 2;\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (d < len) {\n\t\t\t// Decode last 1-3 bytes (incl '=') into 1-3 bytes\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; sIx <= eIx - pad; j++)\n\t\t\t\ti |= IA[s.charAt(sIx++)] << (18 - j * 6);\n\n\t\t\tfor (int r = 16; d < len; r -= 8)\n\t\t\t\tdArr[d++] = (byte) (i >> r);\n\t\t}\n\n\t\treturn dArr;\n\t}\n}",
      "methods" : {
        "Base64" : [ {
          "name" : "encodeToChar",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToChar(byte[], boolean):char[]",
          "lineStart" : 95,
          "lineEnd" : 139,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 147,
          "lineEnd" : 193,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(char[]):byte[]",
          "lineStart" : 204,
          "lineEnd" : 258,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encodeToByte",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToByte(byte[], boolean):byte[]",
          "lineStart" : 271,
          "lineEnd" : 274,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encodeToByte",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "int", "int", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToByte(byte[], int, int, boolean):byte[]",
          "lineStart" : 285,
          "lineEnd" : 328,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[]):byte[]",
          "lineStart" : 336,
          "lineEnd" : 339,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[], int, int):byte[]",
          "lineStart" : 349,
          "lineEnd" : 392,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(byte[]):byte[]",
          "lineStart" : 404,
          "lineEnd" : 458,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encodeToString",
          "returnParam" : "String",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToString(byte[], boolean):String",
          "lineStart" : 471,
          "lineEnd" : 475,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):byte[]",
          "lineStart" : 485,
          "lineEnd" : 532,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(String):byte[]",
          "lineStart" : 543,
          "lineEnd" : 597,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 147,
        "lineEnd" : 193,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      } ],
      "failedMethods" : [ {
        "name" : null,
        "returnParam" : null,
        "params" : null,
        "visibility" : null,
        "descriptor" : "encode(byte[]):char[]",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : false
      } ],
      "artifactInfo" : {
        "name" : "MiG Base64",
        "description" : "MiGBase64 is a very fast and small Base64 Codec written in Java",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "df614d70-170f-4cf7-b0b0-6f805cd55737" ],
        "_version_" : [ 1521884881227874304 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "true|||", "false|public static final byte[] com.migcomponents.migbase64.Base64.decode(char[])|com.migcomponents.migbase64.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public com.migcomponents.migbase64.Base64()|com.migcomponents.migbase64.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.25,
        "sf_complexity_necf" : 115.0,
        "calledClasses_ckjm_ext_ca_max" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.5416666666666666,
        "jmh_thrpt_score_sum" : 39301.93543430875,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 0.5,
        "sf_complexity_covered" : 15.0,
        "sf_line_balance" : 6.633333333333334,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 120.92307692307692,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 19.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 30.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 13.0,
        "entryClass_ckjm_ext_loc" : 1587.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 39301.935434308725,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 30.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 120.92307692307688,
        "calledClasses_ckjm_ext_cbo_mean" : 0.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 13.0,
        "calledClasses_ckjm_ext_rfc_sum" : 19.0,
        "sf_instruction_necf" : 1542.0,
        "calledClasses_ckjm_ext_npm_sum" : 12.0,
        "calledClasses_ckjm_ext_loc_geomean" : 1587.0000000000005,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 30.0,
        "calledClasses_ckjm_ext_loc_min" : 1587.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 1542.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 18.999999999999996,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 5.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 229.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 10.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 13.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.25,
        "sf_line_leanmetric" : 30.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.25,
        "calledClasses_ckjm_ext_lcom_sum" : 30.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 30.000000000000004,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 100.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 0.0,
        "calledClasses_ckjm_ext_loc_sum" : 1587.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.25,
        "calledClasses_ckjm_ext_lcom3_max" : 0.5416666666666666,
        "entryClass_ckjm_ext_amc" : 120.92307692307692,
        "sf_method_sf" : 10.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 120.92307692307692,
        "calledClasses_ckjm_ext_npm_max" : 12.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 0.0,
        "calledClasses_ckjm_ext_ca_sum" : 0.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 9.936170212765957,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.25,
        "jmh_thrpt_score_quadmean" : 39301.93543430875,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 15.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 30.0,
        "sf_line_total" : 229.0,
        "entryClass_ckjm_ext_lcom" : 30.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 141.0,
        "sf_line_sf" : 199.0,
        "hashCodeCloneCountGlobal" : 1.0,
        "luceneScore" : 6.320479393005371,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 12.0,
        "sf_instruction_covered" : 141.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 19.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.5416666666666666,
        "entryClass_ckjm_ext_lcom3" : 0.5416666666666666,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 0.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 0.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 100.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 1587.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 141.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 12.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_max" : 120.92307692307692,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 0.0,
        "calledClasses_ckjm_ext_lcom_min" : 30.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 2.0,
        "fs_unique" : 0.5,
        "calledClasses_ckjm_ext_amc_quadmean" : 120.92307692307692,
        "jmh_thrpt_score_mean" : 39301.93543430875,
        "sf_line_missed" : 199.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 0.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 15.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 0.0,
        "sf_line_leanness" : 0.13100436681222707,
        "calledUncalledMethodRatio" : 0.23076923076923078,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 1401.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 1587.0,
        "calledClasses_ckjm_ext_wmc_mean" : 13.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 1.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.25,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.5416666666666666,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.25,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 12.0,
        "sf_line_nf" : 30.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 1401.0,
        "sf_method_covered" : 2.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 0.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.5416666666666666,
        "sf_complexity_leanness" : 0.13043478260869565,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 12.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 115.0,
        "noCalledMethods" : 3.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 6.666666666666667,
        "calledClasses_ckjm_ext_npm_min" : 12.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.0914396887159533,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.16666666666666666,
        "calledClasses_ckjm_ext_lcom3_min" : 0.5416666666666666,
        "calledClasses_ckjm_ext_wmc_max" : 13.0,
        "calledClasses_ckjm_ext_rfc_mean" : 19.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 10.0,
        "sf_method_nf" : 2.0,
        "calledClasses_ckjm_ext_npm_geomean" : 12.0,
        "calledClasses_ckjm_ext_amc_min" : 120.92307692307692,
        "calledClasses_ckjm_ext_wmc_sum" : 13.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 19.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 1587.0,
        "calledClasses_ckjm_ext_ca_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 12.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 19.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 39301.93543430875,
        "entryClass_ckjm_ext_wmc" : 13.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 26.0,
        "SINGLE_SMOOP_po" : 13.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "com.migcomponents.migbase64.Base64",
      "uri" : "com.brsanthu:migbase64:2.2"
    }, {
      "id" : "925e005b-642f-4a7e-b6c4-db9d6e254b13",
      "groupId" : "net.sf.py4j",
      "artifactId" : "py4j",
      "version" : "0.9",
      "name" : "Base64",
      "packagename" : "py4j",
      "score" : 6.3204794,
      "hash" : "24e1000138a49a36fca1c3d907580148",
      "content" : "package py4j;\n\nimport java.util.Arrays;\n\n/**\n * A very fast and memory efficient class to encode and decode to and from\n * BASE64 in full accordance with RFC 2045.<br>\n * <br>\n * On Windows XP sp1 with 1.4.2_04 and later ;), this encoder and decoder is\n * about 10 times faster on small arrays (10 - 1000 bytes) and 2-3 times as fast\n * on larger arrays (10000 - 1000000 bytes) compared to\n * <code>sun.misc.Encoder()/Decoder()</code>.<br>\n * <br>\n * \n * On byte arrays the encoder is about 20% faster than Jakarta Commons Base64\n * Codec for encode and about 50% faster for decoding large arrays. This\n * implementation is about twice as fast on very small arrays (&lt; 30 bytes). If\n * source/destination is a <code>String</code> this version is about three times\n * as fast due to the fact that the Commons Codec result has to be recoded to a\n * <code>String</code> from <code>byte[]</code>, which is very expensive.<br>\n * <br>\n * \n * This encode/decode algorithm doesn't create any temporary arrays as many\n * other codecs do, it only allocates the resulting array. This produces less\n * garbage and it is possible to handle arrays twice as large as algorithms that\n * create a temporary array. (E.g. Jakarta Commons Codec). It is unknown whether\n * Sun's <code>sun.misc.Encoder()/Decoder()</code> produce temporary arrays but\n * since performance is quite low it probably does.<br>\n * <br>\n * \n * The encoder produces the same output as the Sun one except that the Sun's\n * encoder appends a trailing line separator if the last character isn't a pad.\n * Unclear why but it only adds to the length and is probably a side effect.\n * Both are in conformance with RFC 2045 though.<br>\n * Commons codec seem to always att a trailing line separator.<br>\n * <br>\n * \n * <b>Note!</b> The encode/decode method pairs (types) come in three versions\n * with the <b>exact</b> same algorithm and thus a lot of code redundancy. This\n * is to not create any temporary arrays for transcoding to/from different\n * format types. The methods not used can simply be commented out.<br>\n * <br>\n * \n * There is also a \"fast\" version of all decode methods that works the same way\n * as the normal ones, but har a few demands on the decoded input. Normally\n * though, these fast verions should be used if the source if the input is known\n * and it hasn't bee tampered with.<br>\n * <br>\n * \n * If you find the code useful or you find a bug, please send me a note at\n * base64 @ miginfocom . com.\n * \n * Licence (BSD): ==============\n * \n * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (base64 @ miginfocom . com)\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer. Redistributions in binary\n * form must reproduce the above copyright notice, this list of conditions and\n * the following disclaimer in the documentation and/or other materials provided\n * with the distribution. Neither the name of the MiG InfoCom AB nor the names\n * of its contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n * \n * @version 2.2\n * @author Mikael Grev Date: 2004-aug-02 Time: 11:31:11\n */\n\npublic class Base64 {\n\tprivate static final char[] CA = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"\n\t\t\t.toCharArray();\n\tprivate static final int[] IA = new int[256];\n\tstatic {\n\t\tArrays.fill(IA, -1);\n\t\tfor (int i = 0, iS = CA.length; i < iS; i++)\n\t\t\tIA[CA[i]] = i;\n\t\tIA['='] = 0;\n\t}\n\n\t// ****************************************************************************************\n\t// * char[] version\n\t// ****************************************************************************************\n\n\t/**\n\t * Decodes a BASE64 encoded byte array. All illegal characters will be\n\t * ignored and can handle both arrays with and without line separators.\n\t * \n\t * @param sArr\n\t *            The source array. Length 0 will return an empty array.\n\t *            <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0. Will be\n\t *         <code>null</code> if the legal characters (including '=') isn't\n\t *         divideable by 4. (I.e. definitely corrupted).\n\t */\n\tpublic final static byte[] decode(byte[] sArr) {\n\t\treturn decode(sArr, 0, sArr.length);\n\t}\n\n\t/**\n\t * Decodes a BASE64 encoded byte array. All illegal characters will be\n\t * ignored and can handle both arrays with and without line separators.\n\t * \n\t * @param sArr\n\t *            The source array. <code>null</code> will throw an exception.\n\t * @param sOff\n\t *            The starting position in the source array.\n\t * @param sLen\n\t *            The number of bytes to decode from the source array. Length 0\n\t *            will return an empty array.\n\t * @return The decoded array of bytes. May be of length 0. Will be\n\t *         <code>null</code> if the legal characters (including '=') isn't\n\t *         divideable by 4. (I.e. definitely corrupted).\n\t */\n\tpublic final static byte[] decode(byte[] sArr, int sOff, int sLen) {\n\t\t// Count illegal characters (including '\\r', '\\n') to know what size the\n\t\t// returned array will be,\n\t\t// so we don't have to reallocate & copy it later.\n\t\tint sepCnt = 0; // Number of separator characters. (Actually illegal\n\t\t\t\t\t\t// characters, but that's a bonus...)\n\t\tfor (int i = 0; i < sLen; i++)\n\t\t\t// If input is \"pure\" (I.e. no line separators or illegal chars)\n\t\t\t// base64 this loop can be commented out.\n\t\t\tif (IA[sArr[sOff + i] & 0xff] < 0)\n\t\t\t\tsepCnt++;\n\n\t\t// Check so that legal chars (including '=') are evenly divideable by 4\n\t\t// as specified in RFC 2045.\n\t\tif ((sLen - sepCnt) % 4 != 0)\n\t\t\treturn null;\n\n\t\tint pad = 0;\n\t\tfor (int i = sLen; i > 1 && IA[sArr[sOff + --i] & 0xff] <= 0;)\n\t\t\tif (sArr[sOff + i] == '=')\n\t\t\t\tpad++;\n\n\t\tint len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n\t\tbyte[] dArr = new byte[len]; // Preallocate byte[] of exact length\n\n\t\tfor (int s = 0, d = 0; d < len;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; j < 4; j++) { // j only increased if a valid char\n\t\t\t\t\t\t\t\t\t\t\t// was found.\n\t\t\t\tint c = IA[sArr[sOff + s++] & 0xff];\n\t\t\t\tif (c >= 0)\n\t\t\t\t\ti |= c << (18 - j * 6);\n\t\t\t\telse\n\t\t\t\t\tj--;\n\t\t\t}\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tif (d < len) {\n\t\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\t\tif (d < len)\n\t\t\t\t\tdArr[d++] = (byte) i;\n\t\t\t}\n\t\t}\n\n\t\treturn dArr;\n\t}\n\n\t/**\n\t * Decodes a BASE64 encoded char array. All illegal characters will be\n\t * ignored and can handle both arrays with and without line separators.\n\t * \n\t * @param sArr\n\t *            The source array. <code>null</code> or length 0 will return an\n\t *            empty array.\n\t * @return The decoded array of bytes. May be of length 0. Will be\n\t *         <code>null</code> if the legal characters (including '=') isn't\n\t *         divideable by 4. (I.e. definitely corrupted).\n\t */\n\tpublic final static byte[] decode(char[] sArr) {\n\t\t// Check special case\n\t\tint sLen = sArr != null ? sArr.length : 0;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\t// Count illegal characters (including '\\r', '\\n') to know what size the\n\t\t// returned array will be,\n\t\t// so we don't have to reallocate & copy it later.\n\t\tint sepCnt = 0; // Number of separator characters. (Actually illegal\n\t\t\t\t\t\t// characters, but that's a bonus...)\n\t\tfor (int i = 0; i < sLen; i++)\n\t\t\t// If input is \"pure\" (I.e. no line separators or illegal chars)\n\t\t\t// base64 this loop can be commented out.\n\t\t\tif (IA[sArr[i]] < 0)\n\t\t\t\tsepCnt++;\n\n\t\t// Check so that legal chars (including '=') are evenly divideable by 4\n\t\t// as specified in RFC 2045.\n\t\tif ((sLen - sepCnt) % 4 != 0)\n\t\t\treturn null;\n\n\t\tint pad = 0;\n\t\tfor (int i = sLen; i > 1 && IA[sArr[--i]] <= 0;)\n\t\t\tif (sArr[i] == '=')\n\t\t\t\tpad++;\n\n\t\tint len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n\t\tbyte[] dArr = new byte[len]; // Preallocate byte[] of exact length\n\n\t\tfor (int s = 0, d = 0; d < len;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; j < 4; j++) { // j only increased if a valid char\n\t\t\t\t\t\t\t\t\t\t\t// was found.\n\t\t\t\tint c = IA[sArr[s++]];\n\t\t\t\tif (c >= 0)\n\t\t\t\t\ti |= c << (18 - j * 6);\n\t\t\t\telse\n\t\t\t\t\tj--;\n\t\t\t}\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tif (d < len) {\n\t\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\t\tif (d < len)\n\t\t\t\t\tdArr[d++] = (byte) i;\n\t\t\t}\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t// ****************************************************************************************\n\t// * byte[] version\n\t// ****************************************************************************************\n\n\t/**\n\t * Decodes a BASE64 encoded <code>String</code>. All illegal characters will\n\t * be ignored and can handle both strings with and without line separators.<br>\n\t * <b>Note!</b> It can be up to about 2x the speed to call\n\t * <code>decode(str.toCharArray())</code> instead. That will create a\n\t * temporary array though. This version will use <code>str.charAt(i)</code>\n\t * to iterate the string.\n\t * \n\t * @param str\n\t *            The source string. <code>null</code> or length 0 will return\n\t *            an empty array.\n\t * @return The decoded array of bytes. May be of length 0. Will be\n\t *         <code>null</code> if the legal characters (including '=') isn't\n\t *         divideable by 4. (I.e. definitely corrupted).\n\t */\n\tpublic final static byte[] decode(String str) {\n\t\t// Check special case\n\t\tint sLen = str != null ? str.length() : 0;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\t// Count illegal characters (including '\\r', '\\n') to know what size the\n\t\t// returned array will be,\n\t\t// so we don't have to reallocate & copy it later.\n\t\tint sepCnt = 0; // Number of separator characters. (Actually illegal\n\t\t\t\t\t\t// characters, but that's a bonus...)\n\t\tfor (int i = 0; i < sLen; i++)\n\t\t\t// If input is \"pure\" (I.e. no line separators or illegal chars)\n\t\t\t// base64 this loop can be commented out.\n\t\t\tif (IA[str.charAt(i)] < 0)\n\t\t\t\tsepCnt++;\n\n\t\t// Check so that legal chars (including '=') are evenly divideable by 4\n\t\t// as specified in RFC 2045.\n\t\tif ((sLen - sepCnt) % 4 != 0)\n\t\t\treturn null;\n\n\t\t// Count '=' at end\n\t\tint pad = 0;\n\t\tfor (int i = sLen; i > 1 && IA[str.charAt(--i)] <= 0;)\n\t\t\tif (str.charAt(i) == '=')\n\t\t\t\tpad++;\n\n\t\tint len = ((sLen - sepCnt) * 6 >> 3) - pad;\n\n\t\tbyte[] dArr = new byte[len]; // Preallocate byte[] of exact length\n\n\t\tfor (int s = 0, d = 0; d < len;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; j < 4; j++) { // j only increased if a valid char\n\t\t\t\t\t\t\t\t\t\t\t// was found.\n\t\t\t\tint c = IA[str.charAt(s++)];\n\t\t\t\tif (c >= 0)\n\t\t\t\t\ti |= c << (18 - j * 6);\n\t\t\t\telse\n\t\t\t\t\tj--;\n\t\t\t}\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tif (d < len) {\n\t\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\t\tif (d < len)\n\t\t\t\t\tdArr[d++] = (byte) i;\n\t\t\t}\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t/**\n\t * Decodes a BASE64 encoded byte array that is known to be resonably well\n\t * formatted. The method is about twice as fast as {@link #decode(byte[])}.\n\t * The preconditions are:<br>\n\t * + The array must have a line length of 76 chars OR no line separators at\n\t * all (one line).<br>\n\t * + Line separator must be \"\\r\\n\", as specified in RFC 2045 + The array\n\t * must not contain illegal characters within the encoded string<br>\n\t * + The array CAN have illegal characters at the beginning and end, those\n\t * will be dealt with appropriately.<br>\n\t * \n\t * @param sArr\n\t *            The source array. Length 0 will return an empty array.\n\t *            <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0.\n\t */\n\tpublic final static byte[] decodeFast(byte[] sArr) {\n\t\t// Check special case\n\t\tint sLen = sArr.length;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint sIx = 0, eIx = sLen - 1; // Start and end index after trimming.\n\n\t\t// Trim illegal chars from start\n\t\twhile (sIx < eIx && IA[sArr[sIx] & 0xff] < 0)\n\t\t\tsIx++;\n\n\t\t// Trim illegal chars from end\n\t\twhile (eIx > 0 && IA[sArr[eIx] & 0xff] < 0)\n\t\t\teIx--;\n\n\t\t// get the padding count (=) (0, 1 or 2)\n\t\tint pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0; // Count\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// '='\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// at\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// end.\n\t\tint cCnt = eIx - sIx + 1; // Content count including possible separators\n\t\tint sepCnt = sLen > 76 ? (sArr[76] == '\\r' ? cCnt / 78 : 0) << 1 : 0;\n\n\t\tint len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded\n\t\t\t\t\t\t\t\t\t\t\t\t\t// bytes\n\t\tbyte[] dArr = new byte[len]; // Preallocate byte[] of exact length\n\n\t\t// Decode all but the last 0 - 2 bytes.\n\t\tint d = 0;\n\t\tfor (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12\n\t\t\t\t\t| IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]];\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\tdArr[d++] = (byte) i;\n\n\t\t\t// If line separator, jump over it.\n\t\t\tif (sepCnt > 0 && ++cc == 19) {\n\t\t\t\tsIx += 2;\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (d < len) {\n\t\t\t// Decode last 1-3 bytes (incl '=') into 1-3 bytes\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; sIx <= eIx - pad; j++)\n\t\t\t\ti |= IA[sArr[sIx++]] << (18 - j * 6);\n\n\t\t\tfor (int r = 16; d < len; r -= 8)\n\t\t\t\tdArr[d++] = (byte) (i >> r);\n\t\t}\n\n\t\treturn dArr;\n\t}\n\n\t/**\n\t * Decodes a BASE64 encoded char array that is known to be resonably well\n\t * formatted. The method is about twice as fast as {@link #decode(char[])}.\n\t * The preconditions are:<br>\n\t * + The array must have a line length of 76 chars OR no line separators at\n\t * all (one line).<br>\n\t * + Line separator must be \"\\r\\n\", as specified in RFC 2045 + The array\n\t * must not contain illegal characters within the encoded string<br>\n\t * + The array CAN have illegal characters at the beginning and end, those\n\t * will be dealt with appropriately.<br>\n\t * \n\t * @param sArr\n\t *            The source array. Length 0 will return an empty array.\n\t *            <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0.\n\t */\n\tpublic final static byte[] decodeFast(char[] sArr) {\n\t\t// Check special case\n\t\tint sLen = sArr.length;\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint sIx = 0, eIx = sLen - 1; // Start and end index after trimming.\n\n\t\t// Trim illegal chars from start\n\t\twhile (sIx < eIx && IA[sArr[sIx]] < 0)\n\t\t\tsIx++;\n\n\t\t// Trim illegal chars from end\n\t\twhile (eIx > 0 && IA[sArr[eIx]] < 0)\n\t\t\teIx--;\n\n\t\t// get the padding count (=) (0, 1 or 2)\n\t\tint pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0; // Count\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// '='\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// at\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// end.\n\t\tint cCnt = eIx - sIx + 1; // Content count including possible separators\n\t\tint sepCnt = sLen > 76 ? (sArr[76] == '\\r' ? cCnt / 78 : 0) << 1 : 0;\n\n\t\tint len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded\n\t\t\t\t\t\t\t\t\t\t\t\t\t// bytes\n\t\tbyte[] dArr = new byte[len]; // Preallocate byte[] of exact length\n\n\t\t// Decode all but the last 0 - 2 bytes.\n\t\tint d = 0;\n\t\tfor (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12\n\t\t\t\t\t| IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]];\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\tdArr[d++] = (byte) i;\n\n\t\t\t// If line separator, jump over it.\n\t\t\tif (sepCnt > 0 && ++cc == 19) {\n\t\t\t\tsIx += 2;\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (d < len) {\n\t\t\t// Decode last 1-3 bytes (incl '=') into 1-3 bytes\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; sIx <= eIx - pad; j++)\n\t\t\t\ti |= IA[sArr[sIx++]] << (18 - j * 6);\n\n\t\t\tfor (int r = 16; d < len; r -= 8)\n\t\t\t\tdArr[d++] = (byte) (i >> r);\n\t\t}\n\n\t\treturn dArr;\n\t}\n\n\t/**\n\t * Decodes a BASE64 encoded string that is known to be resonably well\n\t * formatted. The method is about twice as fast as {@link #decode(String)}.\n\t * The preconditions are:<br>\n\t * + The array must have a line length of 76 chars OR no line separators at\n\t * all (one line).<br>\n\t * + Line separator must be \"\\r\\n\", as specified in RFC 2045 + The array\n\t * must not contain illegal characters within the encoded string<br>\n\t * + The array CAN have illegal characters at the beginning and end, those\n\t * will be dealt with appropriately.<br>\n\t * \n\t * @param s\n\t *            The source string. Length 0 will return an empty array.\n\t *            <code>null</code> will throw an exception.\n\t * @return The decoded array of bytes. May be of length 0.\n\t */\n\tpublic final static byte[] decodeFast(String s) {\n\t\t// Check special case\n\t\tint sLen = s.length();\n\t\tif (sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint sIx = 0, eIx = sLen - 1; // Start and end index after trimming.\n\n\t\t// Trim illegal chars from start\n\t\twhile (sIx < eIx && IA[s.charAt(sIx) & 0xff] < 0)\n\t\t\tsIx++;\n\n\t\t// Trim illegal chars from end\n\t\twhile (eIx > 0 && IA[s.charAt(eIx) & 0xff] < 0)\n\t\t\teIx--;\n\n\t\t// get the padding count (=) (0, 1 or 2)\n\t\tint pad = s.charAt(eIx) == '=' ? (s.charAt(eIx - 1) == '=' ? 2 : 1) : 0; // Count\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// '='\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// at\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// end.\n\t\tint cCnt = eIx - sIx + 1; // Content count including possible separators\n\t\tint sepCnt = sLen > 76 ? (s.charAt(76) == '\\r' ? cCnt / 78 : 0) << 1\n\t\t\t\t: 0;\n\n\t\tint len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded\n\t\t\t\t\t\t\t\t\t\t\t\t\t// bytes\n\t\tbyte[] dArr = new byte[len]; // Preallocate byte[] of exact length\n\n\t\t// Decode all but the last 0 - 2 bytes.\n\t\tint d = 0;\n\t\tfor (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {\n\t\t\t// Assemble three bytes into an int from four \"valid\" characters.\n\t\t\tint i = IA[s.charAt(sIx++)] << 18 | IA[s.charAt(sIx++)] << 12\n\t\t\t\t\t| IA[s.charAt(sIx++)] << 6 | IA[s.charAt(sIx++)];\n\n\t\t\t// Add the bytes\n\t\t\tdArr[d++] = (byte) (i >> 16);\n\t\t\tdArr[d++] = (byte) (i >> 8);\n\t\t\tdArr[d++] = (byte) i;\n\n\t\t\t// If line separator, jump over it.\n\t\t\tif (sepCnt > 0 && ++cc == 19) {\n\t\t\t\tsIx += 2;\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (d < len) {\n\t\t\t// Decode last 1-3 bytes (incl '=') into 1-3 bytes\n\t\t\tint i = 0;\n\t\t\tfor (int j = 0; sIx <= eIx - pad; j++)\n\t\t\t\ti |= IA[s.charAt(sIx++)] << (18 - j * 6);\n\n\t\t\tfor (int r = 16; d < len; r -= 8)\n\t\t\t\tdArr[d++] = (byte) (i >> r);\n\t\t}\n\n\t\treturn dArr;\n\t}\n\n\t/**\n\t * Encodes a raw byte array into a BASE64 <code>byte[]</code> representation\n\t * i accordance with RFC 2045.\n\t * \n\t * @param sArr\n\t *            The bytes to convert. If <code>null</code> or length 0 an\n\t *            empty array will be returned.\n\t * @param lineSep\n\t *            Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n\t *            No line separator will be in breach of RFC 2045 which\n\t *            specifies max 76 per line but will be a little faster.\n\t * @return A BASE64 encoded array. Never <code>null</code>.\n\t */\n\tpublic final static byte[] encodeToByte(byte[] sArr, boolean lineSep) {\n\t\treturn encodeToByte(sArr, 0, sArr != null ? sArr.length : 0, lineSep);\n\t}\n\n\t// ****************************************************************************************\n\t// * String version\n\t// ****************************************************************************************\n\n\t/**\n\t * Encodes a raw byte array into a BASE64 <code>byte[]</code> representation\n\t * i accordance with RFC 2045.\n\t * \n\t * @param sArr\n\t *            The bytes to convert. If <code>null</code> an empty array will\n\t *            be returned.\n\t * @param sOff\n\t *            The starting position in the bytes to convert.\n\t * @param sLen\n\t *            The number of bytes to convert. If 0 an empty array will be\n\t *            returned.\n\t * @param lineSep\n\t *            Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n\t *            No line separator will be in breach of RFC 2045 which\n\t *            specifies max 76 per line but will be a little faster.\n\t * @return A BASE64 encoded array. Never <code>null</code>.\n\t */\n\tpublic final static byte[] encodeToByte(byte[] sArr, int sOff, int sLen,\n\t\t\tboolean lineSep) {\n\t\t// Check special case\n\t\tif (sArr == null || sLen == 0)\n\t\t\treturn new byte[0];\n\n\t\tint eLen = (sLen / 3) * 3; // Length of even 24-bits.\n\t\tint cCnt = ((sLen - 1) / 3 + 1) << 2; // Returned character count\n\t\tint dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// returned\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// array\n\t\tbyte[] dArr = new byte[dLen];\n\n\t\t// Encode even 24-bits\n\t\tfor (int s = sOff, d = 0, cc = 0; s < sOff + eLen;) {\n\t\t\t// Copy next three bytes into lower 24 bits of int, paying attension\n\t\t\t// to sign.\n\t\t\tint i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8\n\t\t\t\t\t| (sArr[s++] & 0xff);\n\n\t\t\t// Encode the int into four chars\n\t\t\tdArr[d++] = (byte) CA[(i >>> 18) & 0x3f];\n\t\t\tdArr[d++] = (byte) CA[(i >>> 12) & 0x3f];\n\t\t\tdArr[d++] = (byte) CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[d++] = (byte) CA[i & 0x3f];\n\n\t\t\t// Add optional line separator\n\t\t\tif (lineSep && ++cc == 19 && d < dLen - 2) {\n\t\t\t\tdArr[d++] = '\\r';\n\t\t\t\tdArr[d++] = '\\n';\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\t// Pad and encode last bits if source isn't an even 24 bits.\n\t\tint left = sLen - eLen; // 0 - 2.\n\t\tif (left > 0) {\n\t\t\t// Prepare the int\n\t\t\tint i = ((sArr[sOff + eLen] & 0xff) << 10)\n\t\t\t\t\t| (left == 2 ? ((sArr[sOff + sLen - 1] & 0xff) << 2) : 0);\n\n\t\t\t// Set last four chars\n\t\t\tdArr[dLen - 4] = (byte) CA[i >> 12];\n\t\t\tdArr[dLen - 3] = (byte) CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[dLen - 2] = left == 2 ? (byte) CA[i & 0x3f] : (byte) '=';\n\t\t\tdArr[dLen - 1] = '=';\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t/**\n\t * Encodes a raw byte array into a BASE64 <code>char[]</code> representation\n\t * i accordance with RFC 2045.\n\t * \n\t * @param sArr\n\t *            The bytes to convert. If <code>null</code> or length 0 an\n\t *            empty array will be returned.\n\t * @param lineSep\n\t *            Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n\t *            No line separator will be in breach of RFC 2045 which\n\t *            specifies max 76 per line but will be a little faster.\n\t * @return A BASE64 encoded array. Never <code>null</code>.\n\t */\n\tpublic final static char[] encodeToChar(byte[] sArr, boolean lineSep) {\n\t\t// Check special case\n\t\tint sLen = sArr != null ? sArr.length : 0;\n\t\tif (sLen == 0)\n\t\t\treturn new char[0];\n\n\t\tint eLen = (sLen / 3) * 3; // Length of even 24-bits.\n\t\tint cCnt = ((sLen - 1) / 3 + 1) << 2; // Returned character count\n\t\tint dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// returned\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// array\n\t\tchar[] dArr = new char[dLen];\n\n\t\t// Encode even 24-bits\n\t\tfor (int s = 0, d = 0, cc = 0; s < eLen;) {\n\t\t\t// Copy next three bytes into lower 24 bits of int, paying attension\n\t\t\t// to sign.\n\t\t\tint i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8\n\t\t\t\t\t| (sArr[s++] & 0xff);\n\n\t\t\t// Encode the int into four chars\n\t\t\tdArr[d++] = CA[(i >>> 18) & 0x3f];\n\t\t\tdArr[d++] = CA[(i >>> 12) & 0x3f];\n\t\t\tdArr[d++] = CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[d++] = CA[i & 0x3f];\n\n\t\t\t// Add optional line separator\n\t\t\tif (lineSep && ++cc == 19 && d < dLen - 2) {\n\t\t\t\tdArr[d++] = '\\r';\n\t\t\t\tdArr[d++] = '\\n';\n\t\t\t\tcc = 0;\n\t\t\t}\n\t\t}\n\n\t\t// Pad and encode last bits if source isn't even 24 bits.\n\t\tint left = sLen - eLen; // 0 - 2.\n\t\tif (left > 0) {\n\t\t\t// Prepare the int\n\t\t\tint i = ((sArr[eLen] & 0xff) << 10)\n\t\t\t\t\t| (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0);\n\n\t\t\t// Set last four chars\n\t\t\tdArr[dLen - 4] = CA[i >> 12];\n\t\t\tdArr[dLen - 3] = CA[(i >>> 6) & 0x3f];\n\t\t\tdArr[dLen - 2] = left == 2 ? CA[i & 0x3f] : '=';\n\t\t\tdArr[dLen - 1] = '=';\n\t\t}\n\t\treturn dArr;\n\t}\n\n\t/**\n\t * Encodes a raw byte array into a BASE64 <code>String</code> representation\n\t * i accordance with RFC 2045.\n\t * \n\t * @param sArr\n\t *            The bytes to convert. If <code>null</code> or length 0 an\n\t *            empty array will be returned.\n\t * @param lineSep\n\t *            Optional \"\\r\\n\" after 76 characters, unless end of file.<br>\n\t *            No line separator will be in breach of RFC 2045 which\n\t *            specifies max 76 per line but will be a little faster.\n\t * @return A BASE64 encoded array. Never <code>null</code>.\n\t */\n\tpublic final static String encodeToString(byte[] sArr, boolean lineSep) {\n\t\t// Reuse char[] since we can't create a String incrementally anyway and\n\t\t// StringBuffer/Builder would be slower.\n\t\treturn new String(encodeToChar(sArr, lineSep));\n\t}\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[]):byte[]",
          "lineStart" : 110,
          "lineEnd" : 112,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "int", "int" ],
          "visibility" : "public",
          "descriptor" : "+decode(byte[], int, int):byte[]",
          "lineStart" : 129,
          "lineEnd" : 177,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 190,
          "lineEnd" : 241,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):byte[]",
          "lineStart" : 262,
          "lineEnd" : 314,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(byte[]):byte[]",
          "lineStart" : 332,
          "lineEnd" : 390,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(char[]):byte[]",
          "lineStart" : 408,
          "lineEnd" : 466,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decodeFast",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decodeFast(String):byte[]",
          "lineStart" : 484,
          "lineEnd" : 543,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encodeToByte",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToByte(byte[], boolean):byte[]",
          "lineStart" : 558,
          "lineEnd" : 560,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encodeToByte",
          "returnParam" : "byte[]",
          "params" : [ "byte[]", "int", "int", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToByte(byte[], int, int, boolean):byte[]",
          "lineStart" : 584,
          "lineEnd" : 632,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encodeToChar",
          "returnParam" : "char[]",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToChar(byte[], boolean):char[]",
          "lineStart" : 647,
          "lineEnd" : 695,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "encodeToString",
          "returnParam" : "String",
          "params" : [ "byte[]", "boolean" ],
          "visibility" : "public",
          "descriptor" : "+encodeToString(byte[], boolean):String",
          "lineStart" : 710,
          "lineEnd" : 714,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "decodeFast",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decodeFast(char[]):byte[]",
        "lineStart" : 408,
        "lineEnd" : 466,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      } ],
      "failedMethods" : [ {
        "name" : null,
        "returnParam" : null,
        "params" : null,
        "visibility" : null,
        "descriptor" : "encode(byte[]):char[]",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : false
      } ],
      "artifactInfo" : {
        "name" : "Py4J",
        "description" : "Py4J enables Python programs running in a Python interpreter to dynamically access Java objects in a Java Virtual Machine. Methods are called as if the Java objects resided in the Python interpreter and Java collections can be accessed through standard Python collection methods. Py4J also enables Java programs to call back Python objects.",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "2004458f-6355-456a-8c35-7b99f51b39cc" ],
        "_version_" : [ 1521884881326440448 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "true|||", "false|public static final byte[] py4j.Base64.decodeFast(char[])|py4j.Base64.decodeFast([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])|java.lang.AssertionError|actual array was null", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public py4j.Base64()|py4j.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.25,
        "sf_complexity_necf" : 115.0,
        "calledClasses_ckjm_ext_ca_max" : 1.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.5416666666666666,
        "jmh_thrpt_score_sum" : 39137.65310869311,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 0.5,
        "sf_complexity_covered" : 17.0,
        "sf_line_balance" : 6.387096774193548,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 120.92307692307692,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 19.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 30.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 13.0,
        "entryClass_ckjm_ext_loc" : 1587.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 39137.653108693135,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 31.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 120.92307692307688,
        "calledClasses_ckjm_ext_cbo_mean" : 1.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 13.0,
        "calledClasses_ckjm_ext_rfc_sum" : 19.0,
        "sf_instruction_necf" : 1542.0,
        "calledClasses_ckjm_ext_npm_sum" : 12.0,
        "calledClasses_ckjm_ext_loc_geomean" : 1587.0000000000005,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 30.0,
        "calledClasses_ckjm_ext_loc_min" : 1587.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 1542.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 18.999999999999996,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 5.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 229.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 10.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 13.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.25,
        "sf_line_leanmetric" : 31.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.25,
        "calledClasses_ckjm_ext_lcom_sum" : 30.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 30.000000000000004,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 98.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 1.0,
        "calledClasses_ckjm_ext_loc_sum" : 1587.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.25,
        "calledClasses_ckjm_ext_lcom3_max" : 0.5416666666666666,
        "entryClass_ckjm_ext_amc" : 120.92307692307692,
        "sf_method_sf" : 10.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 120.92307692307692,
        "calledClasses_ckjm_ext_npm_max" : 12.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 1.0,
        "calledClasses_ckjm_ext_ca_sum" : 1.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 6.073394495412844,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.25,
        "jmh_thrpt_score_quadmean" : 39137.65310869311,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 17.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 30.0,
        "sf_line_total" : 229.0,
        "entryClass_ckjm_ext_lcom" : 30.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 218.0,
        "sf_line_sf" : 198.0,
        "hashCodeCloneCountGlobal" : 3.0,
        "luceneScore" : 6.320479393005371,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 12.0,
        "sf_instruction_covered" : 218.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 19.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.5416666666666666,
        "entryClass_ckjm_ext_lcom3" : 0.5416666666666666,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 1.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 1.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 98.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 1587.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 218.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 12.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 1.0,
        "calledClasses_ckjm_ext_amc_max" : 120.92307692307692,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 1.0,
        "calledClasses_ckjm_ext_lcom_min" : 30.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 2.0,
        "fs_unique" : 0.5,
        "calledClasses_ckjm_ext_amc_quadmean" : 120.92307692307692,
        "jmh_thrpt_score_mean" : 39137.65310869311,
        "sf_line_missed" : 198.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 17.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 1.0,
        "sf_line_leanness" : 0.13537117903930132,
        "calledUncalledMethodRatio" : 0.23076923076923078,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 1324.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 1587.0,
        "calledClasses_ckjm_ext_wmc_mean" : 13.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 3.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.25,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.5416666666666666,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.25,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 12.0,
        "sf_line_nf" : 31.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 1324.0,
        "sf_method_covered" : 2.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.5416666666666666,
        "sf_complexity_leanness" : 0.14782608695652175,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 12.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 115.0,
        "noCalledMethods" : 3.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 5.764705882352941,
        "calledClasses_ckjm_ext_npm_min" : 12.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.14137483787289234,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.16666666666666666,
        "calledClasses_ckjm_ext_lcom3_min" : 0.5416666666666666,
        "calledClasses_ckjm_ext_wmc_max" : 13.0,
        "calledClasses_ckjm_ext_rfc_mean" : 19.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 10.0,
        "sf_method_nf" : 2.0,
        "calledClasses_ckjm_ext_npm_geomean" : 12.0,
        "calledClasses_ckjm_ext_amc_min" : 120.92307692307692,
        "calledClasses_ckjm_ext_wmc_sum" : 13.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 19.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 1587.0,
        "calledClasses_ckjm_ext_ca_mean" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 12.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 19.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 39137.65310869311,
        "entryClass_ckjm_ext_wmc" : 13.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 27.0,
        "SINGLE_SMOOP_po" : 13.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "py4j.Base64",
      "uri" : "net.sf.py4j:py4j:0.9"
    }, {
      "id" : "59c912bf-b0ae-4013-983e-f56dc8acfc83",
      "groupId" : "org.imixs.workflow",
      "artifactId" : "imixs-workflow-core",
      "version" : "3.4.4",
      "name" : "Base64",
      "packagename" : "org.imixs.workflow.util",
      "score" : 6.4814553,
      "hash" : "86373cea4a9b21683fd27d26c39b5b53",
      "content" : "package org.imixs.workflow.util;\n\n//////////////////////license & copyright header/////////////////////////\n////\n//Base64 - encode/decode data using the Base64 encoding scheme     //\n////\n//Copyright (c) 1998 by Kevin Kelley                   //\n////\n//This library is free software; you can redistribute it and/or       //\n//modify it under the terms of the GNU Lesser General Public          //\n//License as published by the Free Software Foundation; either        //\n//version 2.1 of the License, or (at your option) any later version.  //\n////\n//This library is distributed in the hope that it will be useful,     //\n//but WITHOUT ANY WARRANTY; without even the implied warranty of      //\n//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       //\n//GNU Lesser General Public License for more details.                 //\n////\n//You should have received a copy of the GNU Lesser General Public    //\n//License along with this library; if not, write to the Free Software //\n//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA           //\n//02111-1307, USA, or contact the author:                             //\n////\n//Kevin Kelley <kelley@ruralnet.net> - 30718 Rd. 28, La Junta, CO,    //\n//81050  USA.                                                         //\n////\n////////////////////end license & copyright header///////////////////////\n\nimport java.io.*; // needed only for main() method.\n\n/**\n * Provides encoding of raw bytes to base64-encoded characters, and decoding of\n * base64 characters to raw bytes.\n * \n * @author Kevin Kelley (kelley@ruralnet.net)\n * @version 1.3 date 06 August 1998 modified 14 February 2000 modified 22\n *          September 2000\n */\npublic class Base64 {\n\n\t/**\n\t * returns an array of base64-encoded characters to represent the passed\n\t * data array.\n\t * \n\t * @param data\n\t *            the array of bytes to encode\n\t * @return base64-coded character array.\n\t */\n\tstatic public char[] encode(byte[] data) {\n\t\tchar[] out = new char[((data.length + 2) / 3) * 4];\n\n\t\t//\n\t\t// 3 bytes encode to 4 chars. Output is always an even\n\t\t// multiple of 4 characters.\n\t\t//\n\t\tfor (int i = 0, index = 0; i < data.length; i += 3, index += 4) {\n\t\t\tboolean quad = false;\n\t\t\tboolean trip = false;\n\n\t\t\tint val = (0xFF & (int) data[i]);\n\t\t\tval <<= 8;\n\t\t\tif ((i + 1) < data.length) {\n\t\t\t\tval |= (0xFF & (int) data[i + 1]);\n\t\t\t\ttrip = true;\n\t\t\t}\n\t\t\tval <<= 8;\n\t\t\tif ((i + 2) < data.length) {\n\t\t\t\tval |= (0xFF & (int) data[i + 2]);\n\t\t\t\tquad = true;\n\t\t\t}\n\t\t\tout[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];\n\t\t\tval >>= 6;\n\t\t\tout[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];\n\t\t\tval >>= 6;\n\t\t\tout[index + 1] = alphabet[val & 0x3F];\n\t\t\tval >>= 6;\n\t\t\tout[index + 0] = alphabet[val & 0x3F];\n\t\t}\n\t\treturn out;\n\t}\n\n\t/**\n\t * Decodes a BASE-64 encoded stream to recover the original data. White\n\t * space before and after will be trimmed away, but no other manipulation of\n\t * the input will be performed.\n\t * \n\t * As of version 1.2 this method will properly handle input containing junk\n\t * characters (newlines and the like) rather than throwing an error. It does\n\t * this by pre-parsing the input and generating from that a count of VALID\n\t * input characters.\n\t **/\n\tstatic public byte[] decode(char[] data) {\n\t\t// as our input could contain non-BASE64 data (newlines,\n\t\t// whitespace of any sort, whatever) we must first adjust\n\t\t// our count of USABLE data so that...\n\t\t// (a) we don't misallocate the output array, and\n\t\t// (b) think that we miscalculated our data length\n\t\t// just because of extraneous throw-away junk\n\n\t\tint tempLen = data.length;\n\t\tfor (int ix = 0; ix < data.length; ix++) {\n\t\t\tif ((data[ix] > 255) || codes[data[ix]] < 0)\n\t\t\t\t--tempLen; // ignore non-valid chars and padding\n\t\t}\n\t\t// calculate required length:\n\t\t// -- 3 bytes for every 4 valid base64 chars\n\t\t// -- plus 2 bytes if there are 3 extra base64 chars,\n\t\t// or plus 1 byte if there are 2 extra.\n\n\t\tint len = (tempLen / 4) * 3;\n\t\tif ((tempLen % 4) == 3)\n\t\t\tlen += 2;\n\t\tif ((tempLen % 4) == 2)\n\t\t\tlen += 1;\n\n\t\tbyte[] out = new byte[len];\n\n\t\tint shift = 0; // # of excess bits stored in accum\n\t\tint accum = 0; // excess bits\n\t\tint index = 0;\n\n\t\t// we now go through the entire array (NOT using the 'tempLen' value)\n\t\tfor (int ix = 0; ix < data.length; ix++) {\n\t\t\tint value = (data[ix] > 255) ? -1 : codes[data[ix]];\n\n\t\t\tif (value >= 0) // skip over non-code\n\t\t\t{\n\t\t\t\taccum <<= 6; // bits shift up by 6 each time thru\n\t\t\t\tshift += 6; // loop, with new bits being put in\n\t\t\t\taccum |= value; // at the bottom.\n\t\t\t\tif (shift >= 8) // whenever there are 8 or more shifted in,\n\t\t\t\t{\n\t\t\t\t\tshift -= 8; // write them out (from the top, leaving any\n\t\t\t\t\tout[index++] = // excess at the bottom for next iteration.\n\t\t\t\t\t(byte) ((accum >> shift) & 0xff);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// we will also have skipped processing a padding null byte ('=')\n\t\t\t// here;\n\t\t\t// these are used ONLY for padding to an even length and do not\n\t\t\t// legally\n\t\t\t// occur as encoded data. for this reason we can ignore the fact\n\t\t\t// that\n\t\t\t// no index++ operation occurs in that special case: the out[] array\n\t\t\t// is\n\t\t\t// initialized to all-zero bytes to start with and that works to our\n\t\t\t// advantage in this combination.\n\t\t}\n\n\t\t// if there is STILL something wrong we just have to throw up now!\n\t\tif (index != out.length) {\n\t\t\tthrow new Error(\"Miscalculated data length (wrote \" + index\n\t\t\t\t\t+ \" instead of \" + out.length + \")\");\n\t\t}\n\n\t\treturn out;\n\t}\n\n\t//\n\t// code characters for values 0..63\n\t//\n\tstatic private char[] alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"\n\t\t\t.toCharArray();\n\n\t//\n\t// lookup table for converting base64 characters to value in range 0..63\n\t//\n\tstatic private byte[] codes = new byte[256];\n\tstatic {\n\t\tfor (int i = 0; i < 256; i++)\n\t\t\tcodes[i] = -1;\n\t\tfor (int i = 'A'; i <= 'Z'; i++)\n\t\t\tcodes[i] = (byte) (i - 'A');\n\t\tfor (int i = 'a'; i <= 'z'; i++)\n\t\t\tcodes[i] = (byte) (26 + i - 'a');\n\t\tfor (int i = '0'; i <= '9'; i++)\n\t\t\tcodes[i] = (byte) (52 + i - '0');\n\t\tcodes['+'] = 62;\n\t\tcodes['/'] = 63;\n\t}\n\n\t// /////////////////////////////////////////////////\n\t// remainder (main method and helper functions) is\n\t// for testing purposes only, feel free to clip it.\n\t// /////////////////////////////////////////////////\n\n\tpublic static void main(String[] args) {\n\t\tboolean decode = false;\n\n\t\tif (args.length == 0) {\n\t\t\tSystem.out.println(\"usage:  java Base64 [-d[ecode]] filename\");\n\t\t\tSystem.exit(0);\n\t\t}\n\t\tfor (int i = 0; i < args.length; i++) {\n\t\t\tif (\"-decode\".equalsIgnoreCase(args[i]))\n\t\t\t\tdecode = true;\n\t\t\telse if (\"-d\".equalsIgnoreCase(args[i]))\n\t\t\t\tdecode = true;\n\t\t}\n\n\t\tString filename = args[args.length - 1];\n\t\tFile file = new File(filename);\n\t\tif (!file.exists()) {\n\t\t\tSystem.out\n\t\t\t\t\t.println(\"Error:  file '\" + filename + \"' doesn't exist!\");\n\t\t\tSystem.exit(0);\n\t\t}\n\n\t\tif (decode) {\n\t\t\tchar[] encoded = readChars(file);\n\t\t\tbyte[] decoded = decode(encoded);\n\t\t\twriteBytes(file, decoded);\n\t\t} else {\n\t\t\tbyte[] decoded = readBytes(file);\n\t\t\tchar[] encoded = encode(decoded);\n\t\t\twriteChars(file, encoded);\n\t\t}\n\t}\n\n\tprivate static byte[] readBytes(File file) {\n\t\tByteArrayOutputStream baos = new ByteArrayOutputStream();\n\t\ttry {\n\t\t\tInputStream fis = new FileInputStream(file);\n\t\t\tInputStream is = new BufferedInputStream(fis);\n\t\t\tint count = 0;\n\t\t\tbyte[] buf = new byte[16384];\n\t\t\twhile ((count = is.read(buf)) != -1) {\n\t\t\t\tif (count > 0)\n\t\t\t\t\tbaos.write(buf, 0, count);\n\t\t\t}\n\t\t\tis.close();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\treturn baos.toByteArray();\n\t}\n\n\tprivate static char[] readChars(File file) {\n\t\tCharArrayWriter caw = new CharArrayWriter();\n\t\ttry {\n\t\t\tReader fr = new FileReader(file);\n\t\t\tReader in = new BufferedReader(fr);\n\t\t\tint count = 0;\n\t\t\tchar[] buf = new char[16384];\n\t\t\twhile ((count = in.read(buf)) != -1) {\n\t\t\t\tif (count > 0)\n\t\t\t\t\tcaw.write(buf, 0, count);\n\t\t\t}\n\t\t\tin.close();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\treturn caw.toCharArray();\n\t}\n\n\tprivate static void writeBytes(File file, byte[] data) {\n\t\ttry {\n\t\t\tOutputStream fos = new FileOutputStream(file);\n\t\t\tOutputStream os = new BufferedOutputStream(fos);\n\t\t\tos.write(data);\n\t\t\tos.close();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\tprivate static void writeChars(File file, char[] data) {\n\t\ttry {\n\t\t\tWriter fos = new FileWriter(file);\n\t\t\tWriter os = new BufferedWriter(fos);\n\t\t\tos.write(data);\n\t\t\tos.close();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n}\n",
      "methods" : {
        "Base64" : [ {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 49,
          "lineEnd" : 80,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 92,
          "lineEnd" : 157,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "main",
          "returnParam" : "void",
          "params" : [ "String[]" ],
          "visibility" : "public",
          "descriptor" : "+main(String[]):void",
          "lineStart" : 187,
          "lineEnd" : 218,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "readBytes",
          "returnParam" : "byte[]",
          "params" : [ "File" ],
          "visibility" : "private",
          "descriptor" : "-readBytes(File):byte[]",
          "lineStart" : 220,
          "lineEnd" : 237,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "readChars",
          "returnParam" : "char[]",
          "params" : [ "File" ],
          "visibility" : "private",
          "descriptor" : "-readChars(File):char[]",
          "lineStart" : 239,
          "lineEnd" : 256,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "writeBytes",
          "returnParam" : "void",
          "params" : [ "File", "byte[]" ],
          "visibility" : "private",
          "descriptor" : "-writeBytes(File, byte[]):void",
          "lineStart" : 258,
          "lineEnd" : 267,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        }, {
          "name" : "writeChars",
          "returnParam" : "void",
          "params" : [ "File", "char[]" ],
          "visibility" : "private",
          "descriptor" : "-writeChars(File, char[]):void",
          "lineStart" : 269,
          "lineEnd" : 278,
          "columnStart" : 9,
          "columnEnd" : 9,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 49,
        "lineEnd" : 80,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 92,
        "lineEnd" : 157,
        "columnStart" : 9,
        "columnEnd" : 9,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "Core API",
        "description" : "Imixs-Workflow Core provides the platform for an open and standardized workflow technology. \nImixs-Workflow Core provides various components in a Java framework that allow to create, control \n\t\tand monitor process-oriented business tasks.",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "9dc89cf5-8310-426b-b22e-54b43ecdd22a" ],
        "_version_" : [ 1521884749225787392 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] org.imixs.workflow.util.Base64.encode(byte[])|org.imixs.workflow.util.Base64.encode([B)[C|[0]", "false|public static byte[] org.imixs.workflow.util.Base64.decode(char[])|org.imixs.workflow.util.Base64.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public org.imixs.workflow.util.Base64()|org.imixs.workflow.util.Base64.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.25,
        "sf_complexity_necf" : 33.0,
        "calledClasses_ckjm_ext_ca_max" : 1.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.75,
        "jmh_thrpt_score_sum" : 223435.8997402092,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 18.0,
        "sf_line_balance" : 1.3829787234042554,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 60.55555555555556,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "entryClass_ckjm_ext_rfc" : 44.0,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 32.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 9.000000000000002,
        "entryClass_ckjm_ext_loc" : 556.0,
        "sf_method_error_prop" : 0.0,
        "jmh_thrpt_score_geomean" : 223435.8997402091,
        "calledUncalledMethodRatioJava" : 1.0,
        "sf_line_covered" : 47.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 60.555555555555564,
        "calledClasses_ckjm_ext_cbo_mean" : 1.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_wmc_min" : 9.0,
        "calledClasses_ckjm_ext_rfc_sum" : 44.0,
        "sf_instruction_necf" : 473.0,
        "calledClasses_ckjm_ext_npm_sum" : 4.0,
        "calledClasses_ckjm_ext_loc_geomean" : 556.0,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 32.0,
        "calledClasses_ckjm_ext_loc_min" : 556.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 473.0,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 43.99999999999999,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 1.6666666666666667,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 112.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "noUncalledMethods" : 5.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 9.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.25,
        "sf_line_leanmetric" : 47.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.25,
        "calledClasses_ckjm_ext_lcom_sum" : 32.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 32.0,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "sf_complexity_sf" : 15.0,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 1.0,
        "calledClasses_ckjm_ext_loc_sum" : 556.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_cam_min" : 0.25,
        "calledClasses_ckjm_ext_lcom3_max" : 0.75,
        "entryClass_ckjm_ext_amc" : 60.55555555555556,
        "sf_method_sf" : 5.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 60.55555555555556,
        "calledClasses_ckjm_ext_npm_max" : 4.0,
        "calledClasses_ckjm_ext_ce_sum" : 0.0,
        "calledClasses_ckjm_ext_cbo_min" : 1.0,
        "calledClasses_ckjm_ext_ca_sum" : 1.0,
        "entryClass_ckjm_ext_dit" : 1.0,
        "sf_instruction_balance" : 0.8122605363984674,
        "calledClasses_ckjm_ext_dam_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_N" : 1.0,
        "entryClass_ckjm_ext_cam" : 0.25,
        "jmh_thrpt_score_quadmean" : 223435.8997402092,
        "calledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_dit_min" : 1.0,
        "sf_complexity_leanmetric" : 18.0,
        "calledClasses_ckjm_ext_lcom_quadmean" : 32.0,
        "sf_line_total" : 112.0,
        "entryClass_ckjm_ext_lcom" : 32.0,
        "calledClasses_ckjm_ext_moa_sum" : 0.0,
        "calledClasses_ckjm_ext_amc_N" : 1.0,
        "calledClasses_ckjm_ext_ce_max" : 0.0,
        "sf_instruction_nf" : 261.0,
        "sf_line_sf" : 65.0,
        "hashCodeCloneCountGlobal" : 5.0,
        "luceneScore" : 6.481455326080322,
        "noCalledMethodsJava" : 1.0,
        "calledClasses_ckjm_ext_dam_quadmean" : 1.0,
        "calledClasses_ckjm_ext_moa_max" : 0.0,
        "calledClasses_ckjm_ext_loc_safe" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_N" : 1.0,
        "calledClasses_ckjm_ext_ce_geomean" : 0.0,
        "calledClasses_ckjm_ext_npm_safe" : 1.0,
        "sf_method_total" : 8.0,
        "sf_instruction_covered" : 261.0,
        "calledClasses_ckjm_ext_dit_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_max" : 44.0,
        "entryClass_ckjm_ext_dit_estimated" : 0.0,
        "calledClasses_ckjm_ext_lcom3_quadmean" : 0.75,
        "entryClass_ckjm_ext_lcom3" : 0.75,
        "calledClasses_ckjm_ext_dit_quadmean" : 1.0,
        "calledClasses_ckjm_ext_ca_min" : 1.0,
        "calledClasses_ckjm_ext_noc_min" : 0.0,
        "sf_method_error_size_class" : 0.0,
        "calledClasses_ckjm_ext_mfa_max" : 0.0,
        "calledClasses_ckjm_ext_ca_geomean" : 1.0,
        "calledClasses_ckjm_ext_dam_sum" : 1.0,
        "sf_complexity_missed" : 15.0,
        "calledClasses_ckjm_ext_mfa_sum" : 0.0,
        "calledClasses_ckjm_ext_loc_max" : 556.0,
        "calledClasses_ckjm_ext_mfa_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_N" : 1.0,
        "sf_instruction_leanmetric" : 261.0,
        "calledClasses_ckjm_ext_cbm_sum" : 0.0,
        "calledClasses_ckjm_ext_moa_quadmean" : 0.0,
        "calledClasses_ckjm_ext_ce_quadmean" : 0.0,
        "calledClasses_ckjm_ext_npm_quadmean" : 4.0,
        "calledClasses_ckjm_ext_dit_estimated_max" : 0.0,
        "calledClasses_numberOfClasses" : 1.0,
        "calledClasses_ckjm_ext_cbo_sum" : 1.0,
        "calledClasses_ckjm_ext_amc_max" : 60.55555555555556,
        "calledClasses_ckjm_ext_noc_safe" : 1.0,
        "entryClass_ckjm_ext_ca" : 1.0,
        "calledClasses_ckjm_ext_lcom_min" : 32.0,
        "entryClass_ckjm_ext_ce" : 0.0,
        "calledClasses_ckjm_ext_npm_N" : 1.0,
        "sf_method_leanmetric" : 3.0,
        "fs_unique" : 1.0,
        "calledClasses_ckjm_ext_amc_quadmean" : 60.55555555555556,
        "jmh_thrpt_score_mean" : 223435.8997402092,
        "sf_line_missed" : 65.0,
        "calledClasses_ckjm_ext_dit_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_quadmean" : 1.0,
        "calledClasses_ckjm_ext_cbm_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_quadmean" : 0.0,
        "sf_complexity_nf" : 18.0,
        "calledClasses_ckjm_ext_ca_quadmean" : 1.0,
        "sf_line_leanness" : 0.41964285714285715,
        "calledUncalledMethodRatio" : 0.4444444444444444,
        "calledClasses_ckjm_ext_cbo_N" : 1.0,
        "sf_instruction_missed" : 212.0,
        "calledClasses_ckjm_ext_noc_quadmean" : 0.0,
        "calledClasses_ckjm_ext_loc_mean" : 556.0,
        "calledClasses_ckjm_ext_wmc_mean" : 9.0,
        "sf_method_error_size" : 0.0,
        "hashCodeCloneCountLocal" : 5.0,
        "calledClasses_ckjm_ext_dam_max" : 1.0,
        "calledClasses_ckjm_ext_wmc_safe" : 1.0,
        "calledClasses_ckjm_ext_cam_max" : 0.25,
        "calledClasses_ckjm_ext_lcom3_sum" : 0.75,
        "calledClasses_ckjm_ext_cam_quadmean" : 0.25,
        "calledClasses_ckjm_ext_ca_safe" : 1.0,
        "calledClasses_ckjm_ext_npm_mean" : 4.0,
        "sf_line_nf" : 47.0,
        "calledClasses_ckjm_ext_mfa_geomean" : 0.0,
        "sf_instruction_sf" : 212.0,
        "sf_method_covered" : 3.0,
        "calledClasses_ckjm_ext_loc_N" : 1.0,
        "calledClasses_ckjm_ext_cbo_geomean" : 1.0,
        "calledClasses_ckjm_ext_ce_mean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_geomean" : 0.75,
        "sf_complexity_leanness" : 0.5454545454545454,
        "calledClasses_ckjm_ext_noc_mean" : 0.0,
        "calledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_cbo_max" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_safe" : 1.0,
        "sf_method_necf" : 8.0,
        "calledClasses_ckjm_ext_dit_geomean" : 1.0,
        "calledClasses_ckjm_ext_cbm_max" : 0.0,
        "sf_complexity_total" : 33.0,
        "noCalledMethods" : 4.0,
        "calledClasses_ckjm_ext_dam_mean" : 1.0,
        "sf_complexity_balance" : 0.8333333333333334,
        "calledClasses_ckjm_ext_npm_min" : 4.0,
        "calledClasses_ckjm_ext_ce_safe" : 1.0,
        "sf_instruction_leanness" : 0.5517970401691332,
        "calledClasses_ckjm_ext_dit_mean" : 1.0,
        "sf_method_leanness" : 0.375,
        "calledClasses_ckjm_ext_lcom3_min" : 0.75,
        "calledClasses_ckjm_ext_wmc_max" : 9.0,
        "calledClasses_ckjm_ext_rfc_mean" : 44.0,
        "calledClasses_ckjm_ext_dit_max" : 1.0,
        "calledClasses_ckjm_ext_mfa_safe" : 1.0,
        "entryClass_ckjm_ext_noc" : 0.0,
        "entryClass_ckjm_ext_moa" : 0.0,
        "noUncalledMethodsJava" : 0.0,
        "sf_method_missed" : 5.0,
        "sf_method_nf" : 3.0,
        "calledClasses_ckjm_ext_npm_geomean" : 4.0,
        "calledClasses_ckjm_ext_amc_min" : 60.55555555555556,
        "calledClasses_ckjm_ext_wmc_sum" : 9.0,
        "calledClasses_ckjm_ext_rfc_quadmean" : 44.0,
        "calledClasses_ckjm_ext_loc_quadmean" : 556.0,
        "calledClasses_ckjm_ext_ca_mean" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "entryClass_ckjm_ext_npm" : 4.0,
        "projectDepsResolved" : 0.0,
        "calledClasses_ckjm_ext_cam_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_min" : 44.0,
        "calledClasses_ckjm_ext_ce_min" : 0.0,
        "projectDeps" : 0.0,
        "jmh_thrpt_score_0" : 223435.8997402092,
        "entryClass_ckjm_ext_wmc" : 9.0
      },
      "ranking" : {
        "SINGLE_SMOOP" : 24.0,
        "SINGLE_SMOOP_po" : 11.0
      },
      "safeRankingCriteria" : {
        "SINGLE_SMOOP" : true
      },
      "normalizedMeasures" : { },
      "fqname" : "org.imixs.workflow.util.Base64",
      "uri" : "org.imixs.workflow:imixs-workflow-core:3.4.4"
    }, {
      "id" : "72ef6ebf-6831-42f0-9f16-2284d589c93e",
      "groupId" : "org",
      "artifactId" : "jaudiotagger",
      "version" : "2.0.3",
      "name" : "Base64Coder",
      "packagename" : "org.jaudiotagger.tag.vorbiscomment.util",
      "score" : 2.74929,
      "hash" : "1a7b2b793cae8ba156df7c800022eb74",
      "content" : "package org.jaudiotagger.tag.vorbiscomment.util;\n\nimport org.jaudiotagger.audio.generic.Utils;\n\n/**\n * Base64Coder\n */\npublic class Base64Coder\n{\n    // Mapping table from 6-bit nibbles to Base64 characters.\n    private static final char[] map1 = new char[64];\n\n    static\n    {\n        int i = 0;\n        for (char c = 'A'; c <= 'Z'; c++)\n        {\n            map1[i++] = c;\n        }\n        for (char c = 'a'; c <= 'z'; c++)\n        {\n            map1[i++] = c;\n        }\n        for (char c = '0'; c <= '9'; c++)\n        {\n            map1[i++] = c;\n        }\n        map1[i++] = '+';\n        map1[i++] = '/';\n    }\n\n    // Mapping table from Base64 characters to 6-bit nibbles.\n    private static final byte[] map2 = new byte[128];\n\n    static\n    {\n        for (int i = 0; i < map2.length; i++)\n        {\n            map2[i] = -1;\n        }\n        for (int i = 0; i < 64; i++)\n        {\n            map2[map1[i]] = (byte) i;\n        }\n    }\n\n    /**\n     * Encodes a string into Base64 format.\n     * No blanks or line breaks are inserted.\n     *\n     * @param s a String to be encoded.\n     * @return A String with the Base64 encoded data.\n     */\n    public static String encode(final String s)\n    {\n        return new String(encode(Utils.getDefaultBytes(s, \"ISO-8859-1\")));\n    }\n\n    /**\n     * Encodes a byte array into Base64 format.\n     * No blanks or line breaks are inserted.\n     *\n     * @param in an array containing the data bytes to be encoded.\n     * @return A character array with the Base64 encoded data.\n     */\n    public static char[] encode(final byte[] in)\n    {\n        final int iLen = in.length;\n        final int oDataLen = (iLen * 4 + 2) / 3;       // output length without padding\n        final int oLen = ((iLen + 2) / 3) * 4;         // output length including padding\n        final char[] out = new char[oLen];\n        int ip = 0;\n        int op = 0;\n        while (ip < iLen)\n        {\n            final int i0 = in[ip++] & 0xff;\n            final int i1 = ip < iLen ? in[ip++] & 0xff : 0;\n            final int i2 = ip < iLen ? in[ip++] & 0xff : 0;\n            final int o0 = i0 >>> 2;\n            final int o1 = ((i0 & 3) << 4) | (i1 >>> 4);\n            final int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);\n            final int o3 = i2 & 0x3F;\n            out[op++] = map1[o0];\n            out[op++] = map1[o1];\n            out[op] = op < oDataLen ? map1[o2] : '=';\n            op++;\n            out[op] = op < oDataLen ? map1[o3] : '=';\n            op++;\n        }\n        return out;\n    }\n\n    /**\n     * Decodes a Base64 string.\n     *\n     * @param s a Base64 String to be decoded.\n     * @return An array containing the decoded data bytes.\n     * @throws IllegalArgumentException if the input is not valid Base64 encoded data.\n     */\n    public static byte[] decode(final String s)\n    {\n        return decode(s.toCharArray());\n    }\n\n    /**\n     * Decodes Base64 data.\n     * No blanks or line breaks are allowed within the Base64 encoded data.\n     *\n     * @param in a character array containing the Base64 encoded data.\n     * @return An array containing the decoded data bytes.\n     * @throws IllegalArgumentException if the input is not valid Base64 encoded data.\n     */\n    public static byte[] decode(final char[] in)\n    {\n        int iLen = in.length;\n        if (iLen % 4 != 0)\n        {\n            throw new IllegalArgumentException(\"Length of Base64 encoded input string is not a multiple of 4.\");\n        }\n        while (iLen > 0 && in[iLen - 1] == '=')\n        {\n            iLen--;\n        }\n        final int oLen = (iLen * 3) / 4;\n        final byte[] out = new byte[oLen];\n        int ip = 0;\n        int op = 0;\n        while (ip < iLen)\n        {\n            final int i0 = in[ip++];\n            final int i1 = in[ip++];\n            final int i2 = ip < iLen ? in[ip++] : 'A';\n            final int i3 = ip < iLen ? in[ip++] : 'A';\n            if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)\n            {\n                throw new IllegalArgumentException(\"Illegal character in Base64 encoded data.\");\n            }\n            final int b0 = map2[i0];\n            final int b1 = map2[i1];\n            final int b2 = map2[i2];\n            final int b3 = map2[i3];\n            if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)\n            {\n                throw new IllegalArgumentException(\"Illegal character in Base64 encoded data.\");\n            }\n            final int o0 = (b0 << 2) | (b1 >>> 4);\n            final int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2);\n            final int o2 = ((b2 & 3) << 6) | b3;\n            out[op++] = (byte) o0;\n            if (op < oLen)\n            {\n                out[op++] = (byte) o1;\n            }\n            if (op < oLen)\n            {\n                out[op++] = (byte) o2;\n            }\n        }\n        return out;\n    }\n}\n",
      "methods" : {
        "Base64Coder" : [ {
          "name" : "encode",
          "returnParam" : "String",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+encode(String):String",
          "lineStart" : 54,
          "lineEnd" : 57,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "encode",
          "returnParam" : "char[]",
          "params" : [ "byte[]" ],
          "visibility" : "public",
          "descriptor" : "+encode(byte[]):char[]",
          "lineStart" : 66,
          "lineEnd" : 91,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "String" ],
          "visibility" : "public",
          "descriptor" : "+decode(String):byte[]",
          "lineStart" : 100,
          "lineEnd" : 103,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        }, {
          "name" : "decode",
          "returnParam" : "byte[]",
          "params" : [ "char[]" ],
          "visibility" : "public",
          "descriptor" : "+decode(char[]):byte[]",
          "lineStart" : 113,
          "lineEnd" : 160,
          "columnStart" : 5,
          "columnEnd" : 5,
          "initializer" : false
        } ]
      },
      "successMethods" : [ {
        "name" : "Base64Coder",
        "returnParam" : null,
        "params" : null,
        "visibility" : "public",
        "descriptor" : "+Base64Coder()",
        "lineStart" : 0,
        "lineEnd" : 0,
        "columnStart" : 0,
        "columnEnd" : 0,
        "initializer" : true
      }, {
        "name" : "encode",
        "returnParam" : "char[]",
        "params" : [ "byte[]" ],
        "visibility" : "public",
        "descriptor" : "+encode(byte[]):char[]",
        "lineStart" : 66,
        "lineEnd" : 91,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      }, {
        "name" : "decode",
        "returnParam" : "byte[]",
        "params" : [ "char[]" ],
        "visibility" : "public",
        "descriptor" : "+decode(char[]):byte[]",
        "lineStart" : 113,
        "lineEnd" : 160,
        "columnStart" : 5,
        "columnEnd" : 5,
        "initializer" : false
      } ],
      "failedMethods" : null,
      "artifactInfo" : {
        "name" : "jaudiotagger",
        "description" : "The aim of this project is to provide a world class Java library\n    for editing tag information in audio files.\n    Most existing solutions are not java based inhibiting the use of\n    java applications with digital files.",
        "repository" : "central",
        "remoteUrl" : null,
        "sourcesExist" : true,
        "javaDocExists" : true
      },
      "values" : {
        "id" : [ "42083210-a48f-4e50-a2bc-d50f1235d18c" ],
        "_version_" : [ 1521887046840352768 ],
        "testContent" : [ [ "package com.merobase.adapter;\n\nimport org.junit.*;\nimport static org.junit.Assert.*;\npublic class Base64Test {\n\n    @Test\n    public void test_rfc4648() throws Exception {\n        Base64 base64 = new Base64();\n        \n        assertArrayEquals(chars(\"\"), (char[]) base64.encode(bytes(\"\")));\n        assertArrayEquals(chars(\"Zg==\"), (char[]) base64.encode(bytes(\"f\")));\n        assertArrayEquals(chars(\"Zm8=\"), (char[]) base64.encode(bytes(\"fo\")));\n        assertArrayEquals(chars(\"Zm9v\"), (char[]) base64.encode(bytes(\"foo\")));\n        assertArrayEquals(chars(\"Zm9vYg==\"), (char[]) base64.encode(bytes(\"foob\")));\n        assertArrayEquals(chars(\"Zm9vYmE=\"), (char[]) base64.encode(bytes(\"fooba\")));\n        assertArrayEquals(chars(\"Zm9vYmFy\"), (char[]) base64.encode(bytes(\"foobar\")));\n\n        assertArrayEquals(bytes(\"\"), (byte[]) base64.decode(chars(\"\")));\n        assertArrayEquals(bytes(\"f\"), (byte[]) base64.decode(chars(\"Zg==\")));\n        assertArrayEquals(bytes(\"fo\"), (byte[]) base64.decode(chars(\"Zm8=\")));\n        assertArrayEquals(bytes(\"foo\"), (byte[]) base64.decode(chars(\"Zm9v\")));\n        assertArrayEquals(bytes(\"foob\"), (byte[]) base64.decode(chars(\"Zm9vYg==\")));\n        assertArrayEquals(bytes(\"fooba\"), (byte[]) base64.decode(chars(\"Zm9vYmE=\")));\n        assertArrayEquals(bytes(\"foobar\"), (byte[]) base64.decode(chars(\"Zm9vYmFy\")));\n    }\n\n    protected byte[] bytes(String s) throws Exception {\n        return s.getBytes(\"ASCII\");\n    }\n\n    protected char[] chars(String s) throws Exception {\n        return s.toCharArray();\n    }\n}" ] ],
        "method" : [ [ "false|public static char[] org.jaudiotagger.tag.vorbiscomment.util.Base64Coder.encode(byte[])|org.jaudiotagger.tag.vorbiscomment.util.Base64Coder.encode([B)[C|[0]", "false|public static byte[] org.jaudiotagger.tag.vorbiscomment.util.Base64Coder.decode(char[])|org.jaudiotagger.tag.vorbiscomment.util.Base64Coder.decode([C)[B|[0]" ] ],
        "assertion" : [ [ "1|11|0|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "2|12|1|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "3|13|2|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "4|14|3|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "5|15|4|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "6|16|5|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "7|17|6|public static void org.junit.Assert.assertArrayEquals(char[], char[])||", "8|19|7|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "9|20|8|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "10|21|9|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "11|22|10|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "12|23|11|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "13|24|12|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||", "14|25|13|public static void org.junit.Assert.assertArrayEquals(byte[], byte[])||" ] ],
        "constructor" : [ [ "false|public org.jaudiotagger.tag.vorbiscomment.util.Base64Coder()|org.jaudiotagger.tag.vorbiscomment.util.Base64Coder.<init>()V|" ] ]
      },
      "metrics" : {
        "calledClasses_ckjm_ext_dam_N" : 1.0,
        "calledClasses_ckjm_ext_moa_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_N" : 1.0,
        "calledClasses_ckjm_ext_lcom_safe" : 1.0,
        "uncalledClasses_ckjm_ext_loc_sum" : 100093.0,
        "calledClasses_ckjm_ext_cam_sum" : 0.25,
        "uncalledClasses_ckjm_ext_wmc_min" : 1.0,
        "uncalledClasses_ckjm_ext_cbo_sum" : 3485.0,
        "sf_complexity_necf" : 5891.0,
        "calledClasses_ckjm_ext_ca_max" : 1.0,
        "uncalledClasses_ckjm_ext_noc_geomean" : 0.0,
        "calledClasses_ckjm_ext_lcom3_mean" : 0.6,
        "uncalledClasses_ckjm_ext_npm_quadmean" : 11.683768559895135,
        "uncalledClasses_ckjm_ext_moa_safe" : 1.0,
        "jmh_thrpt_score_sum" : 228791.26630661395,
        "uncalledClasses_ckjm_ext_dam_geomean" : 0.0,
        "calledClasses_ckjm_ext_mfa_mean" : 0.0,
        "uncalledClasses_ckjm_ext_rfc_N" : 335.0,
        "fs_dynamic" : 1.0,
        "sf_complexity_covered" : 24.0,
        "calledClasses_ckjm_ext_moa_min" : 0.0,
        "calledClasses_ckjm_ext_amc_sum" : 67.5,
        "sf_line_balance" : 293.6909090909091,
        "calledClasses_ckjm_ext_noc_max" : 0.0,
        "uncalledClasses_ckjm_ext_rfc_min" : 1.0,
        "calledClasses_ckjm_ext_dit_estimated_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_cam_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_dam_sum" : 148.24086978052807,
        "entryClass_ckjm_ext_rfc" : 11.0,
        "uncalledClasses_ckjm_ext_dam_mean" : 0.4425100590463525,
        "calledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "calledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom_max" : 11.0,
        "uncalledClasses_ckjm_ext_npm_safe" : 1.0,
        "calledClasses_ckjm_ext_wmc_geomean" : 6.0,
        "uncalledClasses_ckjm_ext_ce_sum" : 1715.0,
        "sf_method_error_prop" : 0.0,
        "entryClass_ckjm_ext_loc" : 413.0,
        "jmh_thrpt_score_geomean" : 228791.26630661375,
        "uncalledClasses_ckjm_ext_cbm_mean" : 1.7641791044776123,
        "uncalledClasses_ckjm_ext_loc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_rfc_max" : 284.0,
        "calledUncalledMethodRatioJava" : 0.004672897196261682,
        "sf_line_covered" : 55.0,
        "calledClasses_ckjm_ext_wmc_N" : 1.0,
        "uncalledClasses_ckjm_ext_dit_mean" : 2.349253731343282,
        "uncalledClasses_ckjm_ext_ce_N" : 335.0,
        "calledClasses_ckjm_ext_cbo_mean" : 2.0,
        "entryClass_ckjm_ext_dam" : 1.0,
        "calledClasses_ckjm_ext_amc_geomean" : 67.5,
        "calledClasses_ckjm_ext_rfc_sum" : 11.0,
        "calledClasses_ckjm_ext_wmc_min" : 6.0,
        "uncalledClasses_ckjm_ext_cbm_geomean" : 0.0,
        "uncalledClasses_ckjm_ext_dit_geomean" : 2.008547367655317,
        "sf_instruction_necf" : 77404.0,
        "calledClasses_ckjm_ext_npm_sum" : 5.0,
        "uncalledClasses_ckjm_ext_cbm_N" : 335.0,
        "calledClasses_ckjm_ext_loc_geomean" : 413.00000000000017,
        "uncalledClasses_ckjm_ext_mfa_safe" : 1.0,
        "calledClasses_ckjm_ext_mfa_min" : 0.0,
        "calledClasses_ckjm_ext_lcom_mean" : 11.0,
        "calledClasses_ckjm_ext_loc_min" : 413.0,
        "uncalledClasses_ckjm_ext_cbm_safe" : 1.0,
        "calledClasses_ckjm_ext_lcom3_safe" : 1.0,
        "calledClasses_ckjm_ext_rfc_safe" : 1.0,
        "calledClasses_ckjm_ext_cbm_quadmean" : 0.0,
        "calledClasses_ckjm_ext_mfa_quadmean" : 0.0,
        "sf_instruction_total" : 77404.0,
        "uncalledClasses_ckjm_ext_cam_quadmean" : 0.4681254145282841,
        "uncalledClasses_ckjm_ext_lcom3_mean" : 1.1125039526443525,
        "calledClasses_ckjm_ext_noc_N" : 1.0,
        "uncalledClasses_ckjm_ext_dit_safe" : 1.0,
        "uncalledClasses_ckjm_ext_noc_sum" : 263.0,
        "calledClasses_ckjm_ext_cbm_N" : 1.0,
        "calledClasses_ckjm_ext_rfc_geomean" : 11.000000000000002,
        "calledClasses_ckjm_ext_moa_N" : 1.0,
        "sf_method_balance" : 993.3333333333334,
        "uncalledClasses_ckjm_ext_amc_quadmean" : 99.06964762233763,
        "uncalledClasses_ckjm_ext_cbm_sum" : 591.0,
        "uncalledClasses_ckjm_ext_dit_sum" : 787.0,
        "uncalledClasses_ckjm_ext_cbo_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_safe" : 1.0,
        "uncalledClasses_ckjm_ext_moa_mean" : 3.1552238805970143,
        "calledClasses_ckjm_ext_dam_safe" : 1.0,
        "calledClasses_ckjm_ext_moa_mean" : 0.0,
        "uncalledClasses_ckjm_ext_moa_sum" : 1057.0,
        "uncalledClasses_ckjm_ext_cam_sum" : 141.3927610973036,
        "calledClasses_ckjm_ext_dit_sum" : 1.0,
        "sf_line_necf" : 16208.0,
        "calledClasses_ckjm_ext_amc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_mfa_N" : 335.0,
        "uncalledClasses_ckjm_ext_lcom_max" : 2518.0,
        "uncalledClasses_numberOfClasses" : 335.0,
        "calledClasses_ckjm_ext_wmc_quadmean" : 6.0,
        "noUncalledMethods" : 3115.0,
        "uncalledClasses_ckjm_ext_dit_estimated_min" : 0.0,
        "calledClasses_ckjm_ext_dit_estimated_sum" : 0.0,
        "calledClasses_ckjm_ext_cam_geomean" : 0.25,
        "uncalledClasses_ckjm_ext_dit_max" : 7.0,
        "uncalledClasses_ckjm_ext_ca_min" : 0.0,
        "sf_line_leanmetric" : 55.0,
        "uncalledClasses_ckjm_ext_dam_N" : 335.0,
        "calledClasses_ckjm_ext_cam_mean" : 0.25,
        "uncalledClasses_ckjm_ext_npm_min" : 0.0,
        "uncalledClasses_ckjm_ext_loc_quadmean" : 545.7354314995773,
        "calledClasses_ckjm_ext_lcom_sum" : 11.0,
        "uncalledClasses_ckjm_ext_lcom_quadmean" : 233.0981728992212,
        "uncalledClasses_ckjm_ext_moa_max" : 127.0,
        "calledClasses_ckjm_ext_lcom_geomean" : 11.000000000000002,
        "entryClass_ckjm_ext_mfa" : 0.0,
        "uncalledClasses_ckjm_ext_dit_estimated_mean" : 0.0,
        "sf_complexity_sf" : 5867.0,
        "uncalledClasses_ckjm_ext_dit_quadmean" : 2.6916121784913565,
        "entryClass_ckjm_ext_cbm" : 0.0,
        "entryClass_ckjm_ext_cbo" : 2.0,
        "calledClasses_ckjm_ext_loc_sum" : 413.0,
        "calledClasses_ckjm_ext_cbm_min" : 0.0,
        "calledClasses_ckjm_ext_lcom3_max" : 0.6,
        "calledClasses_ckjm_ext_cam_min" : 0.25,
        "sf_method_sf" : 2980.0,
        "entryClass_ckjm_ext_amc" : 67.5,
        "uncalledClasses_ckjm_ext_cbo_min" : 1.0,
        "uncalledClasses_ckjm_ext_wmc_safe" : 1.0,
        "uncalledClasses_ckjm_ext_noc_quadmean" : 4.1806233913494895,
        "calledClasses_ckjm_ext_noc_sum" : 0.0,
        "calledClasses_ckjm_ext_dam_min" : 1.0,
        "uncalledClasses_ckjm_ext_wmc_quadmean" : 13.645293322268534,
        "uncalledClasses_ckjm_ext_cbo_geomean" : 6.794089248914486,
        "calledClasses_ckjm_ext_ca_N" : 1.0,
        "calledClasses_ckjm_ext_amc_mean" : 67.5,
        "calledClasses_ckjm_ext_cam_safe" : 1.0,
        "uncalledClasses_ckjm_ext_mfa_sum" : 162.604